Ansible介绍
Ansible 和 SaltStack、Puppet 等都是配置管理系统(configuration management system)
Ansible 和 SaltStack 都是 Python 编译的自动化运维工具,都是使用模块管理。不同的是Ansible没有客户端(使用的 SSH 通道传输)而 SaltStack 有客户端(虽然 SaltStack 也可以用 SSH通道,但和 Ansible 相比就是个笑话),这方面各有优点吧,有客户端的更稳定,没有客户端的更灵活可移植性强
相比 Puppet 来说 Ansible 没有客户端(使用的 SSH 通道传输)、简单易用和日志集中控管
Ansible 可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在100台服务器上安装 NFS 服务,并在安装后启动服务。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。
这些场景中我们都可以使用到 Ansible。
Ansible 特点
- Ansible 不需要单独安装客户端,SSH 相当于 Ansible 客户端。
- Ansible 可以在配置文件里面记录 SSH 账号密码方式也可以使用密钥对方式连接。
- Ansible 不需要启动任何服务,仅需安装对应工具即可。
- Ansible 依赖大量的 Python 模块来实现批量管理。
Ansible 架构
Ansible 是用模块来管理的,而模块是 Python 写的,这就需要控制端和受控端都需要有 Python,这对于 LInux 不是问题
- 主机清单(HostInventory):记录由Ansible管理的主机信息,包括端口、密码、ip等。并进行逻辑上分组。
- Ab-Hoc(命令行):通过命令行调用模块管理受控端
- Playbooks(剧本):YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
- CoreModules(核心模块):主要操作是通过调用核心模块来完成管理任务
- CustomModules(自定义模块):完成核心模块无法完成的功能,支持多种语言
- plugins(插件):完成模块功能的补充
- ConnectionPlugins(连接插件):用于连接主机,用来连接被管理端
Ansible配置
YUM 安装 Ansible
Ansible 包在
epel
库,部分依赖在base
库
[root@Ansible ~]# yum install ansible -y
## 查看Ansible版本信息(版本号低的,看看epel源有吗)
[root@Ansible ~]# ansible --version
ansible 2.7.10
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
上面指定了 Ansible 的配置文件位置,不过 Ansible 为了方便,也为了可移植性,配置文件不是固定的,下面根据先后顺序读取:
- 变量
$ANSIBLE_CONFIG
信息 - 当前目录
ansible.cfg
文件 - 当前用户的家目录
ansible.cfg
文件 /etc/ansible/ansible.cfg
文件
常用配置
[defaults] #通用默认配置
inventory /etc/ansible/hosts #被控制端IP或者DNS列表
library = /usr/share/my_modules/ ##默认搜寻模块的位置
remote_tmp = ~/.ansible/tmp #远程执行临时文件
local_tmp = ~/.ansible/tmp
plugin_filters_cfg = /etc/ansible/plugin_filters.yml
forks = 5 ##并行线程数
poll_interval = 15 ##回频率或轮询间隔时间
sudo_user = root ##sudo远程执行用户名
ask_sudo_pass = True ##使用sudo,是否需要输入密码
ask_pass = True ##是否需要输入密码
transport = smart ##通信机制
remote_port = 22 ##远程SSH端口
module_lang = C ##模块和系统之间通信的语言
module_set_locale = False
gathering = implicit ##控制默认facts收集(远程系统变量)
gather_subset = all
gather_timeout = 10
roles_path = /etc/ansible/roles ##使用playbook搜索Ansible roles
host_key_checking = False ##是否检查远程公钥指纹
sudo_exe = sudo ##sudo远程执行命令
sudo_flags = -H -S -n ##传递sudo之外的参数
timeout = 10 ##SSH超时时间
remote_user = root ##远程登录用户名
log_path = /var/log/ansible.log ##日志文件存放路径
module_name = command ##Ansible命令默认执行的模块
executable = /bin/sh ##执行的shell环境,用户shell模块
hash_behaviour = replace ##特定的优先级覆盖变量
jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 ##允许开启jinja2扩展模块
private_key_file = /path/to/file ##私钥文件存储位置
display_skipped_hosts = True ##显示跳过任何任务的状态
system_warnings = True ##禁用系统运行Ansible潜在问题警告
deprecation_warnings = True ##PlayBook输出禁用“不建议使用”警告
command_warnings = False ##command模块Ansible默认发出警告
nocolor = 1 ##输出带上颜色区别,0表示开启,1表示关闭
pipelining = False ##开启pipe SSH通道优化
[accelerate] ##accelerate缓存加速
accelerate_port = 5099 ##加速连接端口5099
accelerate_timeout = 30 ##命令执行超过时间,单位为s
accelerate_connect_timeout = 5.0 ##上一个活动连接的时间,单位为min
accelerate_daemon_timeout = 30 ##允许多个私钥被加载到daemon
accelerate_multi_key = yes ##任何客户端想要连接daemon都要开启这个选项
主机清单
## 添加客户主机信息,client清单下两台主机(IP,用户,密码,端口)
[root@Ansible ~]# vim /etc/ansible/hosts
[client]
192.168.1.2 ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22'
192.168.1.3 ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22'
验证 Ansible
可以把配置文件中 host_key_checking = False
注释去掉,防止第一次 SSH
连通需要公钥指纹导致的 Ansible
的连通失败
## 用ping模块测试主机是否连通
[root@Ansible ~]# ansible client -m ping
192.168.1.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
## -m:调用什么模块。-a:执行什么动作
[root@Ansible ~]# ansible client -m command -a "df -h"
192.168.1.2 | CHANGED | rc=0 >>
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 3.1G 14G 18% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 7.8M 480M 2% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 1014M 173M 842M 18% /boot
tmpfs 98M 0 98M 0% /run/user/0
192.168.1.3 | CHANGED | rc=0 >>
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 3.1G 14G 18% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 7.7M 480M 2% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 1014M 173M 842M 18% /boot
tmpfs 98M 0 98M 0% /run/user/0
使用密钥对连接
## 创建密钥对
[root@Ansible ~]# ssh-keygen -t rsa
## 发送到相应的主机上
[root@Ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.2
[root@Ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.3
## 删除配置文件IP后面的账号密码
[root@Ansible ~]# vim /etc/ansible/hosts
[client]
192.168.1.2
192.168.1.3
## 连接测试
[root@Ansible ~]# ansible client -m command -a "hostname"
192.168.1.3 | CHANGED | rc=0 >>
Client2
192.168.1.2 | CHANGED | rc=0 >>
Client1
组可以包括其他组
## 重新定义主机清单(组调用其他组在组名后面加上:children)
[root@Ansible ~]# vim /etc/ansible/hosts
[web]
192.168.1.2
[nfs]
192.168.1.3
[local]
localhost ansible_connection=local
[hosts:children]
web
nfs
local
## 执行命令测试连通性
[root@Ansible ~]# ansible web --list-host
hosts (1):
192.168.1.2
[root@Ansible ~]# ansible nfs --list-host
hosts (1):
192.168.1.3
[root@Ansible ~]# ansible local --list-host
hosts (1):
localhost
[root@Ansible ~]# ansible hosts --list-host
hosts (3):
192.168.1.2
192.168.1.3
localhost
## Ansible自带一个all组,为全部主机
[root@Ansible ~]# ansible all --list-host
hosts (3):
192.168.1.2
192.168.1.3
localhost
用别名代替IP
## 编辑文件
[root@Ansible ~]# vim /etc/ansible/hosts
[web]
web1 ansible_ssh_host=192.168.1.2
[nfs]
nfs1 ansible_ssh_host=192.168.1.3
[local]
localhost ansible_connection=local
[hosts:children]
web
nfs
local
## 列出所有主机
[root@Ansible ~]# ansible hosts --list-host
hosts (3):
web1
localhost
nfs1
用 -i
指定文件
[root@Ansible ~]# vim hosts
[client]
192.168.1.2
192.168.1.3
[root@Ansible ~]# ansible client -m command -a "w" -i ./hosts
192.168.1.2 | CHANGED | rc=0 >>
20:08:04 up 14:03, 2 users, load average: 0.00, 0.04, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.1.1 20:08 0.00s 0.14s 0.00s w
root pts/1 192.168.1.254 14:04 6:28 0.38s 0.38s -bash
192.168.1.3 | CHANGED | rc=0 >>
20:08:04 up 14:02, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.1.1 20:08 0.00s 0.14s 0.00s w
root pts/1 192.168.1.254 14:42 1:06m 0.43s 0.43s -bash