简介

GitHub地址:https://github.com/ansible/ansible

Ansible 是一个基于 Python 开发的自动化运维工具。它可以实现配置管理、应用程序部署、网络自动化和多节点编排等功能。还可以使用负载均衡器轻松进行复杂的更改,例如滚动更新。

·

工作原理

在 Ansible 管理体系中,包含管理节点和被管理节点两种角色,被管理节点通常被称为"资产",主要通过 SSH 来实现控制,不需要安装 Agent。

Ansible 本身没有批量部署的能力,真正批量部署的是 Ansible 所运行的模块,而 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'