Ansible 中常用模块
- 1. ansible 实现管理的方式
- 2. Ad-Hoc 执行方式中如何获得帮助
- 3. ansible 命令运行方式及常用参数
- 4. ansible 的基本颜色代表信息
- 5. ansible 中的常用模块
- 5.1 command
- 5.2 shell
- 5.3 script
- 5.4 copy
- 5.5 fetch
- 5.6 file
- 5.7 archive
- 5.8 unarchive
- 5.9 hostname
- 5.10 cron
- 5.11 yum_repository
- 5.12 dnf
- 5.13 service
- 5.14 firewalld
- 5.15 user
- 5.16 group
- 5.17 lineinfile
- 5.18 replace
- 5.19 setup
- 5.20 debug
test setting
- 免密认证
- sudo 权限设定
- 写入解析
1. ansible 实现管理的方式
管理方式 | 含义 |
Ad-Hoc | 利用ansible命令直接完成管理,主要用于临时命令使用场景 |
playbook | ansible脚本,主要用于大型项目场景,需要前期的规划 |
- ansible 命令管理方式

- ansible 剧本的方式(playbook的方式)
注:该脚本编写时有严格的格式缩进。
如图所示的 playbook 片段表示查看被控主机的主机名,然后运行 playbook;

上面剧本的方式类似于下面这种命令的方式:

2. Ad-Hoc 执行方式中如何获得帮助
用命令 ansible-doc 显示模块帮助的指令;
- 格式
ansible-doc [参数] [模块…] - 常用参数
-l ##列出可用模块
-s ##显示指定模块的playbook片段
使用命令 ansible-doc -l 来列出所有的模块;目前有 3387 个模块;

查看模块的帮助,直接在 ansilbe-doc 后面加上模块参数即可;

加入参数 -s 即可查看简短帮助:

3. ansible 命令运行方式及常用参数
- 格式:
ansible 清单 -m 模块 -a 模块参数 - 常用参数
常用参数 | 含义 |
–version | 显示版本 |
-m module | 指定模块,默认为command模块 |
-v | 详细过程 -vv -vvv更详细过程 |
–list | 显示主机列表,也可以用–list-hosts |
-k | 提示输入ssh连接密码,默认key认证 |
-C | 预执行检测 |
-T | 执行命令的超时时间,默认10s |
-u | 指定远程执行的用户 |
-b | 执行sudo切换身份操作 |
-become-user=USERNAME | 指定sudo的用户 |
-K | 提示输入sudo密码 |
1)查看版本ansible --version

2)详细过程,当不加 v 时,只会有输出结果,没有过程,最多可以加三个 v ;



3)预执行检测,只会检测命令的结果是否正确,并不会执行该动作;

4)-k 表示输入密码,之前 做了免密认证,此时加入 -k 可以输入密码;

5)-b表示指定sudo切换用户身份操作 ,- -become-user=zxk 表示指定 sudo 的用户;

6)-u 表示指定远程执行的用户;
如图之前对于 zxk 用户做了免密认证,当用 -u 来指定用户时,会发现直接报错,加入 -k 输入密码之后,便可以。

4. ansible 的基本颜色代表信息
颜色 | 含义 |
绿色 | 执行成功但为对远程主机做任何改变 |
黄色 | 执行成功并对远程主机做改变 |
红色 | 执行失败 |
5. ansible 中的常用模块
5.1 command
- 功能: 在远程主机执行命令,此模块为默认模块;
- 常用参数
参数 | 含义 |
chdir | 执行命令前先进入到指定目录 |
cmd | 运行命令指定 |
creates | 如果文件存在将不运行 |
removes | 如果文件存在将运行 |
free_form | 在远程主机中执行的命令,此参数不需要加 |
可以用命令 ansible-doc command -s 来查看其参数及含义;

测试:
chdir表示先进入指定目录,再执行命令。如图表示进入 /etc 目录下,查看passwd文件的命令;

creates表示当文件存在时将不执行动作,如图,当文件 /mnt/zxk 不存在,便运行后面的显示动作;
removes 表示当文件不存在时便不执行动作,如图,当文件 /mnt/zxk 不存在,便没有运行后面的显示动作;
最后一条,由于文件 /mnt/zxk 不存在,便运行后面的显示动作;

如图,当文件存在时,便不会执行后面的动作:

注意:Linux 中的很多通配符在 command 模块中不支持。
5.2 shell
- 功能:和 command 功能类似
- 常用参数
参数 | 含义 |
chdir | 执行命令前先进入到指定目录 |
cmd | 运行命令指定 |
creates | 如果文件存在将不运行 |
removes | 如果文件存在将运行 |
free_form | 在远程主机中执行的命令,此参数不需要加 |
executable | 指定执行环境,默认为sh |


5.3 script
- 功能:在 ansible 主机中写好的脚本在受控主机中执行
参数如图所示:

编写一个脚本,在 ansible 主机中写好的脚本在受控主机中执行;

5.4 copy
- 功能:从 ansible 主机复制文件到受控主机
- 常用参数
参数 | 含义 |
src | 源文件 |
dest | 目的地文件 |
owner | 指定目的地文件所有人 |
group | 指定目的地文件所有组 |
mode | 指定目的地文件权限 |
backup=yes | 当受控主机中存在文件时备份原文件 |
content | 指定文本内容直接在受控主机中生成文件 |
复制文件到受控主机中;

在受控主机中查看:

可以从上面看到,复制时权限会被保留,那么加上参数 mode 来指定目的地文件的权限来复制:

查看效果:

指定参数来指定目的地文件的所有人和所有组:

查看效果:

指定文本内容直接在受控主机中生成文件:

查看效果:

默认复制到目的地文件时,当文件已经存在时会被覆盖,加入参数 backup 来生成备份文件:

结果如图所示:

5.5 fetch
- 功能:从受控主机把文件复制到 ansible 主机,但不支持目录
- 常用参数
参数 | 含义 |
src | 受控主机的源文件 |
dest | 本机目录 |
flat | 基本名称功能 |
(1)从受控主机把文件复制到ansible主机,但不支持目录复制:

查看:可以看到在 /mnt 生成了两个以 ip 为名的目录

(2)将受控主机的 /etc/hostname 文件复制到 ansible 主机的 /mnt/lzxk 文件中,加了flat 参数,表示 zxk 是一个文件而不是目录:

此时在 /mnt/ 中生成一个文件,而文件中只有一台主机名,这是因为在执行的过程中先访问的是 100主机,随后访问的是 200 主机,200 主机的主机名会覆盖100主机名;

5.6 file
- 功能:设置文件的属性
- 常用参数
参数 | 含义 |
path | 指定文件名称 |
state | 指定操作状态 |
touch | 建立 |
absent | 删除 |
directory | 递归 |
link | 建立链接 |
hard | |
mode | 设定权限 |
owner | 设定文件用户 |
group | 设定文件组 |
src | 源文件 |
dest | 目标文件 |
recurse=yes | 递归更改 |
清空被控主机 /mnt 中的素有文件,来观察实验效果:

(1)新建文件
用命令 ansible westos -m file -a 'path=/mnt/westos state=touch'在被控主机的 /mnt 下新建文件:

建立之后用命令 ansible westos -m shell -a 'ls -l /mnt'来查看文件

(2) 删除
用命令 ansible westos -m file -a 'path=/mnt/westos state=absent'在被控主机的 /mnt 下删除文件:

(3)新建目录
用命令 ansible westos -m file -a 'path=/mnt/westos state=directory'在被控主机的 /mnt 下新建目录:

查看

(4)建立链接
先建立一个文件,然后用命令 ansible westos -m file -a 'src=/mnt/zxk dest=/mnt/kkk state=link 来建立链接;

建立链接之后,查看的结果如图所示:

(5)硬链接
用命令 ansible westos -m file -a 'src=/mnt/zxk dest=/mnt/xxx state=hard' 来建立硬链接;

如图所示,硬链接的 id 和链接来源的 id 一致;

(6)递归
在前面生成的目录中新建一个文件,来更改其权限;
更改之前的目录以及目录中文件的权限如图所示:

用命令 ansible westos -m file -a 'path=/mnt/westos mode=777 recurse=yes'来递归更改权限;

更改之后的效果如下图所示:

5.7 archive
- 作用:压缩
- 常用参数
参数 | 含义 |
path | 打包目录名称 |
dest | 声称打包文件名称 |
format | 打包格式 |
owner | 指定文件所属人 |
mode | 指定文件权限 |
输入命令 ansible westos -m archive -a 'path=/etc dest=/mnt/etc.tar.gz owner=zxk mode=755' 来打包;

查看效果:

5.8 unarchive
- 功能:解压缩
- 常用参数
参数 | 含义 |
copy | 默认为 yes 从 ansible 主机复制文件到受控主机,设定为 no 从受控主机中寻找 src 源文件 |
remote_src | 功能同 copy 且相反,设定为 yes 表示包在受控主机,设定为 no表示包在ansible主机 |
src | 包路径,可以使ansible主机也可以使受控主机 |
dest | 受控主机目录 |
mode | 加压后文件权限,copy 必须是 yes ,否则改不了权限 |
用命令ansible westos -m unarchive -a 'src=/mnt/etc.tar.gz dest=/mnt copy=no' 来解压受控主机的文件;

查看效果:

在默认情况下当 copy=no 时,也就是从被控主机中寻找 src 源文件时,不能指定解压之后文件的权限;当 src 源文件来自 ansible 主机时,可以指定权限;
先生成一个压缩包,然后用命令 ansible westos -m unarchive -a 'src=/mnt/westos.tar.gz dest=/mnt mode=777 owner=zxk' 来解压;


效果查看:

5.9 hostname
- 作用:管理主机名称
- 常用参数
参数 | 含义 |
name | 指定主机名称 |
修改主即名用命令 ansible 172.25.254.100 -m hostname -a 'name=westos.zxk' 来修改,用命令 ansible 172.25.254.100 -m shell -a 'hostname' 来查看;

5.10 cron
- 作用:计划任务
- 常用参数
参数 | 含义 |
minute 分钟 | |
hour | 小时 |
day | 天 |
month | 月 |
weekday | 周 |
name | 任务名称 |
job | 任务脚本或命令 |
disabled | yes 禁用计划任务,no 启动计划任务 |
state | absent 删除计划任务 |
用命令 ansible westos -m cron -a "job=data name=westostest minute=*/2" 来设定定时任务;其中 job 表示到时间后执行的命令,name 表示此次任务的名称,minute 表示设定的分钟,不写则默认是 * ;

关闭任务:
用命令 ansible westos -m cron -a "job=data name=westostest disabled=yes" 来关闭任务,可以看到关闭之后在查看时,前面是用 # 注释掉的;

开启任务:
用命令 ansible westos -m cron -a "job=data name=westostest disabled=no" 来开启任务;开启之后前面的#就被去掉了;

删除任务:
用命令 ansible westos -m cron -a "job=data name=westostest state=absent"来删除任务;

5.11 yum_repository
- 作用:配置系统软件仓库源文件
- 常用参数
参数 | 含义 |
name | 指定仓库名称 |
baseurl | 指定源路径 |
description | 指定仓库描述 |
file | 指定仓库文件名称 |
enabled | 仓库是否启用 |
gpgcheck | 仓库是否检测gpgkey |
state | 默认值 present 建立,absent 为删除 |
用命令 ansible westos -m shell -a 'ls /etc/yum.repos.d/' 来查看软件仓库是否已经有编写的文件;
用命令 ansible westos -m yum_repository -a 'name=AppStream baseurl=http://172.25.254.39/RHEL8/AppStream description=westosAppStream gpgcheck=no file=westos' 来写入软件仓库的内容;

用命令 ansible westos -m shell -a 'cat /etc/yum.repos.d/westos.repo' 来查看写入文件的内容;

用命令 ansible westos -m yum_repository -a 'name=BaseOS baseurl=http://172.25.254.39/RHEL8/BaseOS descriptinotallow=westosBaseOS gpgcheck=no file=westos' 在写入一个仓库信息;

设置enabled=0 参数,表示不启用 BaseOs软件仓库;

设置 enabled=1 参数,表示启用BaseOs软件仓库;

用命令 ansible westos -m yum_repository -a 'name=BaseOS baseurl=http://172.25.254.39/RHEL8/BaseOS description=westosBaseOS gpgcheck=no file=westos state=absent' 删除 BaseOs 软件仓库;

5.12 dnf
- 作用:管理系统中的dnf仓库及管理软件
- 常用参数
参数 | 含义 |
name | 指定包 |
state | 指定动作 |
present 安装 | |
latest 更新 | |
absent 删除 | |
list | 列出指定信息,httpd、 installed、 all、available |
disable_gpg_check | 禁用gpgkey检测 |
enablerepo | 指定安装包来源 |
disablerepo | 禁用安装包来源 |
用命令 ansible westos -m dnf -a 'name=vsftpd state=latest' 来安装 vsftpd 单个软件;

用命令ansible westos -m dnf -a 'name="httpd,dhcp-server" state=latest disable_gpg_check=yes' 来安装多个软件;
如图所示,当被控机的软件仓库搭建的有问题时,此时在安装软件时,会出现找不到可用的安装包的状况;

用命令 ansible westos -m dnf -a 'name="httpd,dhcp-server" state=absent' 来卸载已经安装的软件包;
从下图可知,当被控机中没有安装软件包时,在卸载时会提示什么都没有做;对于已经安装过对应软件包的被控机,会执行卸载动作,但是从安装和卸载的软件包中明显的可以发现没有卸载相关依赖性的软件包;

用命令
先为 100 主机安装 httpd 软件,再次卸载用命令 ansible 172.25.254.100 -m dnf -a 'name="httpd" state=absent autoremove=yes 来卸载软件包并同时卸载依赖性;


用命令 ansible 172.25.254.100 -m dnf -a 'name="@Virtualization Tools" state=latest' 来为被控主机100安装组件;

也可以用网络源的方式来安装软件;
对于本地软件仓库的禁用,通常用于不同仓库中存在不同版本的情况下。
5.13 service
- 作用:管理系统服务状态
- 常用参数
参数 | 含义 |
name | 指定服务名称 |
state | 指定对服务的动作,started、stoped、restarted、reloaded |
enabled | 设定服务开机是否启动,yes开启启动,no开机不启动 |
用命令 ansible 172.25.254.100 -m service -a 'name="vsftpd" state=started' 来开启服务;
用命令 ansible 172.25.254.100 -m service -a 'name="vsftpd" state=restarted' 来重启服务;
用命令shell 的方式来查看服务的状态ansible 172.25.254.100 -m shell -a 'systemctl status vsftpd';
可以发现其已经开启,但是默认开启的服务没有设定开机自启;

用命令 ansible 172.25.254.100 -m service -a 'name="httpd" state=started enabled=yes' 来开启服务并设定开机自启;

有的服务不支持 reloaded。
5.14 firewalld
以上服务在开启之后不一定可以直接使用,需要设定火墙策略才可以访问。
- 常用参数
参数 | 含义 |
zone | 火墙的域 |
service | 服务名称 |
permanent | 永久生效 |
state | 状态 |
enbaled 允许 | |
disabled 拒绝 | |
immediate | 立即生效 |
查看模块的帮助:

用命令 ansible 172.25.254.100 -m firewalld -a 'zone=public service=http permanent=yes state=enabled immediate=yes' 为刚才安装的 http服务设定火墙策略;

5.15 user
- 作用:模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作;
- 常用参数
参数 | 含义 |
name | 必须参数,用于指定要操作的用户名称 |
group | 指定用户所在的基本组 |
gourps | 指定用户所在的附加组 |
append | 指定添加附加组默认值为no |
shell | 指定用户的默认 shell |
uid | 指定用户的 uid 号 |
comment | 指定用户的注释信息 |
state | 用于指定用户是否存在于远程主机 |
present 建立 | |
absent 删除 | |
remove | 当删除用户是删除用户家目录,默认值为no |
password | 此参数用于指定用户的密码。但密码为明文,可以用openssl password -6 '密码’生成加密字符 |
generate_ssh_key | 生成sshkey |
用命令 ansible westos -m user -a 'name=gzz state=present' 来新建用户 ;
用命令 ansible westos -m user -a 'name=gzz state=absent' 来删除用户 ;

用户虽然已经删除,但是并不会删除新建用户时所建立的用户家目录;

用命令 ansible westos -m user -a 'name=gzz state=present uid=6666' 来新建用户,并指定用户 id ;

用命令 ansible westos -m user -a 'name=gzz state=absent remove=yes' 来删除用户并删除用户的家目录 ;

用命令 ansible 172.25.254.100 -m user -a 'name=gzz state=present uid=6666 group=1001 comment="gzz user"' 来新建用户,并指定用户的组身份和用户说明;


用命令 ansible 172.25.254.100 -m user -a 'name=gzz state=present uid=6666 group=1001 comment="gzz user" shell=/bin/sh groups=dhcpd' 来更改用户所用 shell 和附加组的身份;


用命令 ansible 172.25.254.100 -m user -a 'name=gzz groups=apache append=yes' 来为用户添加附加组 ;


用命令 ansible 172.25.254.100 -m user -a 'name=gzz password=$6$S8p5vUiYhNxRnStf$H6RzQOm.T73evAQ7wcx9SY9bGV3wnRZs0BOx5Ph7gfiizr7hoxPlGhtYsEieWfl2ctHXiQvlaHTSQQ71gIARR.' 来修改用户的密码;
先用命令 openssl passwd -6 生成密码;


用命令 ansible westos -m user -a 'name=zzz generate_ssh_key=yes home=/home/www' 表示在新建用户时,生成密钥并指定用户的家目录为 www ;


5.16 group
- 作用:group 模块可以帮助我们管理远程主机上的组。
- 常用参数
参数 | 含义 |
name | 必须参数,用于指定要操作的用户名称 |
state | 用于指定组的状态 |
present 建立 | |
absent 删除 | |
gid | 用于指定组的gid |
用命令 ansible westos -m group -a 'name=wang state=present' 来创建组;


用命令 ansible westos -m group -a 'name=wang state=absentt' 来删除组;
用命令 ansible westos -m group -a 'name=wang state=present gid=7777' 指定组的 id 来建立组,当组已经存在时就是更改组的id 不存在时就是指定 id 建立组;


5.17 lineinfile
参数
参数 | 含义 |
path | 指定要操作的文件 |
line | 指定文本内容 |
regexp | 使用正则表达式匹配对应的行当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除 |
state | 当想要删除对应的文本时需要将state参数的值设置为absent,state的默认值为present |
backrefs | 当内容无匹配规则时不对文件做任何更改,默认值为no,向后引用regexp变量信息 |
insertafter | 借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式 |
insertbefore | 借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式 |
backup | 是否在修改文件之前对文件进行备份 |
create | 当要操作的文件并不存在时,是否创建对应的文件 |
用命令 ansible westos -m lineinfile -a 'path=/mnt/westos line="hello zxk" create=yes' 在被控主机中新建一个文件,并且指定文件名称;

在已经存在的文件中加入内容,用命令 ansible westos -m lineinfile -a 'path=/mnt/westos line="hello westos"' 来添加;


加上 regexp 参数,表示使用匹配的方式替换文件内容,如果文件有多行时,只有文件中最后一个与匹配内容一致的才会被替换;但是当删除时,所有与匹配内容一致的,都会被删除;
用命令 ansible westos -m lineinfile -a 'path=/mnt/westos line="hello test1" regexp="test"' 来修改文件内容;
当只匹配到一行时会直接修改;

当匹配多余一行时,也就是重复匹配时;会默认更改最后匹配到的行内容;

删除时,用命令 ansible westos -m lineinfile -a 'path=/mnt/westos state=absent regexp="test"' ,如果匹配的多行的内容都会被删除;

加上 backrefs 参数,当内容无匹配规则时不对文件做任何更改,默认值为no;还可以向后引用 regexp 变量信息;
用命令 ansible westos -m lineinfile -a 'path=/mnt/westos line="hello kkk" regexp="test" 来测试当没有匹配规则时的情况;
可以看到当没有匹配规则时会默认添加内容;

当加上 backrefs 参数之后,此时没有匹配到内容不再做修改;

向后索引 regexp 的值,当写入 'path=/mnt/westos regexp="(h.{4}).*(w.{5})" line="\1"' 表示regexp 的值是个变量,将匹配到的变量值第一个写入;
默认不会识别变量值;

加入 backrefs 参数之后,所有的变量值会向后延伸,便会采集到变量值;

参数 insertafter 可以将文本插入到 “指定的行” 之后,insertafter参数的值可以设置为 EOF 或者正则表达式;
在指定的关键字后面添加:

在最后一行添加:

参数 insertbefore可以将文本插入到 “指定的行” 之前,insertbefore参数的值可以设置为 BOF 或者正则表达式;
在指定的行之前添加:

在在第一行添加:

用参数 backup 在文件更改之前对文件进行备份;


5.18 replace
- 作用:replace 模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换;
- 常用参数
参数 | 含义 |
path | 指定要操作的文件 |
regexp | 指定一个正则表达式,文件中与正则匹配的字符串将会被替换。 |
replace | 指定最终要替换成的字符串 |
backup | 是否在修改文件之前对文件进行备份,最好设置为yes |
用命令 ansible westos -m replace -a 'path=/mnt/westos regexp="hello" replace="kkk" ' 来将单个字符做替换;

可以用参数 backup 来做备份替换;


5.19 setup
- 作用:setup模块用于收集远程主机的一些基本信息
- 常用参数
参数 | 含义 |
filter | 用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息 |
用命令 ansible westos -m setup 来采集受控主机的信息;
用命令 ansible westos -m setup | less 来将采集的信息分页浏览,在分页浏览中搜索需要查看的信息;

从受控主机中采集需要的信息;


5.20 debug
- 作用:调试模块,用于在调试中输出信息
- 常用参数
参数 | 含义 |
msg | 调试输出的消息 |
var: | 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出 |
verbosity: | debug的级别(默认是0级,全部显示) |
用命令 ansible westos -m debug -a 'msg="hello world"' 调试输出的信息;

用参数 verbosity 来控制显示的级别,数字越大,显示的信息越少;

参数 var 用于做变量的输出,不能单独用 debug 来做,要结合其他的方式来实现其效果;
现将其结合 playbook 来观察效果;
编辑一个 playbook 的剧本;

playbook 在执行的时候默认会执行 setup;
当文件内容书写正确时,此时在执行时会获得到变量的信息,如下图所示:

当书写的变量不能被识别时,会提示变量值不存在;

如果写入的是,msg 便会将其识别为字符串显示出来,效果如下图所示:

















