S_lion's Studio

(五)ansible常用模块

字数统计: 4.9k阅读时长: 18 min
2021/08/29 Share

ansible基于模块工作,ansible 2.9.24版本已经有3387个模块了,当然这些模块不需要也没精力全懂,但了解些常用模块的使用方式对日常运维过程中大有脾益。

1
2
3
4
5
6
7
8
9
[root@slions_pc1 ansible]# ansible --version
ansible 2.9.24
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
[root@slions_pc1 ansible]# ansible-doc -l|wc -l
3387

命令相关的模块

command

ansible ad-hoc的默认模块,用于在被控主机执行命令,其中要注意的是:"<", ">", "|", ";", "&","$"等特殊字符不能在command模块中使用,如果需要使用,则用shell模块。

1
2
3
4
5
6
7
8
[root@slions_pc1 ansible]# ansible-doc -s command
- name: Execute commands on targets
command:
chdir: # 在执行命令之前,先切换到该目录
creates: # 当指定的文件存在时,就不执行对应命令
free_form: # 要执行的Linux指令,一般使用Ansible的-a参数代替。
removes: # 当指定的文件不存在时,就不执行对应命令
executable: # 切换shell来执行命令,需要使用命令的绝对路径,如/bin/bash

shell

专门用来执行shell命令的模块,和command模块一样,参数基本一样,都有chdir,creates,removes等参数,但是支持解析特殊 shell 符号

1
2
3
4
5
6
7
8
[root@slions_pc1 ansible]# ansible-doc -s shell
- name: Execute shell commands on targets
shell:
chdir: # 在执行命令之前,先切换到该目录
creates: # 当指定的文件存在时,就不执行对应命令
free_form: # 要执行的Linux指令,一般使用Ansible的-a参数代替。
removes: # 当指定的文件不存在时,就不执行对应命令
executable: # 切换shell来执行命令,需要使用命令的绝对路径,如/bin/bash

在ansible中使⽤shellcommand模块⼀定要注意,它们默认不满足幂等性,很多操作会重复执⾏,但有些操作是不允许重复执⾏的。例如mysql的初始化命令mysql_install_db,它只能在第⼀次配置的过程中初始化⼀次,其他任何时候如⾮需要则不允许执⾏。这时候要实现幂等性,可以通过模块的creates和removes选项进⾏判断,但⽆论如何,在执⾏这两个模块的时候都需要考虑要执⾏的命令是否应该实现幂等性。

raw

执行底层 shell 命令。command shell 模块都是通过目标主机上的 python 代码启动 /bin/bash 来执行命令的,但目标主机上可能没有安装 python,这时只能使用 raw 模块在远程主机上直接启动

1
2
3
4
5
[root@slions_pc1 ansible]# ansible-doc -s raw
- name: Executes a low-down and dirty command
raw:
executable: # 切换shell来执行命令,需要使用命令的绝对路径,如/bin/bash
free_form: # 要执行的Linux指令,一般使用Ansible的-a参数代替。

script

在远程主机上执行脚本文件 ,在执行脚本前,ansible会将本地脚本传输到远程主机,然后再执行。执行脚本的时候,其采用的是远程主机上的shell环境。和 raw 模块一样,不要求目标主机上已经装好 python

1
2
3
4
5
6
7
[root@slions_pc1 ansible]# ansible-doc -s script
- name: Runs a local script on a remote node after transferring it
script:
chdir: # 执行之前,先cd到指定目录在执行命令
creates: # 当指定的文件存在时,就不执行对应命令
executable: # 切换shell来执行命令,需要使用命令的绝对路径,如/bin/bash
removes: # 当指定的文件不存在时,就不执行对应命令

上述这四个模块都不限于执行shell命令或shell脚本,可以通过executable参数指定其它解释器,比如expect执行expect脚本、perl解释器执行perl脚本等等。

文件相关的模块

file

用于对文件的处理,创建,删除,权限控制等,file算是最常用的模块之一了,支持的参数比较多,以下列举常用的。需要注意的是,file模块可以递归创建⽬录,但是不能在不存在的⽬录中创建⽂件,只能先创建⽬录,再在此目录中创建⽂件。

1
2
3
4
5
6
7
8
9
10
11
12
13
force          # 需要在两种情况下强制创建软连接,一种是源文件不存在但之后会建立的情况下;另一种是目标连接已存在,需要先取消之前的软连接,有两个选项:yes|no
group          # 设置文件或目录的属组
mode           # 设置文件或目录的权限
owner          # 设置文件或目录的属主
path=          # 必选项,定义文件或目录的路径
recurse        # 递归设置文件的属性,只对目录有效
src            # 要被链接到的路径,只应用与state=link的情况
state # directory:如果⽬录不存在则递归创建
# file:⽂件不存在时,不会被创建(默认值)
# touch:touch由path指定的⽂件,即创建⼀个新⽂件,或修改其mtime和atime
# link:修改或创建软链接
# hard:修改或创建硬链接
# absent:⽬录和其中的⽂件会被递归删除,⽂件或链接将取消链接状态

copy

可以复制目录或文件,修改目录或文件属性,生成文件内容。

1
2
3
4
5
6
7
8
9
10
backup          # 创建一个备份文件包括时间戳信息,如果以某种方式重创错了,还可以拿回原始文件
content         # 取代src=,表示直接用此处指定的信息生成为目标文件内容;
dest=           # 远程节点存放文件的路径,必须是绝对路径
directory_mode  # 递归复制设置目录权限,默认为系统默认权限
remote_src # 如果这个值设置为True,将到远程/目标主机的机器上搜索
force           # 如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果设置为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
group           # 复制到远程主机后,指定文件或目录的属组
mode            # 复制到远程主机后,指定文件或目录权限,类似与 `chmod'指明如 0644
owner           # 复制到远程主机后,指定文件或目录属主
src             # 指定复制的源文件,可以是相对路径或者绝对路径,如果给出的源是目录,那么会把目录下的所有文件都复制过去

fetch

用于从被管理机器上面拉取文件,拉取下来的内容会保留目录结构,可用于收集被管理机器的日志文件等。

1
2
3
4
5
dest                # 用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile
fail_on_missing # 当源文件不存在的时候,标识为失败
flat # 允许覆盖默认行为从hostname/path到/file的,如果dest以/结尾,它将使用源文件的基础名称
src # 在远程拉取的文件,并且必须是一个file,不能是目录
validate_checksum # 当文件fetch之后进行md5检查

用户相关的模块

user

用于对用户账号的管理,用户的创建、删除、家目录、属组等设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
comment          # 用户的描述信息
createhome # 是否创建家目录
force # 在使用`state=absent'是, 行为与`userdel --force'一致.
group # 指定基本组,此组要是存在的
groups # 指定附加组,如果指定为('groups=')表示删除所有组
home # 指定用户家目录
move_home # 如果设置为`home='时, 试图将用户主目录移动到指定的目录
name= # 指定用户名
password # 此参数用于指定用户的密码。但是这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,相当于/etc/shadow 文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在 python 的命令提示符下输入如下命令,生成明文密码对应的加密字符串。import crypt; crypt.crypt('666666')
remove # 当 state 的值设置为 absent 时,表示要删除远程主机中的用户。但是在删除用户时,不会删除用户的家目录等信息,这是因为 remove 参数的默认值为 no,如果设置为yes,在删除用户的同时,会删除用户的家目录。
shell # 指定默认shell
state # 设置帐号状态,不指定为创建,指定值为absent表示删除
system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户。
uid # 指定用户的uid
update_password # 更新用户密码

group

用于对用户组的管理,用户组的创建、删除。

1
2
3
4
gid         # 设置组的GID号
name= # 管理组的名称
state # 指定组状态,默认为创建,设置值为absent为删除
system # 设置值为yes,表示为创建系统组

软件包相关的模块

yum

软件包管理,下载、安装、卸载、升级等操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
name            # 指定要操作的软件包名字
download_dir # 指定下载软件包的存放路径,需要配合download_only一起使用
download_only # 只下载软件包,而不进行安装,和yum --downloadonly一样
disablerepo # 不启用某个源
enablerepo # 启用某个源
list:
installed # 列出所有已安装的软件包
updates # 列出所有可以更新的软件包
repos # 列出所有的yum仓库
state:
installed, present # 安装软件包(两者任选其一都可以)
removed, absent # 卸载软件包
latest # 安装最新软件包

yum_repository

yum源的管理,配置与删除。

1
2
3
4
5
6
7
8
name           # 指定repo的名称,对应于repo文件中的[name]
description # repo的描述信息,对应于repo文件中的name: xxx
baseurl # 指定该repo的路径
file # 指定repo的文件名,不需要加上.repo后缀,会自动加上
reposdir # repo文件所在的目录,默认为/etc/yum.repos.d目录
enabled # 是否启用该repo,对应于repo文件中的enabled
gpgcheck # 该repo是否启用gpgcheck,对应于repo文件中的gpgcheck
state # present表示保证该repo存在,absent表示移除该repo

计划任务相关的模块

cron

用于指定计划任务,和crontab -e一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
backup            # 如果设置,创建一个crontab备份
cron_file # 如果指定, 使用这个文件cron.d,而不是单个用户crontab
job # 指明运行的命令是什么
day # 日应该运行的工作( 1-31, *, */2, etc )
hour # 小时 ( 0-23, *, */2, etc )
minute # 分钟( 0-59, *, */2, etc )
month # 月( 1-12, *, */2, etc )
weekday # 周 ( 0-6 for Sunday-Saturday, *, etc )
name # 定时任务描述
reboot # 任务在重启时运行,不建议使用,建议使用special_time
special_time # 特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state # 指定状态,prsent表示添加定时任务,也是默认设置,absent表示删除定时任务
user # 以哪个用户的身份执行

服务相关的模块

service

服务模块,用于对服务进行管理,服务的启动、关闭、开机自启等。

1
2
3
4
5
6
7
name            # 指定需要管理的服务名
enabled # 指定是否开机自启动
state: # 指定服务状态
started # 启动服务
stopped # 停止服务
restarted # 重启服务
reloaded # 重载服务

systemd

服务模块,用于对服务进行管理,服务的启动、关闭、开机自启等。

1
2
3
4
5
6
7
8
name            # 指定需要管理的服务名
state: # 指定服务状态
started # 启动服务
stopped # 停止服务
restarted # 重启服务
reloaded # 重载服务
enabled # 是否需要开机启动
daemon_reload # systemd 读取配置文件,每次修改了文件,最好都运行一次,确保应用了

文件内容修改相关的模块

lineinfile

单行修改。文件内容修改、在某行前面添加一行、在某行后面添加一行、删除某一行、末尾加入一行、替换或添加某一行(如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换)

1
2
3
4
5
6
7
8
9
10
path          # 指定要操作的文件。
line # 使用此参数指定文本内容。
regexp # 使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。如果regexp指定的正则表达式匹配失败,则行将插入在文件尾部。
state # absent表示删除,默认为present。
backrefs # 默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。
insertafter # 将文本插入到“指定的行”之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
insertbefore # 将文本插入到“指定的行”之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
backup # 是否在修改文件之前对文件进行备份。
create # 当要操作的文件并不存在时,是否创建对应的文件。
firstmatch #insertbefore和insertafter指定的正则表达式如果匹配了多行,则默认选中最后一个匹配行,然后在被选中的行前、行后插入。如果明确要指定选中第一次匹配的行,则指定参数=yes

lineinfile比较常用的功能是regexp结合insertbefore或结合insertafter。这时候的行将根据insertXXX的位置来插入,而regexp参数则充当幂等性判断参数:只有regexp匹配失败时,insertXXX才会插入行。

1
2
3
4
5
- lineinfile:
path: "a.txt"
line: "hello line"
regexp: '^hello'
insertbefore: '^para.* 2'

这表示将”hello line”插入在paragraph 2行的前面,但如果再次执行,则不会再次插入,因为regexp参数指定的正则表达式已经能够已经存在的”hello line”行。

所以,当regexp结合insertXXX使用时,regexp的参数通常都会设置为能够匹配插入之后的行的正则表达式,以便实现幂等性。

blockinfile

在指定的文件中插入”一段文本”,这段文本是被标记过的,后续可以通过”标记”找到这段文本,然后修改或者删除它。

1
2
3
4
5
6
7
8
path         # 必须参数,指定要操作的文件。
block # 用于指定我们想要操作的那”一段文本”,此参数有一个别名叫”content”,使用content或block的作用是相同的。
marker # 假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为'# BEGIN ANSIBLE MANAGED BLOCK',结束标记为'# END ANSIBLE MANAGED BLOCK',我们可以使用marker参数自定义”标记”。比如,marker=#{mark}test ,这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test,没错,{mark}会自动被替换成开始标记和结束标记中的BEGIN和END,我们也可以插入很多段文本,为不同的段落添加不同的标记,下次通过对应的标记即可找到对应的段落。
state # state参数有两个可选值,present与absent,默认情况下,我们会将指定的一段文本”插入”到文件中,如果对应的文件中已经存在对应标记的文本,默认会更新对应段落,在执行插入操作或更新操作时,state的值为present,默认值就是present,如果对应的文件中已经存在对应标记的文本并且将state的值设置为absent,则表示从文件中删除对应标记的段落。
insertafter # 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。
insertbefore # 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。
backup # 是否在修改文件之前对文件进行备份。
create # 当要操作的文件并不存在时,是否创建对应的文件。

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@slions_pc1 ansible]# cat test.yml
- hosts: test
tasks:
- blockinfile:
path: /etc/hosts
marker: "#{mark}"
block: |
aaa
ccc
bbb
123.234 {{ ansible_hostname }}
state: present
insertbefore: '1.2.3.4'
[root@slions_pc1 ansible]# ansible-playbook test.yml
[root@slions_pc1 ansible]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#BEGIN
aaa
ccc
bbb
123.234 slions_pc1
#END
1.2.3.4

replace

多行修改。根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。

1
2
3
4
path          # 指定要操作的文件
regexp # 使用正则表达式匹配对应的行
replace # 指定最终要替换成的字符串。
backup # 是否在修改文件之前对文件进行备份,最好设置为yes。

系统信息相关的模块

setup

收集远程主机的一些基本信息。

1
filter        # 用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 常用的过滤选项
ansible_all_ipv4_addresses # 所有的ipv4地址
ansible_all_ipv6_addresses # 所有的ipv6地址
ansible_architecture # 系统的架构
ansible_date_time # 系统时间
ansible_default_ipv4 # 系统的默认ipv4地址
ansible_distribution # 系统名称
ansible_distribution_file_variety # 系统的家族
ansible_distribution_major_version # 系统的版本
ansible_domain # 系统所在的域
ansible_fqdn # 系统的主机名
ansible_hostname # 系统的主机名,简写
ansible_os_family # 系统的家族
ansible_processor_cores # cpu的核数
ansible_processor_count # cpu的颗数
ansible_processor_vcpus # cpu的个数

sysctl

修改系统的内核参数。

1
2
3
4
5
6
name                 # 变量名
value # 值
reload # 文件被更新时,是否使用 sysctl -p reload 文件
state # 是在文件中 移除(absent)或者设置(present)
sysctl_file # 如果不是默认文件,指定其他文件
sysctl_set # 使用sysctl 命令设置,不一定需要reload 文件

官方文档

https://docs.ansible.com/ansible/2.8/modules/modules_by_category.html

CATALOG
  1. 1. 命令相关的模块
    1. 1.1. command
    2. 1.2. shell
    3. 1.3. raw
    4. 1.4. script
  2. 2. 文件相关的模块
    1. 2.1. file
    2. 2.2. copy
    3. 2.3. fetch
  3. 3. 用户相关的模块
    1. 3.1. user
    2. 3.2. group
  4. 4. 软件包相关的模块
    1. 4.1. yum
    2. 4.2. yum_repository
  5. 5. 计划任务相关的模块
    1. 5.1. cron
  6. 6. 服务相关的模块
    1. 6.1. service
    2. 6.2. systemd
  7. 7. 文件内容修改相关的模块
    1. 7.1. lineinfile
    2. 7.2. blockinfile
    3. 7.3. replace
  8. 8. 系统信息相关的模块
    1. 8.1. setup
    2. 8.2. sysctl
  9. 9. 官方文档