实验环境
网络环境
底层系统
系统都为:Red Hat Enterprise Linux release 8.0 (Ootpa)
Ansible安装
需要用到epel源仓库,先安装epel的rpm安装包,然后验证是否启用epel仓库
[root@ansible ~]# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y [root@ansible ~]# dnf repolist epel
开始yum安装ansible
[root@ansible ~]# yum -y install ansible
Ansible相关工具
- ansible 主程序,临时命令执行工具
- ansible-doc 查看配置文档,模块功能查看工具
- ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
- ansible-playbook 定制自动化任务,编排剧本工具
- ansible-vault 文件加密工具
- ansible-pull 远程执行命令的工具
- ansible-console 基于Console界面与用户交互的执行工具
ansible
此工具通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能。
ssh工作准备
第一步,添加被控主机
[root@ansible ~]# vi /etc/ansible/hosts 在最底部添加,其中我定义了一个组webserver,并添加了2个节点 [web1] 192.168.26.2 192.168.26.3 [web2] 192.168.26.4 :wq 保存退出
也可以修改主机清单的存放位置;
Inventory 是 Ansible 管理主机信息的配置文件,相当于系统 Hosts 文件的功能,默认存放在 /etc/ansible/hosts。
在 hosts 文件中,通过分组来组织设备,Ansible 通过 Inventory 来定义主机和分组,通过在 ansible 命令中使用选项-i
或—inventory-file
来指定 Inventory。
[root@ansible ~]# ansible -i /etc/ansible/hosts
第二步,因为是通过ssh实现的功能,所以还需要设置免密登录ssh,不然一次一次输入密码十分的麻烦
[root@ansible ~]# ssh-keygen [root@ansible ~]# ssh-copy-id 192.168.26.2 [root@ansible ~]# ssh-copy-id 192.168.26.3 [root@ansible ~]# ssh-copy-id 192.168.26.4
如果主机数量过多的话,可以通过编写脚本
#!/bin/bash ssh-keygen -f /root/.ssh/id_rsa -P '' NET=192.168.26 export SSHPASS=magedu for IP in {1..200};do sshpass -e ssh-copy-id NET.IP done
正式使用
前面设置完成之后,可以正式开始使用ansible工具了
ansible指令的格式为
ansible <host-pattern> [-m module_name] [-a args]
对应选项说明
- –version #显示版本
- -m module #指定模块,默认为command
- -v #详细过程 –vv -vvv更详细
- –list-hosts #显示主机列表,可简写 –list
- -k, –ask-pass #提示输入ssh连接密码,默认Key验证
- -C, –check #检查,并不执行
- -T, –timeout=TIMEOUT #执行命令的超时时间,默认10s
- -u, –user=REMOTE_USER #执行远程执行的用户
- -b, –become #代替旧版的sudo 切换
- –become-user=USERNAME #指定sudo的runas用户,默认为root
- -K, –ask-become-pass #提示输入sudo时的口令
示例
与所有节点测试网络连通性
[root@ansible ~]# ansible all -m ping
看到了2个节点都为SUCCESS成功,代表连通性没有问题,之后SUCCESS将会一直出现,代表成功的意思
且颜色代表更直观的变化:
- 绿色:执行成功并且不需要做改变的操作;
- 黄色:执行成功并且对目标主机做变更;
- 红色:执行失败;
还需要知道常用的正则表达式中的通配符
*:通配符 代表所有
[root@ansible ~]# ansible "*" -m ping [root@ansible ~]# ansible 192.168.26.* -m ping
或关系
[root@ansible ~]# ansible "192.168.26.3:192.168.26.4" -m ping # 表示测试192.168.26.3或者192.168.26.4节点的连通性,双引号内也可以填入组名 [root@ansible ~]# ansible 'web1:web2' -m ping
逻辑与
[root@ansible ~]# ansible "web1:&web2" –m ping # 表示测试在web1组并且在web2组中的主机的连通性
逻辑非
[root@ansible ~]# ansible 'web1:!web2' –m ping # 表示测试在web1组,但不在web2组中的主机的连通性
使用示例
[root@ansible ~]# ansible all -m ping -u test -k #以test用户执行ping存活检测 [root@ansible ~]# ansible all -m ping -u test -k -b #以test sudo至root执行ping存活检测 [root@ansible ~]# ansible all -m ping -u test -k -b --become-user=mage #以test sudo至mage用户执行ping存活检测 [root@ansible ~]# ansible all -m command -u test -a 'ls /root' -b --become-user=root -k -K #以test sudo至root用户执行ls
ansible-doc
此工具用来显示模块帮助,相关格式:
ansible-doc [options] [module...] 选项说明: -l, --list #列出可用模块 -s, --snippet #显示指定模块的playbook片段
示例
[root@ansible ~]# ansible-doc -l 列出所有模块 [root@ansible ~]# ansible-doc -s ping 查看ping模块的相关用法
ansible-galaxy
此工具会连接 https://galaxy.ansible.com 下载相应的roles
示例
[root@ansible ~]# ansible-galaxy list #列出所有已安装的galaxy [root@ansible ~]# ansible-galaxy install test.mysql [root@ansible ~]# ansible-galaxy install test.redis #安装galaxy [root@ansible ~]# ansible-galaxy remove test.redis #删除galaxy
ansible-playbook
此工具用于执行编写好的 playbook (剧本)任务,yml文件,可以理解为脚本,后续会仔细讲解
示例
ansible-playbook hello.yml cat hello.yml --- #hello world yml file - hosts: web1 remote_user: root tasks: - name: hello world command: /usr/bin/wall hello world
ansible-vault
此工具可以用于加密解密yml文件
格式:
ansible-vault [options]
选项参数:
create #创建新文件
decrypt #解密
edit #编辑加密文件
encrypt #加密
rekey #修改口令
view #查看
示例
[root@ansible ~]# ansible-vault encrypt hello.yml 加密hello.yml剧本
ansible-pull
这和通常使用的push模式工作机理刚好相反,其适用于以下场景:①你有数量巨大的机器需要配置,即使使用高并发线程依旧要花费很多时间;②你要在刚启动的、没有网络连接的主机上运行Anisble。
格式
- ansible-pull [options] [playbook.yml]
选项参数:
-C #分支
-d #目的地
-i #主机路径
-e #添加参数
-o #只有git仓库发生改变才执行playbook
通过ansible-pull结合Git和crontab一并实现,其原理如下:通过crontab定期拉取指定的Git版本到本地,并以指定模式自动运行预先制订好的指令。
示例
*/20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/ -i /etc/ansible/hosts -U git:// git.kingifa.com/king-gw-ansiblepull >> /var/log/ansible-pull.log 2>&1
ansible-console
此工具可交互执行命令,支持tab,ansible 2.0+新增
格式:
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
常用的子命令:
- 设置并发数: forks n 例如: forks 10
- 切换组: cd 主机组 例如: cd web
- 列出当前组主机列表: list
- 列出所有的内置命令: ?或help
示例
root@all (3)[f:5]$ list 192.168.26.2 192.168.26.3 192.168.26.4 root@all (3)[f:5]$ cd web1 root@web1 (2)[f:5]$ list 192.168.26.2 192.168.26.3 root@web1 (2)[f:5]$ forks 10 root@web1 (2)[f:10]$ cd web2 root@web2 (1)[f:10]$ yum name=httpd state=present root@web2 (2)[f:5]$ service name=httpd state=started