简介

Ansible 是一个基于 Python 开发的自动化运维工具。它可以实现配置管理、应用程序部署、网络自动化和多节点编排等功能。还可以使用负载均衡器轻松进行复杂的更改,例如滚动更新.
工作原理
在 Ansible 管理体系中,包含管理节点和被管理节点两种角色,被管理节点通常被称为”资产”,主要通过 SSH 来实现控制,不需要安装 Agent。

工作原理

在 Ansible 管理体系中,包含管理节点和被管理节点两种角色,被管理节点通常被称为”资产”,主要通过 SSH 来实现控制,不需要安装 Agent。
Ansible 本身没有批量部署的能力,真正批量部署的是 Ansible 所运行的模块,而 Ansible 只是提供一种框架。image.png

工作流程

  • 读取 ansible.cfg 配置文件 —->>
  • 通过规则过滤管理主机清单(inventory)中定义的主机列表 —->>
  • 加载任务(task)对应的模块 —->>
  • 将模块或命令打包成 python 脚本文件 —->>
  • 将这些脚本文件传输至被管理节点(用户家目录的.ansible/tmp/临时目录/临时文件.py) —->>
  • 被管理节点为这些脚本增加执行权限 —->>
  • 被管理节点执行这些脚本 —->>
  • 返回结果给控制节点 —->>
  • 退出并删除临时文件

    通过调试命令可以获得这些执行流程信息。例如:

  1. [root@wpf ~]# ansible wpf002 -i test_inventory.ini -m ping -vvv
  2. #最多支持5个v,一般三个v就可以了。

命令行语法

  1. ansible <pattern_goes_here> -m <module_name> -a <arguments>
  • module_name:模块名。默认不指定时,使用的是 command 模块。
  • arguments:模块参数。
  • pattern_goes_here:资产选择器(Patterns)决定了我们要管理哪个主机,意思是与哪些主机进行交互。资产选择器(Patterns)支持的格式。

    all

    IP(支持通配符。例如:192.168.1.1
    )
    主机名(支持通配符。例如:web00*)

    组1:组2(多个组之间用冒号分隔)
    组1:&组2(取两个组的交集)
    组1:!组2(存在于组1,并且不存在于组2)

安装

只用管理节点安装就可以

环境依赖:Python >= 2.6

  1. [root@wpf ~]# python -V Python 2.7.5

YUM安装

  1. yum -y install epel-release
  2. yum -y install ansible

PIP安装

  1. yum -y install epel-release
  2. yum -y install python2-pip
  3. pip install ansible

配置

选择配置 /etc/ansible/ansible.cfg

  1. inventory = /etc/ansible/hosts #资源清单 inventory 文件的位置。
  2. library = /usr/share/ansible #指向存放 Ansible 模块的目录。多个目录用冒号隔开。
  3. forks = 5 #并发连接数(默认为 5)。
  4. sudo_user = root #设置默认执行命令的用户。
  5. remote_port = 22 #指定连接被管节点的管理端口(默认为 22)。
  6. host_key_checking = False #设置是否检查 SSH 主机的密钥。值为 False 表示第一次 ssh 远程时不需要 yes 确认。
  7. timeout = 60 #设置 SSH 连接的超时时间(单位 秒)。
  8. log_path = /var/log/ansible.log #指定一个存储 ansible 日志的文件(默认不记录日志)。

配置分组

  1. cat << EOF >> /etc/ansible/hosts
  2. [wpf]
  3. wpf[002:004]
  4. EOF

验证一:显示被管理节点

  1. ansible wpf --list-hosts
  2. #或
  3. ansible all --list-hosts

验证二:测试是否能连通

  1. ansible all -m ping

配置子组

  1. cd /etc/ansible
  2. vim hosts
  3. [wpf1]
  4. wpf[002:003]
  5. [wpf2]
  6. wpf004
  7. [wpf_all:children] #指定的子组必须存在。
  8. wpf1
  9. wpf2

自定义资产

使用 -i 指定自定义资产

第一种:指定资产列表

  1. ansible all -i 192.168.1.254,192.168.1.231 -m ping -k
  2. # -i 选项在这里指定的是一个列表。

假如只指定一个资产时,后面必须加逗号。例如:

  1. ansible all -i 192.168.1.254, -m command -a 'date' -k
  2. # -k 选项指的是使用密码管理,下面会说到。

第二种:自定义资产列表文件

  1. vim test_inventory.ini
  2. 192.168.1.191
  3. 192.168.1.[182:185]
  4. [wpf1]
  5. wpf[002:003]
  6. [wpf2]
  7. wpf004
  8. [wpf_all:children]
  9. wpf1
  10. wpf2

验证:查看

  1. [root@wpf ansible]# ansible all -i test_inventory.ini --list-hosts
  2. hosts (9):
  3. 192.168.1.191
  4. 192.168.1.182
  5. 192.168.1.183
  6. 192.168.1.184
  7. 192.168.1.185
  8. wpf002
  9. wpf003
  10. wpf004`
  11. [root@wpf ansible]# ansible wpf_all -i test_inventory.ini --list-hosts
  12. hosts (3):
  13. wpf002
  14. wpf003
  15. wpf004`
  16. [root@wpf ansible]# ansible wpf1 -i test_inventory.ini --list-hosts
  17. hosts (2):
  18. wpf002
  19. wpf003`

或者

  1. [root@wpf ansible]# ansible wpf002,wpf004 -i test_inventory.ini -a date -k
  2. SSH password:
  3. wpf002 | CHANGED | rc=0 >>
  4. Sat Feb 20 16:19:09 CST 2021
  5. wpf004 | CHANGED | rc=0 >>
  6. Sat Feb 20 16:19:09 CST 2021
  7. [root@wpf ansible]# ansible wpf002 -i test_inventory.ini -a date -k
  8. SSH password:
  9. wpf002 | CHANGED | rc=0 >>
  10. Sat Feb 20 16:19:21 CST 2021`

使用密码管理节点

结合后面介绍的资产变量可以更好的理解

第一种:将用户/密码信息写入配置文件(不安全,不建议使用)

  1. cd /etc/ansible
  2. vim hosts
  3. [wpf]
  4. wpf[002:004] ansible_ssh_user="root" ansible_ssh_pass="123456" ansible_ssh_port=22

或者

  1. cd /etc/ansible
  2. vim hosts
  3. [wpf1]
  4. wpf[002:003]
  5. [wpf2]
  6. wpf004
  7. [wpf_all:children]
  8. wpf1
  9. wpf2
  10. [wpf_all:vars]
  11. ansible_ssh_user="root"
  12. ansible_ssh_pass="123456"
  13. ansible_ssh_port=22

第二种:执行命令时,指定用户/密码信息

  1. ansible all -u ceshi -k -m command -a date
  2. # -u:指定用户,默认是root。
  3. # -k 选项是指使用密码。需要保证指定多个被控制节点的密码相同。

配置 SSH 信任

管理节点生成证书

  1. ssh-keygen -t rsa -f /root/.ssh/id_rsa
  2. # -t:指定秘钥类型。包括 RSA 和 DSA 两种
  3. # -f:指定秘钥文件名。尤其在更新秘钥文件时避免覆盖旧秘钥时使用。

批量配置被管理节点

  1. 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。

测试:

  1. #所有
  2. ansible all -m command -a 'date'
  3. #wpf1组
  4. ansible wpf1 -m command -a 'date'
  5. #指定资产
  6. ansible all -i wpf002,wpf004 -m command -a 'date'