Python项目实战——Ansible自动化任务(1)(ansible的介绍和部署)

一、自动化任务执行的意义

1.1 什么是自动化执行任务?

假设我们要在10台Linux服务器上安装一个Nginx服务, 手动是如何操作的?
第一步: ssh登录Linux(1,2,3...10)服务器
第二步: 输入对应服务器密码
第三步: 执行命令yum install nginx
第四步: 执行命令systemctl start nginx
第五步: 退出登录
循环执行前面的操作,直到10台服务器的Nginx服务部署完成。
解决方案:登录哪些服务器;执行哪些命令;自动化程序

1.2 自动化执行的意义
提升运维工作效率, 减少一份工作成本
提高准确度, 手工部署易出错

1.3 自动化任务执行的应用
应用一: 批量命令执行
应用二: 定时任务
应用三: 批量程序应用服务安装
应用四: 批量配置文件同步
应用五: 批量代码部署

二、 Ansible安装与基础

2.1 什么是Ansible?

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架。Ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远 程主机通讯的。Ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

2.2 Ansible的特点

Ansible是Python语言实现的一套完整的自动化任务执行模块。
Ansible的play book模式, 采用yaml配置,对于自动化任务执行一目了然
部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作
默认使用SSH协议对设备进行管理
Ansible自动化场景支持丰富(大量常规运维操作模块),实现日常绝大部分操作
配置简单、功能强大、扩展性强
支持API及自定义模块,可通过Python轻松扩展
通过Playbooks来定制强大的配置、状态管理
轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台

2.3 Ansible的安装

方法一: 通过系统的方式: yum和apt-get等
方法二: 通过python的方式安装

#通过Python安装
pip3 install ansible -i https://pypi.douban.com/simple

#安装完成后检验版本
ansible --version

2.4 Ansible的配置文件

需要创建的配置文件有:

mkdir /etc/ansible
cd /etc/ansible
touch ansible.cfg
touch hosts 

2.4.1 Ansible配置文件位置的设置

ansible与我们其他的服务在这一点上有很大不同,Ansible的配置文件查找是从多个地方找的。

export ANSIBLE_CONFIG=/etc/ansible/ansible.cfg
env

2.4.2 Ansible配置文件

ansible 的配置文件为/etc/ansible/ansible.cfg ,ansible 有许多参数,下面我们列出一些常见的参数:

# 资源清单inventory文件的位置
inventory = /etc/ansible/hosts
# 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
library = /usr/share/ansible
# 并发连接数,默认为5
forks = 5
# 设置默认执行命令的用户
sudo_user = root
# ssh连接的管理端口,默认为22端口,建议修改,更加安全
remote_port = 22
# 设置是否检查SSH主机的密钥,值为True/False。
host_key_checking = False
# 设置SSH连接的超时时间,单位为秒
timeout = 60
# 存储ansible日志的文件(默认不记录日志)
log_path = /var/log/ansible.log

2.4.3 Ansible主机清单详解

(1)简单的配置:在配置文件中,我们提到了资源清单,这个清单就是我们的主机清单,里面保存的是一些 ansible 需要连接管理的主机列表

vim /etc/ansible/hosts  写入下面内容
[test]  ansible要操作的对象
172.25.254.20:22 ansible_ssh_user=root ansible_ssh_pass='123'  指定IP地址 用户 用户密码
192.168.0.20:22 ansible_ssh_user=root ansible_ssh_pass='123'

 注意上述的内容可以根据自己的需求来写。

(2)想要远程ssh连接,有三种方式:

方式一:

# vim /etc/ansible/hosts
# ssh用户名+ssh用户密码
[test]
172.25.254.20 ansible_ssh_user=root ansible_ssh_pass='主机密码'

方式二:密钥实现远程ssh连接

1). 生成并配置ssh公钥和私钥, 如何免密登录, 快速操作如下:

# 生成公钥和私钥, 存储位置~/.ssh/目录下
$ ssh-keygen
# 将生成的公钥拷贝到需要远程登录的服务器上
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@需要登录的远程主机
# 测试能否远程无密码登录
ssh root@需要登录的远程主机

2). 编辑Ansible的配置文件

# vim /etc/ansible/hosts
# ssh用户名+ssh密钥
[test]
172.25.254.20 ansible_ssh_user=root ansible_ssh_private_key_file=密钥文件的
路径

3). 执行测试

$ ansible all -a 'date'

方式三:别名实现远程ssh连接

# vim /etc/ansible/hosts
# 别名+ssh用户名+ssh密钥
[test]
test1 ansible_ssh_host=47.92.255.98 ansible_ssh_port=22
ansible_ssh_user=root ansible_ssh_private_key_file=密钥文件的路径

三、Ansible ad-hoc模式

3.1 什么是ad-hoc模式?

Ad-Hoc简而言之是“临时命令”.Ansible提供两种完成任务方式:Ad-Hoc模式,即命令集,适合解决一些简单或者平时工作中临时遇到的任务。PlayBook模式, 即Ansible-playbook剧本,适合解决复杂或需固化下来的任务。

3.2 ad-hoc模式使用场景

场景一: 在多台电脑上,查看某个进程是否启动。
场景二: 在多台机器上, 拷贝指定日志文件到本地。
场景三: 检查proxy主机组的所有主机是否存活。
场景四: 在多台机器上, 查看proxy主机组所有主机的磁盘容量。等等

3-3 ad-hoc模式的命令使用

ansible <host-pattern> [options]
#host-pattern:用于匹配主机名或者主机组名
#option: 包含执行的模块和执行的命令参数,

3-4 ad-hoc模式的常用模块

(1)主机连通性测试

[root@client Desktop]# ansible test  -m ping 
192.168.0.20 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
172.25.254.20 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

(2)command 模块

 这个模块可以直接在远程主机上执行命令,并将结果返回本主机。 命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如"<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能)。注意,该命令不支持| 管道命令

[root@client Desktop]# ansible test -m command -a 'ss -ntl'
192.168.0.20 | CHANGED | rc=0 >>
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port    
LISTEN   0         10            192.168.122.1:53               0.0.0.0:*       
LISTEN   0         10             192.168.0.20:53               0.0.0.0:*       
LISTEN   0         10            172.25.254.20:53               0.0.0.0:*       
LISTEN   0         10                127.0.0.1:53               0.0.0.0:*       
LISTEN   0         128                 0.0.0.0:22               0.0.0.0:*       
LISTEN   0         5                 127.0.0.1:631              0.0.0.0:*       
LISTEN   0         100               127.0.0.1:25               0.0.0.0:*       
LISTEN   0         128               127.0.0.1:953              0.0.0.0:*       
LISTEN   0         128                 0.0.0.0:111              0.0.0.0:*       
LISTEN   0         10                    [::1]:53                  [::]:*       
LISTEN   0         128                    [::]:22                  [::]:*       
LISTEN   0         5                     [::1]:631                 [::]:*       
LISTEN   0         100                   [::1]:25                  [::]:*       
LISTEN   0         128                   [::1]:953                 [::]:*       
LISTEN   0         80                        *:3306                   *:*       
LISTEN   0         128                    [::]:111                 [::]:*       
LISTEN   0         128                       *:80                     *:*       
172.25.254.20 | CHANGED | rc=0 >>

3)shell 模块

shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。

[root@client Desktop]# ansible test -m shell -a 'cat /etc/passwd | grep "root"'
172.25.254.20 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
192.168.0.20 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

(4)copy 模块

这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等

① 复制文件:

[root@client Desktop]# ansible test -m copy -a 'src=/etc/passwd dest=/mnt'
172.25.254.20 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "checksum": "33929b98cf1d165467b5b62be3b7ac813d5b65d2",
    "dest": "/mnt/passwd",
    "gid": 0,
    "group": "root",
    "md5sum": "6fc5949596db5741544ae8b47759eacd",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:mnt_t:s0",
    "size": 2807,
    "src": "/root/.ansible/tmp/ansible-tmp-1596274212.7856452-9940-123839584318193/source",
    "state": "file",
    "uid": 0
}

② 给定内容生成文件,并制定权限

[root@client Desktop]# ansible test -m copy -a 'content="hello world" dest=/mnt/file22 mode=666'
172.25.254.20 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "checksum": "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed",
    "dest": "/mnt/file22",
    "gid": 0,
    "group": "root",
    "md5sum": "5eb63bbbe01eeed093cb22bb8f5acdc3",
    "mode": "0666",
    "owner": "root",
    "secontext": "system_u:object_r:mnt_t:s0",
    "size": 11,
    "src": "/root/.ansible/tmp/ansible-tmp-1596274341.1756465-10845-58400519655201/source",
    "state": "file",
    "uid": 0
}

5)yum 模块

 顾名思义,该模块主要用于软件的安装。

[root@server ~]# ansible test -m yum -a 'name=httpd state=present'

(6)service 模块

该模块用于服务程序的管理

① 开启服务并设置自启动

[root@server ~]# ansible web -m service -a 'name=nginx state=started enabled=true' 

② 关闭服务

[root@server ~]# ansible web -m service -a 'name=nginx state=stopped'

(6)需求

需求1: 主机连通性测试(ping模块)
需求2: 查看主机root用户的详细信息(shell模块)
需求3: 备份主机的日志文件/var/log/messages到/mnt/目录(copy模块)
需求4: 给定文件内容"hello ansible"生成文件/mnt/ansible,并指定权限为666(copy模块)
需求5: 主机批量安装软件gcc和nginx(yum模块)
需求6: 启动nginx服务(service模块)和判断nginx的80端口是否打开(shell模块-ss -ntl)
需求7: 主机新建uid=8888的用户user1
需求8: 拉取Github项目项目到主机并部署(git模块)
需求9:搜集主机信息并筛选与内存Memory相关的信息(setup模块)

猜你喜欢

转载自blog.csdn.net/weixin_43215948/article/details/107701996