简介
GitHub地址:https://github.com/ansible/ansible
Ansible 是一个基于 Python 开发的自动化运维工具。它可以实现配置管理、应用程序部署、网络自动化和多节点编排等功能。还可以使用负载均衡器轻松进行复杂的更改,例如滚动更新。
·
工作原理
在 Ansible 管理体系中,包含管理节点和被管理节点两种角色,被管理节点通常被称为"资产",主要通过 SSH 来实现控制,不需要安装 Agent。
Ansible 本身没有批量部署的能力,真正批量部署的是 Ansible 所运行的模块,而 Ansible 只是提供一种框架。
·
工作流程
读取 ansible.cfg 配置文件 --->>
通过规则过滤管理主机清单(inventory)中定义的主机列表 --->>
加载任务(task)对应的模块 --->>
将模块或命令打包成 python 脚本文件 --->>
将这些脚本文件传输至被管理节点(用户家目录的.ansible/tmp/临时目录/临时文件.py) --->>
被管理节点为这些脚本增加执行权限 --->>
被管理节点执行这些脚本 --->>
返回结果给控制节点 --->>
退出并删除临时文件
PS: 通过调试命令可以获得这些执行流程信息。例如:
[root@wpf ~]# ansible wpf002 -i test_inventory.ini -m ping -vvv
#最多支持5个v,一般三个v就可以了。
·
命令行语法
ansible <pattern_goes_here> -m <module_name> -a <arguments>
module_name:模块名。默认不指定时,使用的是 command 模块。
arguments:模块参数。
pattern_goes_here:资产选择器(Patterns)决定了我们要管理哪个主机,意思是与哪些主机进行交互。资产选择器(Patterns)支持的格式:
- all
- *
- IP(支持通配符。例如:192.168.1.1*)
- 主机名(支持通配符。例如:wpf00*)
- 组
- 组1:组2(多个组之间用冒号分隔)
- 组1:&组2(取两个组的交集)
- 组1:!组2(存在于组1,并且不存在于组2)
- …
·
安装
PS: 只用管理节点安装就可以。
环境依赖:Python >= 2.6
[root@wpf ~]# python -V Python 2.7.5
·
YUM安装
yum -y install epel-release
yum -y install ansible
·
PIP安装
yum -y install epel-release
yum -y install python2-pip
pip install ansible
·
配置
选择配置 /etc/ansible/ansible.cfg
inventory = /etc/ansible/hosts #资源清单 inventory 文件的位置。
library = /usr/share/ansible #指向存放 Ansible 模块的目录。多个目录用冒号隔开。
forks = 5 #并发连接数(默认为 5)。
sudo_user = root #设置默认执行命令的用户。
remote_port = 22 #指定连接被管节点的管理端口(默认为 22)。
host_key_checking = False #设置是否检查 SSH 主机的密钥。值为 False 表示第一次 ssh 远程时不需要 yes 确认。
timeout = 60 #设置 SSH 连接的超时时间(单位 秒)。
log_path = /var/log/ansible.log #指定一个存储 ansible 日志的文件(默认不记录日志)。
·
配置分组
cat << EOF >> /etc/ansible/hosts
[wpf]
wpf[002:004]
EOF
验证一:显示被管理节点
ansible wpf --list-hosts
#或
ansible all --list-hosts
验证二:测试是否能连通
ansible all -m ping
·
配置子组
cd /etc/ansible
vim hosts
[wpf1]
wpf[002:003]
[wpf2]
wpf004
[wpf_all:children] #指定的子组必须存在。
wpf1
wpf2
·
自定义资产
使用 -i 指定自定义资产
·
第一种:指定资产列表
ansible all -i 192.168.1.254,192.168.1.231 -m ping -k
# -i 选项在这里指定的是一个列表。
假如只指定一个资产时,后面必须加逗号。例如:
ansible all -i 192.168.1.254, -m command -a 'date' -k
# -k 选项指的是使用密码管理,下面会说到。
·
第二种:自定义资产列表文件
vim test_inventory.ini
192.168.1.191
192.168.1.[182:185]
[wpf1]
wpf[002:003]
[wpf2]
wpf004
[wpf_all:children]
wpf1
wpf2
验证:查看
[root@wpf ansible]# ansible all -i test_inventory.ini --list-hosts
hosts (9):
192.168.1.191
192.168.1.182
192.168.1.183
192.168.1.184
192.168.1.185
wpf002
wpf003
wpf004`
[root@wpf ansible]# ansible wpf_all -i test_inventory.ini --list-hosts
hosts (3):
wpf002
wpf003
wpf004`
[root@wpf ansible]# ansible wpf1 -i test_inventory.ini --list-hosts
hosts (2):
wpf002
wpf003`
或者
[root@wpf ansible]# ansible wpf002,wpf004 -i test_inventory.ini -a date -k
SSH password:
wpf002 | CHANGED | rc=0 >>
Sat Feb 20 16:19:09 CST 2021
wpf004 | CHANGED | rc=0 >>
Sat Feb 20 16:19:09 CST 2021
[root@wpf ansible]# ansible wpf002 -i test_inventory.ini -a date -k
SSH password:
wpf002 | CHANGED | rc=0 >>
Sat Feb 20 16:19:21 CST 2021`
·
使用密码管理节点
PS: 结合后面介绍的资产变量可以更好的理解。
·
第一种:将用户/密码信息写入配置文件(不安全,不建议使用)
cd /etc/ansible
vim hosts
[wpf]
wpf[002:004] ansible_ssh_user="root" ansible_ssh_pass="123456" ansible_ssh_port=22
或者
cd /etc/ansible
vim hosts
[wpf1]
wpf[002:003]
[wpf2]
wpf004
[wpf_all:children]
wpf1
wpf2
[wpf_all:vars]
ansible_ssh_user="root"
ansible_ssh_pass="123456"
ansible_ssh_port=22
·
第二种:执行命令时,指定用户/密码信息
ansible all -u ceshi -k -m command -a date
# -u:指定用户,默认是root。
# -k 选项是指使用密码。需要保证指定多个被控制节点的密码相同。
·
配置 SSH 信任
管理节点生成证书
ssh-keygen -t rsa -f /root/.ssh/id_rsa
# -t:指定秘钥类型。包括 RSA 和 DSA 两种
# -f:指定秘钥文件名。尤其在更新秘钥文件时避免覆盖旧秘钥时使用。
批量配置被管理节点
ansible all -m authorized_key -a "user=root exclusive=true manage_dir=true key='$(cat /root/.ssh/id_rsa.pub)'" -k
user:远端服务器上的用户。
exclusive:是否移除 authorized_keys 文件中其它非指定 key。默认为 False。
key:公钥。可以是字符串或url(https://github.com/username.keys)
state:添加/移除指定 key。默认为 present。
- present:添加指定key到authorized_keys文件中。
- absent:从authorized_keys文件中移除指定key。
·
测试:
#所有
ansible all -m command -a 'date'
#wpf1组
ansible wpf1 -m command -a 'date'
#指定资产
ansible all -i wpf002,wpf004 -m command -a 'date'