首先什么是ansible呢?
前言
Ansible是一个开源 的基于openssh的自动化配置管理工具。可以用它来配置系统,部署软件和编排更高级的IT任务,比如持续部署或零停机更新。Ansible的主要目标是简单和易用,通过Ansible可以批量管理大型运维环境。
Ansible 是一个用 Python 开发的自动化运维工具,它能执行批量系统配置、批量程序部署、批量运行命令等任务,还能执行如零宕机时间的滚动更新等高级任务。Ansible 本身是一个执行框架,真正执行运维任务的是它的诸多模块。
简单来说,当我们每天重复去对受管主机进行多项维护时,在shall里使用命令行的操作方式会很繁琐,使用playbook就会大大减小运维人员的工作量。
实验环境
一、实验准备(准备两台或者两台以上虚拟机)
建议初学者还是先从两到三台虚拟机做起吧
1、查看管理机(控制端)的IP地址、这里的eth0代表第一块网卡名称
[root@localhost ~] ifconfig eth0
2、查看被管理机1(被控制端1)的IP地址
[root@localhost ~] ifconfig eth0
3、查看被管理机2(被控制端2)的IP地址
[root@localhost ~] ifconfig eth0
4、管理机ping两台被管理机的IP,测试是否能够相互通信
[root@localhost ~] ping -c2 192.168.16.135 ; ping -c2 192.168.16.136
解释:-c代表指定发包数量,“;”中间用分号隔开代表这是两条执行的命令
5、在管理机里使用系统自带的ssh连接两台被管理机、测试是否能够连接
[root@localhost ~] ssh root@192.168.16.135
root@192.168.16.135's password: 输入192.168.16.135的密码即可
exit
ssh root@192.168.16.136
root@192.168.16.136's password:输入192.168.16.136的密码即可
exit
解释: SSH 为建立在应用层基础上的安全协议。ssh连接时需要输入密码,现在连接的是谁,输入exit即可退出连接,连接另一个也是如此。
好了,这些都是准备工作,进入正题吧,不过准备工作也是很重要的。例如:是否是同一段网络?是否能够相互通信?
二、安装下载
1、更新配置 EPEL 源,当然如果已经有其他源了则不需要更新配置。
[root@localhost ~] yum -y install epel-release.noarch
2、下载tree,这一步有需要可以下载也可以不用下载,linux一切皆文件,下载tree主要是能够看得更清楚该软件包含哪些文件
[root@localhost ~] yum -y install tree
3、下载安装ansible
[root@localhost ~] yum -y install ansible
#使用的是yum源,-y表示自动回答yes,install安装的意思,后面接软件名即可
4、通过tree查看ansible有哪些文件,当然还有很多文件没有列举出来
root@localhost ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg #配置文件
├── hosts #主机清单文件
└── roles #公共角色文件
三、实验
1、修改ansible的配置文件
[root@localhost ~] vim /etc/ansible/ansible.cfg
[liang] #组中两个被管理机的IP以及组名(相当于组长),组名名字可以随便取
192.168.16.135
192.168.16.136
[root@localhost ~] ansible all -m ping
#解释:用于测试远程主机是否在线,回复pong表示在线
#ping模块用于检查指定节点机器(被管理主机)是否还能连通,
#用法简单,不涉及参数,主机如果在线,则回复pong
2、设置免密登录,这里说一下为什么需要设置免密登录呢?因为 Ansible 是通过 SSH 连接到目标主机执行配置任务的,所以我们需要先配置 Ansible 控制器到被管理节点的 SSH 免密登录。不然很容易系统报错,无法连接到目标主机。
[root@localhost ~] ssh-keygen #生成密钥
[root@localhost ~] ssh-copy-id root@192.168.16.135 #拷贝密钥至主机
[root@localhost ~] ssh-copy-id root@192.168.16.136 #拷贝密钥至主机
3、再次通过ssh连接,发现这时候是不需要密码的,这足以证明免密成功
[root@localhost ~] ssh root@192.168.16.135
[root@localhost ~] exit
[root@localhost ~] ssh root@192.168.16.136
[root@localhost ~] exit
#解释:通过ssh连接、并使用root账户登录该主机,exit表示退出连接
[root@centos7-1 ~] ansible -h
#结果显示了 ansible 命令的使用帮助信息,表明 Ansible 可以使用了。另外需要记住几个有用的命令:
(1)ansible-doc –l 列出所有模块;
(2)ansible-doc ping 查看指定模块帮助用法;
(3)ansible-doc –s ping 查看指定模块帮助用法。
下面来个最简单的任务:使用 Ansible 的 ping 模块 ping 一下本机。
[root@centos7-1 ~] ansible localhost -m ping
结果显示:
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
ansible 是命令,localhost 表示本机,-m ping 表示使用 ping 模块。从结果看,“SUCCESS”表示
命令的成功执行,没有发生错误,"changed": false 表示未改变任何东西,"ping": "pong"表示能 ping 通。
为了使用 Ansible 命令补全 shell completion 功能,需要安装 Python 的插件 python-argcomplete。
4、编写shell脚本,其中包括firewalld、selinux、hostname、ip1、ip2
[root@localhost ~]# vim firewalld.sh #编辑该脚本内容
[root@localhost ~]# cat firewalld.sh #查看该脚本内容
#!/bin/bash
a=$(systemctl start firewalld) #将开启防火墙这一操作赋予a
b=$(systemctl enable firewalld) #将防火墙开机自启这一操作赋予b
echo $a || echo $b #通过echo $a和$b,两条双竖线隔开代表前面命令执行成功,则执行后面一条命令,反之,则不执行
echo "状态玛:" $? #调用上条命令执行的状态,成功执行则显示0
[root@localhost ~]# chmod +x firewalld.sh #赋予该脚本执行权限
[root@localhost ~]# vim selinux.sh #编辑该脚本内容
[root@localhost ~]# chmod +x selinux.sh #赋予该脚本执行权限
[root@localhost ~]# cat selinux.sh #查看该脚本内容
#!/bin/bash #调用bash解释器
echo `setenforce 0` #使用echo+反引号,临时关闭selinux,反引号相当于$(),
echo `sed -i 's/SELINUX=disabled/SELINUX=permissive/' /etc/selinux/config` #通过sed -i将selinux配置文件中permissive(自由的)替换成disabled(禁用和关闭),最后通过echo+反引号执行
echo "状态玛:" $? #调用上条命令执行的状态,成功执行则显示0
[root@localhost ~]# vim hostname.sh #编辑该脚本内容
[root@localhost ~]# chmod +x hostname.sh #赋予该脚本执行权限
[root@localhost ~]# cat hostname.sh #查看该脚本内容
#/bin/bash
#调用bash编译器
a=$(ifconfig eth0 |grep "inet " |awk '{print $2}') #查看ip最后搜索inet这一行,注意inet后有个空格,再通过awk截取第二列输出在屏幕上,最后将这些赋予a
b=$(hostname) #将主机名赋予b
c=$(date) #将当前时间赋予c
echo "主机名:" $b #通过echo+$执行b值
echo "主机ip:" $a #通过echo+$执行a值
echo "当前时间:" $c #通过echo+$执行c值
echo "上条命令的状态马:" $? #调用上条命令执行的状态,成功执行则显示0
[root@localhost ~]# vim ip1.sh #编写该脚本内容
[root@localhost ~]# cat ip1.sh #查看该脚本内容
#!/bin/bash
sed -i 's/dhcp/static/' /etc/sysconfig/network-scripts/ifcfg-eth0
#根据网卡名称修改,如果虚拟机的网卡名称是 ensXX,则要将命令中的 eth0 修改为 ensXX
echo "IPADDR=192.168.16.15" >> /etc/sysconfig/network-scripts/ifcfg-eth0 #通过echo往网卡配置文件里追加(添加)ip
#要根据虚拟机的网络环境来修改网段,比如实际的虚拟机仅主机模式网络是 192.168.16.0/24
echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network.service #重启网卡
[root@localhost ~]# chmod +x ip1.sh
[root@localhost ~]# vim ip2.sh
[root@localhost ~]# chmod +x ip2.sh
[root@localhost ~]# cat ip2.sh
#!/bin/bash
sed -i 's/dhcp/static/' /etc/sysconfig/network-scripts/ifcfg-eth0
#根据网卡名称修改,如果虚拟机的网卡名称是 ensXX,则要将命令中的 eth0 修改为 ensXX
echo "IPADDR=192.168.16.16" >> /etc/sysconfig/network-scripts/ifcfg-eth0 #通过echo往网卡配置文件里追加(添加)ip
#要根据虚拟机的网络环境来修改网段,比如实际的虚拟机仅主机模式网络是 192.168.16.0/24
echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network.service #重启网卡
[root@localhost ~]#
5、在控制端里试着执行这些编写好的脚本,执行之前最好保存当前快照,如果出现错误恢复快照即可
6、在管理机上执行这些脚本,检查哪些脚本出现错误需要修改的
7、使用yaml编写playbook剧本,在文章后面会有yaml语法和playbook剧本的详细介绍
[root@localhost ~]mv ip.yml playbook.ynl #将之前编写的ip.yml重命名为playbook.ynl
#这里由于之前存在过这个文件,所以需要重命名区分开来
#你也可以选择新建,名字可以自定义,注意必须是以.yml后缀结尾的文件
[root@localhost ~]vim playbook.yml #编辑名字为playbook.yml的剧本文件
[root@localhost ~]cat playbook.yml #查看该剧本文件
---
#这里是语法开头,表示文档开始。注意顶行写。开头格式可写可不写
- name: 第一个palybook剧本
hosts: 192.168.16.135 #这代表当前使用的角色,可以写主机清单里的组名、也可以写被管理端的ip地址、还可以写all代表ansible中所有主机
gather_facts: no #是否搜集该ip的全部信息
tasks: #该角色的任务列表
- name: 启用防火墙
service: #调用 service 模块
name: firewalld
state: started #设置服务的状态:stopped<停止>,started<启动>,restarted<重启服务>,reloaded<重读配置文件>
enabled: yes #防火墙是否开机自启动
- name: 关闭selinux #名字可以随便取,不要太离谱就行
script: /root/selinux.sh #调用该脚本的绝对路径
- name: 收集该主机信息 #名字可以随便取,不要太离谱就行
script: /root/hostname.sh #调用该脚本的绝对路径
- name: 第二个palybook剧本 #名字可以随便取,不要太离谱就行
hosts: 192.168.16.138 #这代表当前使用的角色,可以写主机清单里的组名、也可以写被管理端的ip地址、还可以写all代表ansible中所有主机
gather_facts: no #是否搜集该ip的全部信息
tasks: #该角色的任务列表
- name: 启用防火墙 #名字可以随便取,不要太离谱就行
service: #调用service模块
name: firewalld #名字可以随便取,不要太离谱就行
state: started #设置服务的状态:stopped<停止>,started<启动>,restarted<重启服务>,reloaded<重读配置文件>
enabled: yes #是否开机自启防火墙
- name: 关闭selinux #名字可以随便取,不要太离谱就行
script: /root/selinux.sh #调用该脚本的绝对路径
- name: 收集该主机信息 #名字可以随便取,不要太离谱就行
script: /root/hostname.sh #调用该脚本的绝对路径
四、测试
1、测试之前先在控制端主机的终端上,使用ansible自带的语句模拟运行
#模拟运行测试,-C是大写的C
[root@localhost ~]# ansible-playbook playbook剧本.yml -C
PLAY [第一个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.135]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
TASK [修改被管理端1] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
TASK [收集该主机信息] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
PLAY [第二个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.138]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
TASK [修改被管理端2] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
TASK [收集该主机信息] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
PLAY RECAP ********************************************************************************************************************************************************************************************************
192.168.16.135 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.16.138 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost ~]#
2、结果是没有任何问题的,去掉-C重新执行一遍,发现后面一大推空白,结果一直停留在任务列表中的修改被管理机1中,只好ctrl+z或者ctrl+c停止运行,不然等到猴年马月也不会出任何结果的
[root@localhost ~] ansible-playbook playbook剧本.yml
PLAY [第一个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.135]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
TASK [修改被管理端1] ****************************************************************************************************************************************************************************************************
**3、我执行的时候时间是中午十点左右,差不多十二点也还是停留在这个状态到底是哪里出错了呢?难道是语句?等等,不对啊…到底是哪里错了呢???是gather_facts: yes这个吗?首先介绍一下这个是干嘛用的吧
**
ansible playbook 默认第一个 task 是 Gathering Facts 收集各主机的 facts 信息,以方便我们在 paybook 中直接引用 facts 里的信息。
简单来说:gatheer_facts:的选项有两个值,true和false,true代表真的、相当于yes,false代表假的、相当于no;综合一下,该选项使用true和yes、false和no是一样的效果,本人验证过
[root@localhost ~] vim playbook剧本.yml #编辑该剧本
[root@localhost ~] cat playbook剧本.yml #查看该剧本
---
#这里是语法开头,表示文档开始。注意顶行写。开头格式可写可不写
- name: 第一个palybook剧本
hosts: 192.168.16.135 #这代表当前使用的角色,可以写主机清单里的组名、也可以写被管理端的ip地址、还可以写all代表ansible中所有主机
gather_facts: no #一直停留在那一步的问题我把yes换成了no
#no和false是一样的道理,这一语句翻译过来就是进行信息收集吗:no
tasks: #该角色的任务列表
- name: 启用防火墙
service: #调用 service 模块
name: firewalld
state: started #设置服务的状态:stopped<停止>,started<启动>,restarted<重启服务>,reloaded<重读配置文件>
enabled: yes
- name: 关闭selinux
script: /root/selinux.sh
- name: 修改被管理端1 #在前面的基础上空两格
script: /root/ip1.sh
- name: 收集该主机信息
script: /root/hostname.sh
- name: 第二个palybook剧本
hosts: 192.168.16.138 #这代表当前使用的角色,可以写主机清单里的组名、也可以写被管理端的ip地址、还可以写all代表ansible中所有主机
gather_facts: no
tasks: #该角色的任务列表
- name: 启用防火墙
service: #调用 service 模块
name: firewalld
state: started #设置服务的状态:stopped<停止>,started<启动>,restarted<重启服务>,reloaded<重读配置文件>
enabled: yes
- name: 关闭selinux
script: /root/selinux.sh
- name: 修改被管理端2 #在前面的基础上空两格
script: /root/ip2.sh
- name: 收集该主机信息
script: /root/hostname.sh
4、让我们来看一下修改之后的playbook剧本先模拟运行一遍
[root@localhost ~] vim playbook剧本.yml
[root@localhost ~] ansible-playbook playbook剧本.yml -C
PLAY [第一个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.135]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
TASK [修改被管理端1] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
TASK [收集该主机信息] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
PLAY [第二个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.138]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
TASK [修改被管理端2] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
TASK [收集该主机信息] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
PLAY RECAP ********************************************************************************************************************************************************************************************************
192.168.16.135 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.16.138 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
5、结果是没问题的,那么再次运行呢?结果又是一样的,停留在分配被管理机1的IP地址哪那里就出问题了,试想:会不会是ip呢?删除或者使用#注释掉也许就可以了,结果出来了,我的想法是正确的,因为执行的时候停留在那个地方不正是 -------用来分配IP的吗?
因为都已经成功修改被管理机2的IP了,修改之后当然是连接不上的
#以下是把ip删掉之后的代码
---
#这里是语法开头,表示文档开始。注意顶行写。开头格式可写可不写
- name: 第一个palybook剧本
hosts: 192.168.16.135 #这代表当前使用的角色,可以写主机清单里的组名、也可以写被管理端的ip地址、还可以写all代表ansible中所有主机
gather_facts: no
tasks: #该角色的任务列表
- name: 启用防火墙
service: #调用 service 模块
name: firewalld
state: started #设置服务的状态:stopped<停止>,started<启动>,restarted<重启服务>,reloaded<重读配置文件>
enabled: yes
- name: 关闭selinux
script: /root/selinux.sh
- name: 收集该主机信息
script: /root/hostname.sh
- name: 第二个palybook剧本
hosts: 192.168.16.138 #这代表当前使用的角色,可以写主机清单里的组名、也可以写被管理端的ip地址、还可以写all代表ansible中所有主机
gather_facts: no
tasks: #该角色的任务列表
- name: 启用防火墙
service: #调用 service 模块
name: firewalld
state: started #设置服务的状态:stopped<停止>,started<启动>,restarted<重启服务>,reloaded<重读配置文件>
enabled: yes
- name: 关闭selinux
script: /root/selinux.sh
- name: 收集该主机信息
script: /root/hostname.sh
~
6、查看结果:老样子,在终端模拟一遍查看是否存在问题再执行
#这是模拟执行结果,显示是没有任何问题的
[root@localhost ~] ansible-playbook playbook剧本.yml -C
PLAY [第一个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.135]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
TASK [收集该主机信息] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
PLAY [第二个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.138]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
TASK [收集该主机信息] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
PLAY RECAP ********************************************************************************************************************************************************************************************************
192.168.16.135 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.16.138 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
7、没有问题,那么接下来就是去掉-C来执行了
细心的人会发现被管理机2的IP地址从192.168.16.136变成了192.168.16.138
为什么是.138呢,这里解释一下,因为前面一直出错、一出错就恢复快照,导致ip被占用了分配资源,数字只能往后走
[root@localhost ~] ansible-playbook playbook剧本.yml
PLAY [第一个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.135]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
TASK [收集该主机信息] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.135]
PLAY [第二个palybook剧本] **********************************************************************************************************************************************************************************************
TASK [启用防火墙] ******************************************************************************************************************************************************************************************************
ok: [192.168.16.138]
TASK [关闭selinux] **************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
TASK [收集该主机信息] ****************************************************************************************************************************************************************************************************
changed: [192.168.16.138]
PLAY RECAP ********************************************************************************************************************************************************************************************************
192.168.16.135 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.16.138 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost ~]#
中间插一段,下载ansible一个检查语法的工具,这个可以下载,也可不下载,因为使用ansible自带的模拟执行语句效果也是一样的
[root@localhost ~]# yum -y install search ansible-lint.noarch
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 11 kB 00:00:02
* base: mirrors.aliyun.com
* epel: mirror.01link.hk
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
没有可用软件包 search。
正在解决依赖关系
--> 正在检查事务
---> 软件包 ansible-lint.noarch.0.3.5.1-1.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
========================================================================================================
Package 架构 版本 源 大小
========================================================================================================
正在安装:
ansible-lint noarch 3.5.1-1.el7 epel 54 k
事务概要
========================================================================================================
安装 1 软件包
总下载量:54 k
安装大小:151 k
Downloading packages:
ansible-lint-3.5.1-1.el7.noarch.rpm | 54 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : ansible-lint-3.5.1-1.el7.noarch 1/1
验证中 : ansible-lint-3.5.1-1.el7.noarch 1/1
已安装:
ansible-lint.noarch 0:3.5.1-1.el7
完毕!
[root@localhost ~]
[root@localhost ~] ansible-lint ip.yml #ansible-lint + yaml脚本检测该脚本语句是否存在问题
Couldn't parse task at ip.yml:5 (unexpected parameter type in action: <type 'bool'>
The error appears to be in '<unicode string>': line 5, column 7, but may
be elsewhere in the file depending on the exact syntax problem.
(could not open file to display line))
{ u'gather_facts': True,
u'name': u'\u7b2c\u4e00\u4e2apalybook\u5267\u672c,\u4fee\u6539\u88ab\u7ba1\u7406\u673a1\u7684ip\u5730\u5740',
u'shell': u'echo $(./ip1.sh)'}
ansible-lint.noarch xxx.yml(使用yaml语法编辑的某某某playbook剧本)的用法其实和ansible-playbook -C xxx.yml一样的
root@localhost ~] ansible-playbook ip.yml -C
ERROR! unexpected parameter type in action: <type 'bool'>
The error appears to be in '/root/ip.yml': line 5, column 7, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
tasks:
- name: 第一个palybook剧本,修改被管理机1的ip地址 #名字随便取,不脱离主题即可
^ here
8、更改被管理机的IP地址,还是老样子,首先在管理机的终端模拟执行测试一遍
[root@localhost ~]# vim ip.yml
[root@localhost ~]# ansible-playbook ip.yml -C
PLAY [第一个playbook剧本] **********************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [192.168.16.135]
TASK [引用脚本文件修改被管理机1的ip地址] *****************************************************************************************************************************************************************************************
changed: [192.168.16.135]
PLAY [第二个playbook剧本] **********************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [192.168.16.138]
TASK [引用脚本文件修改管理机2的ip地址] ******************************************************************************************************************************************************************************************
changed: [192.168.16.138]
PLAY RECAP ********************************************************************************************************************************************************************************************************
192.168.16.135 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.16.138 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
9、既然通过ansible语句检验并没有报错,那么就可以正式执行了
[root@localhost ~]# ansible-playbook ip.yml
PLAY [第一个playbook剧本] **********************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [192.168.16.135]
TASK [引用脚本文件修改被管理机1的ip地址] *****************************************************************************************************************************************************************************************
^C [ERROR]: User interrupted execution
[root@localhost ~]#
10、第一台被管理机已经修改成功,但是一直卡在修改管理机1中,直到按ctrl+c这才停止,好了接下来去被管理机1查看现在的ip地址
oot@localhost ~]# ifconfig eth0 #查看被管理机的IP地址
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.16.135 netmask 255.255.255.0 broadcast 192.168.16.255
inet6 fe80::88a9:5a93:f68d:270 prefixlen 64 scopeid 0x20<link>
inet6 fe80::bbdc:b5aa:77f3:66ed prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:68:5d:f4 txqueuelen 1000 (Ethernet)
RX packets 19877 bytes 12765611 (12.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6682 bytes 944521 (922.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
192.168.16.135不正是没修改之前的IP地址吗
[root@localhost ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.16.15 netmask 255.255.255.0 broadcast 192.168.16.255
inet6 fe80::88a9:5a93:f68d:270 prefixlen 64 scopeid 0x20<link>
inet6 fe80::bbdc:b5aa:77f3:66ed prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:68:5d:f4 txqueuelen 1000 (Ethernet)
RX packets 20138 bytes 12985630 (12.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6891 bytes 981965 (958.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
192.168.16.15正是ansible通过yaml编写的playbook剧本修改而来的IP地址
[root@localhost ~] getenforce 查看selinux现在的状态
Permissive #宽容的,代表很放松的管理
[root@localhost ~] systemctl status firewalld.service
查看防火墙现在的状态
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2022-04-20 04:47:57 GMT; 3 days ago #active (running)活动状态:运行
Docs: man:firewalld(1)
Main PID: 888 (firewalld)
Tasks: 2
CGroup: /system.slice/firewalld.service
└─888 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
4月 20 04:47:56 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
4月 20 04:47:57 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
4月 20 04:47:57 localhost.localdomain firewalld[888]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please c...bling it now.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#
11、既然成功修改被管理机1的IP地址,也就意味着暂时脱离了管理机的管理,这时候需要在管理机修改ansible主机清单文件
[root@localhost ~]# vim /etc/ansible/hosts
[root@localhost ~]# head -n 27 /etc/ansible/hosts |tail -n 5
## 192.168.1.100
## 192.168.1.110
[liang]
192.168.16.15 #这是管理机通过ansible成功修改被管理机1ip地址
192.168.16.138
[root@localhost ~]#
**测试连通性**
[root@localhost ~]# ansible 192.168.16.15 -m ping
192.168.16.15 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@localhost ~]#
在修改被管理机1的IP地址基础上,创建第二个yaml文件修改被管理机2的IP地址
[root@localhost ~]# vim ip2.yml
[root@localhost ~]# ansible-playbook ip2.yml -C
养成习惯,先模拟执行一遍,确保没有问题再执行
PLAY [第二个playbook剧本] **********************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [192.168.16.138]
TASK [引用脚本文件修改管理机2的ip地址] ******************************************************************************************************************************************************************************************
changed: [192.168.16.138]
PLAY RECAP ********************************************************************************************************************************************************************************************************
192.168.16.138 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost ~]#
[root@localhost ~]# ansible-playbook ip2.yml
PLAY [第二个playbook剧本] **********************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [192.168.16.138]
TASK [引用脚本文件修改管理机2的ip地址] ******************************************************************************************************************************************************************************************
^C [ERROR]: User interrupted execution
#也是卡在这里,只好ctrl+c停止运行
[root@localhost ~]#
查看被管理机2的IP地址以及防火墙情况、selinux状态
之前的IP和修改之后的IP对比
[root@localhost ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.16.138 netmask 255.255.255.0 broadcast 192.168.16.255
inet6 fe80::88a9:5a93:f68d:270 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:46:ba:4f txqueuelen 1000 (Ethernet)
RX packets 11127 bytes 7724730 (7.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9323 bytes 2003899 (1.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.16.16 netmask 255.255.255.0 broadcast 192.168.16.255
inet6 fe80::88a9:5a93:f68d:270 prefixlen 64 scopeid 0x20<link>
inet6 fe80::f2f6:620d:471d:a534 prefixlen 64 scopeid 0x20<link>
inet6 fe80::bbdc:b5aa:77f3:66ed prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:46:ba:4f txqueuelen 1000 (Ethernet)
RX packets 12996 bytes 8935364 (8.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10145 bytes 2144637 (2.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]#
查看防火墙状态和selinux状态,防火墙状态是正在运行的、selinux是宽容的。所以实验是成功的
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 六 2022-04-23 03:39:06 GMT; 11h ago
Docs: man:firewalld(1)
Main PID: 4111 (firewalld)
Tasks: 2
CGroup: /system.slice/firewalld.service
└─4111 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
4月 23 03:39:05 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
4月 23 03:39:06 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
4月 23 03:39:06 localhost.localdomain firewalld[4111]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please ...bling it now.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#
做到这里,也就意味着暂时脱离了管理机的管理,这时候需要在管理机修改ansible主机清单文件,再使用ansible的ping模块测试连通性
[root@localhost ~]# vim /etc/ansible/hosts
[root@localhost ~]# head -n 27 /etc/ansible/hosts |tail -n 5
## 192.168.1.100
## 192.168.1.110
[liang]
192.168.16.15
192.168.16.16
[root@localhost ~]# ansible all -m ping
The authenticity of host '192.168.16.16 (192.168.16.16)' can't be established.
ECDSA key fingerprint is SHA256:hGwOJSc9iN+h88kkBF1wSKYr7zAbAvVCa6n9lc+8i2M.
ECDSA key fingerprint is MD5:6b:ba:2e:50:51:2e:7b:73:f0:24:9a:87:92:6d:1a:39.
Are you sure you want to continue connecting (yes/no)? yes
192.168.16.15 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.16.16 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@localhost ~]#
这里稍微补充一下,相信很多人是看不太懂的
模块以及yaml语法补充:
通过 Ansible 提供的用于远程执行命令的 command、shell、raw、script 模块,我们可以将被管理节点的 IP/计算机名信息写入 Ansible 的“演员”inventory——/etc/ansbile/hosts,将要执行的命令编排成 Ansible 的 playbook,然后运行这个 playbook 就可以达到远程配置的目的了。
command、shell、raw、script 模块有什么区别呢?command 和 shell 模块都依赖 Python 解析器,
而 raw、script 这两个模块不依赖 Python,直接调用目标客户端的/bin/sh 来执行命令。如果目标客户端
安装了 Python,而且要执行的命令很简单,不涉及特殊的 shell 符号,可以考虑 command 模块,如果涉及重定向等特殊 shell 符号则要用 shell 模块;如果目标客户端没有安装 Python,就只能考虑用 raw 或者script 模块,如果临时组装 shell 命令清单,则使用 raw 模块,如果在 Ansible 控制器上已经编写好 shell
脚本文件,需要发送到客户端去执行,则应该使用 script 模块。
playbook 又是什么?playbook 字母意思是剧本,剧本里写清楚了哪个演员什么时候应该说什么台词、
做什么动作、展现什么神情等,电影、电视剧是按照剧本来拍摄的。Ansible 里的 playbook 作用就跟拍
电影的剧本一样,把要执行的命令、任务在 playbook 里编排好,然后 Ansible 执行这个 playbook,Ansible
的“电影”就这样“拍摄”完成了。由此可见,掌握 playbook 的编排对于掌握 Ansible 的应用有多重要!
电影剧本有分幕、场(景)、镜等结构,Ansible 的 playbook 也分结构,类似于:
playbook #相当于总剧本
|----play #相当于场景剧本
|----tasks #相当于分镜头剧本
|----pre_tasks #相当于拍摄前准备工作:布置场景,演员化妆等,执行环境的准备
|----tasks #相当于开始拍摄,要执行的命令清单
|----post_tasks #相当于拍摄完清场工作:撤换场景,演员卸/换妆等,执行环境的清理
**Ansible playbook 遵循 YAML 语法,其格式大致如下:**
--- #开头,非必需
- name: Network Getting Started First Playbook #play 名称,冒号后必须有一个空格
connection: network_cli #连接方式
gather_facts: false #是否收集被管理节点的信息
hosts: all #针对哪些被管理节点
tasks: #接下来是详细的任务清单
- name: Get config for VyOS devices #任务名称
vyos_facts: #模块
gather_subset: all #收集信息子集
- name: Display the config
debug:
msg: "The hostname is {{ ansible_net_hostname }} and the OS is {{ ansible_net_version }}" #输出到控制节点的 shell
playbook 以“---”开头,以“...”结束。
play 和 task 以“- ”(一个-和一个空格)开头,并列的元素应在垂直方向对齐,被包含的应缩进两个空格。
内容太长可以用“|”或者“>”换行,两者的区别是“|”会保留换行符,而“>”会把换行符变成空格。
键(key)后面是一个冒号和一个空格“: ”,值可以用单引号或双引号包含起来,两者的区别是双引号里面可以使用转义,如 foo: "a \t TAB and a \n NEWLINE",\t 表示一个 Tab,\n 表示一个换行符。
变量的引用需要使用双引号和双大括号包含变量名,即"{{ var }}",如
foo: "{{ variable }}"。
foo: "{{ variable }}/additional/string/literal"
foo2: "{{ variable }}\\backslashes\\are\\also\\special\\characters"
foo3: "even if it's just a string literal it must all be quoted"
关于更多的语法信息可以参考文档:
https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
YAML 1.1:https://yaml.org/spec/1.1/
YAML 1.2:https://yaml.org/spec/1.2/spec.html
Ansible playbook 的样例:https://github.com/ansible/ansible-examples
常用模块介绍
Command 模块
功能:在远程主机执行命令,此为默认模块,可忽略-m选项
注意:此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
范例:
[root@ansible ~]#ansible websrvs -m command -a 'chdir=/etc cat centos-release'
10.0.0.7 | CHANGED | rc=0 >>
CentOS Linux release 7.7.1908 (Core)
10.0.0.8 | CHANGED | rc=0 >>
CentOS Linux release 8.1.1911 (Core)
[root@ansible ~]#ansible websrvs -m command -a 'chdir=/etc creates=/data/f1.txt cat centos-release'
10.0.0.7 | CHANGED | rc=0 >>
CentOS Linux release 7.7.1908 (Core)
10.0.0.8 | SUCCESS | rc=0 >>
skipped, since /data/f1.txt exists
[root@ansible ~]#ansible websrvs -m command -a 'chdir=/etc removes=/data/f1.txt cat centos-release'
10.0.0.7 | SUCCESS | rc=0 >>
skipped, since /data/f1.txt does not exist
10.0.0.8 | CHANGED | rc=0 >>
CentOS Linux release 8.1.1911 (Core)
ansible websrvs -m command -a ‘service vsftpd start’
ansible websrvs -m command -a ‘echo magedu |passwd --stdin wang’
ansible websrvs -m command -a 'rm -rf /data/'
ansible websrvs -m command -a 'echo hello > /data/hello.log'
ansible websrvs -m command -a "echo $HOSTNAME"
Shell模块
功能:和command相似,用shell执行命令
范例:
[root@ansible ~]#ansible websrvs -m shell -a "echo HOSTNAME"
10.0.0.7 | CHANGED | rc=0 >>
ansible
10.0.0.8 | CHANGED | rc=0 >>
ansible
[root@ansible ~]#ansible websrvs -m shell -a 'echoHOSTNAME'
10.0.0.7 | CHANGED | rc=0 >>
centos7.wangxiaochun.com
10.0.0.8 | CHANGED | rc=0 >>
centos8.localdomain
[root@ansible ~]#ansible websrvs -m shell -a 'echo centos | passwd --stdin wang'
10.0.0.7 | CHANGED | rc=0 >>
Changing password for user wang.
passwd: all authentication tokens updated successfully.
10.0.0.8 | CHANGED | rc=0 >>
Changing password for user wang.
passwd: all authentication tokens updated successfully.
[root@ansible ~]#ansible websrvs -m shell -a 'ls -l /etc/shadow'
10.0.0.7 | CHANGED | rc=0 >>
---------- 1 root root 889 Mar 2 14:34 /etc/shadow
10.0.0.8 | CHANGED | rc=0 >>
---------- 1 root root 944 Mar 2 14:34 /etc/shadow
[root@ansible ~]#ansible websrvs -m shell -a 'echo hello > /data/hello.log'
10.0.0.7 | CHANGED | rc=0 >>
10.0.0.8 | CHANGED | rc=0 >>
[root@ansible ~]#ansible websrvs -m shell -a 'cat /data/hello.log'
10.0.0.7 | CHANGED | rc=0 >>
hello
10.0.0.8 | CHANGED | rc=0 >>
hello
Bash
注意:调用bash执行命令 类似 cat /tmp/test.md | awk -F‘|’ ‘{print 1,1,2}’ &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
范例:将shell模块代替command,设为模块
[root@ansible ~]#vim /etc/ansible/ansible.cfg
#修改下面一行
module_name = shell
Script模块
功能:在远程主机上运行ansible服务器上的脚本
范例:
ansible websrvs -m script -a /data/test.sh
Copy模块
功能:从ansible服务器主控端复制文件到远程主机
#如目标存在,默认覆盖,此处指定先备份
ansible websrvs -m copy -a “src=/root/test1.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes”
#指定内容,直接生成目标文件
ansible websrvs -m copy -a "content='test line1\ntest line2' dest=/tmp/test.txt"
#复制/etc/下的文件,不包括/etc/目录自身
ansible websrvs -m copy -a “src=/etc/ dest=/backup”
Fetch模块
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
范例:
ansible websrvs -m fetch -a ‘src=/root/test.sh dest=/data/scripts’
范例:
[root@ansible ~]#ansible all -m fetch -a 'src=/etc/redhat-release dest=/data/os'
[root@ansible ~]#tree /data/os/
/data/os/
├── 10.0.0.6
│ └── etc
│ └── redhat-release
├── 10.0.0.7
│ └── etc
│ └── redhat-release
└── 10.0.0.8
└── etc
└── redhat-release
6 directories, 3 files
File模块
功能:设置文件属性
范例:
#创建空文件
ansible all -m file -a 'path=/data/test.txt state=touch'
ansible all -m file -a 'path=/data/test.txt state=absent'
ansible all -m file -a "path=/root/test.sh owner=wang mode=755“
#创建目录
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
#创建软链接
ansible all -m file -a ‘src=/data/testfile dest=/data/testfile-link state=link’
unarchive模块
功能:解包解压缩
实现有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
常见参数:
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
范例:
ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo'
ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
Archive模块
功能:打包压缩
范例:
ansible websrvs -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=0600'
Hostname模块
功能:管理主机名
范例:
ansible node1 -m hostname -a “name=websrv”
ansible 192.168.100.18 -m hostname -a 'name=node18.magedu.com'
Cron模块
功能:计划任务
支持时间:minute,hour,day,month,weekday
范例:
#备份数据库脚本
[root@centos8 ~]#cat mysql_backup.sh
mysqldump -A -F --single-transaction --master-data=2 -q -uroot |gzip > /data/mysql_date +%F_%T.sql.gz
#创建任务
ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh'
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime"
#禁用计划任务
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=yes"
#启用计划任务
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=no"
#删除任务
ansible websrvs -m cron -a "name='backup mysql' state=absent"
ansible websrvs -m cron -a 'state=absent name=Synctime'
Yum模块
功能:管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本
范例:
ansible websrvs -m yum -a ‘name=httpd state=present’ #安装
ansible websrvs -m yum -a ‘name=httpd state=absent’ #删除
Service模块
功能:管理服务
范例:
ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded’
ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf"
ansible all -m service -a 'name=httpd state=restarted'
User模块
功能:管理用户
范例:
#创建用户
ansible all -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=nginx comment=nginx uid=88 group=nginx groups="root,daemon" shell=/sbin/nologin system=yes create_home=no home=/data/nginx non_unique=yes'
#删除用户及家目录等数据
ansible all -m user -a 'name=nginx state=absent remove=yes'
Group模块
功能:管理组
范例:
#创建组
ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
#删除组
ansible websrvs -m group -a 'name=nginx state=absent'
Lineinfile模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换
功能:相当于sed,可以修改文件内容
范例:
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=enforcing'"
ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
Replace模块
该模块有点类似于sed命令,主要也是基于正则进行匹配和替换
范例:
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
ansible all -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1'"
Setup模块
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用
gather_facts: no
来禁止 Ansible 收集 facts 信息
范例:
ansible all -m setup
ansible all -m setup -a "filter=ansible_nodename"
ansible all -m setup -a "filter=ansible_hostname"
ansible all -m setup -a "filter=ansible_domain"
ansible all -m setup -a "filter=ansible_memtotal_mb"
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_memfree_mb"
ansible all -m setup -a "filter=ansible_os_family"
ansible all -m setup -a "filter=ansible_distribution_major_version"
ansible all -m setup -a "filter=ansible_distribution_version"
ansible all -m setup -a "filter=ansible_processor_vcpus"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
ansible all -m setup -a "filter=ansible_architecture"
ansible all -m setup -a "filter=ansible_processor*"
Bash
范例:
[root@ansible ~]#ansible all -m setup -a 'filter=ansible_python_version'
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "2.7.5",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
10.0.0.6 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "2.6.6",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "3.6.8",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
[root@ansible ~]#
声明一下:这条链接写得很详细,也通俗易懂
本文链接:http://www.yunweipai.com/34676.html
用心写了很久,如果本文对您有一点点帮助,可以点赞、关注、收藏一下吧