文章目录
- Ansible 常用模块
- 简介
- yum模块
- copy模块
- selinux模块
- systemd模块
- sysctl模块
- blockinfile 模块
- shell/command模块
- unarchive模块
- archive模块
- template模块
- stat模块
- debug 模块
- wait_for模块
- fail模块
- get_url模块
- script模块
- user模块
- synchronize模块
- cron模块
- file模块
- authorized_key模块
- 参考文档
Ansible 常用模块
简介
Ansible内置了许多Module,这些Module可以用于控制系统资源,比如services,packages,文件等,利用这些Module通过playbook可以编排出复杂的各种任务,这里主要介绍几个常用的模块
yum模块
通过yum包管理器,支持对包安装/升级/卸载等处理,这个模块使用的是python2去进行管理,如果是CentOS8,redhat8等操作系统,默认python解释器版本为python3,可以使用dnf
模块。
常用参数 | 描述 |
name | 包名,也可以指定本地需要安装的包路径, |
state | absent/remove,表示卸载,present/install表示安装 |
list | 查看指定的包状态信息,与name参数互斥 |
playbook示例:
$ cat yum.yml
---
- hosts: 192.168.240.33
tasks:
# 安装多个包
- name: install package
yum:
name: "{{ packages }}"
state: installed
vars:
packages:
- httpd
- httpd-tools
# 卸载多个包
- name: remove package
yum:
name: "{{ packages }}"
state: absent
vars:
packages:
- httpd
- httpd-tools
# 列出指定的包信息,注册到result变量,再用debug输出信息
- name: list ansible packages
yum:
list: httpd
register: result
- name: print result msg
debug:
msg: "{{ result }}"
# 此任务输出信息如下
#TASK [print result msg] *****************************************************************************************************************
#ok: [192.168.240.33] => {
# "msg": {
# "changed": false,
# "failed": false,
# "results": [
# {
# "arch": "x86_64",
# "envra": "0:httpd-2.4.6-90.el7.centos.x86_64",
# "epoch": "0",
# "name": "httpd",
# "release": "90.el7.centos",
# "repo": "base",
# "version": "2.4.6",
# "yumstate": "available"
# }
# ]
# }
#}
注意事项:
- 使用yum安装多个包的时候,不能简单使用
with_item
进行循环,这种方式在未来会被舍弃,官方推荐的是,设置一个列表变量,直接一次性安装一个列表变量的包清单 - yum模块安装如果是普通用户执行可能会显示权限不足,可以预先设置好sudo权限,普通用户sudo执行,或者直接用root执行
- 如果正在执行yum模块然后ctrl + c 中断掉可能会导致下一次执行yum任务的时候报错,显示 有进程正在用yum,lockfile…,但是登录到相关机器ps看进程找不到yum相关进程,这个问题的原因暂时没有找到,但是有一个临时的解决方法: 去每台机器随便安装个东西,然后就可以解锁了。。。。
ansible all -m shell -a 'yum install gcc -y'
,只是临时的解决方式,最好进行yum任务的时候,不要中断
copy模块
copy模块用于从本地复制文件到远端的服务器上,如果文件的内容需要用到变量,可以使用template
模块,
参数 | 描述 |
backup | yes/no,如果远端服务器上已有,是否将远端服务器的文件备份,默认否 |
content | “string”,将文件的内容直接设置为指定的值 |
dest | 远端服务器的路径,如果src是目录,则dest也需要是一个目录路径,如果dest是一个不存在的路径或者以’/'结尾,或者src是一个目录,dest路径会被生成 |
src | 需要复制的本地文件/目录路径,如果copy模块在roles中,这里就可以直接写文件名,会自动去files对应的role下找文件。 |
group | 文件/目录属组名 |
owner | 文件/目录属主名 |
mode | 具体权限 |
playbook示例:
$ cat copy.yml
---
- hosts: 192.168.240.33
tasks:
# 测试content参数,直接写入字符串到指定文件
- name: test concent
copy:
content: "hello world"
dest: /tmp/hello.txt
group: ansible
owner: ansible
mode: '0644'
# cat目标机器可以看到文本已经生成
# $cat /tmp/hello.txt
# hello world
# 测试 backup 参数
- name: test backup
copy:
src: /tmp/hello.txt
dest: /tmp/Hello.txt
backup: yes
group: ansible
owner: ansible
mode: "0644"
# ll /tmp/Hello.txt*
# -rw-r--r--. 1 ansible ansible 11 Nov 24 15:19 /tmp/Hello.txt
# -rw-r--r--. 1 ansible ansible 5 Nov 24 15:19 /tmp/Hello.txt.52755.2019-11-24@15:19:56~
#
# 当文件内容发生变化,会将原文件备份加一串时间戳字符串,方便回滚
# 将/root/目录下的文件传送到/tmp目录下
- name: test copy dirctory
copy:
src: /root/
dest: /tmp
group: ansible
owner: ansible
# 此任务会将/root目录下的文件,copy到/tmp目录下
selinux模块
selinux模块用于管理selinx的状态和策略,需要注意的事,如果要将开启状态的selinux改成disable需要重启服务器。
参数 | 描述 |
configfile | 配置文件路径,默认 |
policy | SELinux的策略 |
state | The SELinux mode. |
playbook示例:
$ cat selinux.yml
- hosts: 192.168.240.33
tasks:
- name: set selinux state is permissive
selinux:
policy: targeted
state: permissive
- name: Disable SeLinux
selinux:
state: disabled
备注:
如果单一设置为disabled状态,这时候系统需要重启才生效,所以可以考虑分2步,第一步先许可,然后再disabled,这时候就能保证selinux执行playbook之后就一定是关闭/许可状态。
systemd模块
systemd模块用于管理服务状态
参数 | 描述 |
daemon_reload | 任何操作之前先执行 |
enabled | 设置是否开机启动, |
name | 服务名称 |
state |
|
playbook示例:
$ cat systemd.yml
---
- hosts: 192.168.240.33
tasks:
- name: Stop and Disable service
systemd:
name: "{{ item }}"
state: stopped
enabled: no
with_items:
- firewalld
- irqbalance
sysctl模块
sysctl模块管理sysctl.conf文件,可用来管理内核参数
参数 | 描述 |
name | 指定sysctl支持的变量,内核参数可以在这里管理 |
state | 定义该值是否应该在sysctl文件中存在, |
sysctl_file | 设置 |
value |
|
playbook示例:
---
- hosts: 192.168.240.33
tasks:
- name: Setting present kernel params
sysctl:
name: "{{ item.name }}"
value: "{{ item.value }}"
ignoreerrors: yes
state: present
with_items:
- { name: 'net.core.rmem_default', value: 8388608 }
- { name: 'net.core.rmem_max', value: 16777216 }
- { name: 'net.core.wmem_default', value: 8388608 }
- { name: 'net.core.wmem_max', value: 16777216 }
- { name: 'net.ipv4.igmp_max_memberships', value: 512 }
- { name: 'net.ipv4.conf.bond0.force_igmp_version', value: 2 }
- { name: 'vm.max_map_count', value: 655360 }
blockinfile 模块
插入/更新/移除被标记线包围的文本信息
参数 | 描述 |
backup | yes/no,如果为 |
block | 要插入标记行内的文本,如果为空串这个块会被删除 |
create | yes/no,如果此文件不存在,创建一个新文件,默认no |
group | 文件属组 |
owner | 文件属主 |
mode | 文件权限 |
path | 文件的路径 |
state | block块文本信息是的状态,默认present,不存在则填写absent |
marker_end | 会替换掉标记信息的{mark}作为标识块的结尾 |
marker_begin | 会替换掉标记信息的{mark}作为标识块的开始 |
marker | 标记信息,标记信息的模板,默认"# {mark} ANSIBLE MANAGED BLOCK" |
insertbefore | 与 |
insertafter | 如果使用这个参数,将会再最后一次匹配到正则表达式之后插入块, |
playbook示例:
$ cat blockfile.yml
---
- hosts: 192.168.240.33
tasks:
- name: Update /etc/security/limits.conf
blockinfile:
dest: /etc/security/limits.conf
insertbefore: '# End of file'
block: |
* soft nofile 131072
* hard nofile 131072
* soft core unlimited
* hard core unlimited
* soft memlock unlimited
* hard memlock unlimited
在 /etc/security/limits.conf 会确保如下block存在
# BEGIN ANSIBLE MANAGED BLOCK
* soft nofile 131072
* hard nofile 131072
* soft core unlimited
* hard core unlimited
* soft memlock unlimited
* hard memlock unlimited
# END ANSIBLE MANAGED BLOCK
备注:如果手动删除标识符,会导致无法正确定位到块
shell/command模块
在目标机器上执行命令,shell和command模块的用法基本一致,区别在于,shell模块执行命令使用的是shell解释器,command不能解析变量和某些操作符("|","<",">"等),所以如果一定要使用这些操作符的时候需要使用shell模块,其他情况都推荐使用command
参数 | 描述 |
cmd | 执行的命令 |
creates | 如果指定的文件存在,则不执行,用于保证幂等性 |
removes | 如果指定的文件不存在,则不执行,用于保证幂等性 |
chdir | 如果此参数设置了,执行命令时会先切换到这个目录下 |
shell模块playbook示例:
$ cat shell.yml
---
- hosts: 192.168.240.33
tasks:
# 下面两个任务等价,当存在/tmp/fstab文件,则这个shell任务不执行
- name: test shell
shell:
cmd: cat /etc/fstab > /tmp/fstab
creates: /tmp/fstab
register: shell_result
- name: test shell
shell: cat /etc/fstab > /tmp/fstab
args:
creates: /tmp/fstab
register: shell_result
- name: print shell result msg
debug:
msg: "{{ shell_result }}"
command模块playbook示例:
$ cat command.yml
---
- hosts: 192.168.240.33
tasks:
- name: test command
shell:
cmd: cat /etc/fstab
register: command_result
- name: print command result msg
debug:
msg: "{{ command_result }}"
commad/shell模块执行之后的结果可以注册成变量,可以看到有如下信息
key | 描述 |
cmd | task中执行的命令 |
delta | 命令执行的时间耗时 |
end | 命令执行的结束时间 |
changed | 是否发生变更 |
start | 命令执行的启动时间 |
rc | 命令执行完成的返回值 |
stderr | 命令的标准错误输出 |
stdout | 命令的标准输出 |
stdout_lines | 列表,命令执行完成后,对输出结果每行切分,形成列表 |
示例如下:
ok: [192.168.240.33] => {
"msg": {
"changed": true,
"cmd": "cat /etc/fstab",
"delta": "0:00:00.134274",
"end": "2019-11-24 18:20:54.641665",
"failed": false,
"rc": 0,
"start": "2019-11-24 18:20:54.507391",
"stderr": "",
"stderr_lines": [],
"stdout": "\n#\n# /etc/fstab\n# Created by anaconda on Tue Aug 27 09:30:03 2019\n#\n# Accessible filesystems, by reference, are maintained under '/dev/disk'\n# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info\n#\n/dev/mapper/centos-root / xfs defaults 0 0\nUUID=4e742da0-c66f-4483-805e-c7c25d2ede83 /boot xfs defaults 0 0\n/dev/mapper/centos-swap swap swap defaults 0 0",
"stdout_lines": [
"",
"#",
"# /etc/fstab",
"# Created by anaconda on Tue Aug 27 09:30:03 2019",
"#",
"# Accessible filesystems, by reference, are maintained under '/dev/disk'",
"# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info",
"#",
"/dev/mapper/centos-root / xfs defaults 0 0",
"UUID=4e742da0-c66f-4483-805e-c7c25d2ede83 /boot xfs defaults 0 0",
"/dev/mapper/centos-swap swap swap defaults 0 0"
]
}
}
unarchive模块
unarchive模块用于解压包到远端服务器
参数 | 描述 |
src | 本地压缩包地址 |
dest | 解压到远端服务器的路径 |
remote_src | yes/no,远端服务器是否存在这个包,如果存在则直接在远端解压即可,与copy互斥 |
copy | yes/no,如果为yes,文件将从本地拷贝到远端服务器 |
creates | 如果指定绝对路径已经存在,这一步不会运行 |
group | 指定属组 |
owner | 指定属主 |
mode | 指定权限信息 |
playbook示例
$ cat unarchive.yml
---
- hosts: 192.168.240.33
tasks:
- name: unarchive module
unarchive:
src: /home/ansible/ADT/Packages/ansible-2.8.1.tar.gz # 本机包的路径
dest: /tmp/ # 远端主机包路径
creates: /tmp/ansible-2.8.1 # 如果远端此目录已经存在,则不执行此任务
copy: yes # 将包从本机拷贝到远端服务器
owner: ansible # 属主
group: ansible # 属组
mode: '0755' # 目录权限信息
结果:
$ ll /tmp/ansible-2.8.1 -d
drwxr-xr-x. 2 ansible ansible 4096 Jul 21 00:37 /tmp/ansible-2.8.1
已经解压完成,如果再次运行示例的playbook,不会重新覆盖,而是skip了。
archive模块
archive模块用于打包归档,与unarchive模块相反,归档后可以通过指定remove=true删除源文件
参数 | 描述 |
dest | 归档后包的路径以及文件名 |
group | 归档后包的属组 |
mode | 归档后包的权限信息 |
owner | 归档后包的属主 |
path | 远端归档源 |
remove | 是否删除源文件 |
format | 打包的格式,默认gz,可选项有bz2,gz,tar,xz,zip |
playbook示例:
$ cat archive.yml
---
- hosts: 192.168.240.33
tasks:
- name: archive module
archive:
path: /tmp/ansible-2.8.1 # 远端服务器归档源
dest: /home/ansible/ansible-2.8.1.tgz # 本地服务器归档文件路径
remove: no # 是否删除源文件
format: gz # 打包压缩格式为gz
mode: '0644' # 包的权限信息
owner: ansible # 包的属主
group: ansible # 包的属组
- name: archive some file
archive:
path:
- /etc/fstab
- /etc/passwd
dest: /home/ansible/info.tgz
remove: no
format: gz
mode: '0644'
owner: ansible
group: ansible
template模块
template模块将模板文件传输到远端的服务器指定路径下,这个模块非常强大,利用jinja2引擎可以做非常多变量替换,判断,循环等操作。这里只介绍template模块,具体的jinja2语法这里先不涉及
参数 | 描述 |
backup | yes/no,拷贝的时候如果远端服务器已有这个文件会将原文件备份,备份文件包含一个时间戳的文件名,方便回滚 |
dest | 目标文件路径 |
src | 本地文件路径,如果在role中使用template模块会自动去对应的role下的template目录找文件,因此可以不写文件名 |
validate | 在复制到指定位置之前要运行的验证命令,临时文件路径通过%s传递,如果验证命令执行失败则不会复制到指定位置,这里主要用于编写配置文件的时候可以进行语法检查,当没有问题了再进行覆盖 |
mode | 文件权限信息 |
owner | 文件属主 |
group | 文件数组 |
template示例的模板文件如下
$ cat template.txt
{{ ansible_host }} # ansible_host变量表示当前连接的主机ip
template playbook 示例文件如下:
$ cat template.yml
---
- hosts: 192.168.240.33
tasks:
- name: template module
template:
src: /home/ansible/ADT/template.txt
dest: /tmp/template.txt
owner: ansible
group: ansible
mode: '0644'
backup: yes
validate: touch %s # 复制到适当位置之前运行一次touch命令。 ansible会先将文件拷贝到远端服务器,然后再拷贝到指定的位置,这里的%s指的是临时存放此文件的绝对路径
执行结果
$ cat /tmp/template.txt
192.168.240.33
stat模块
stat模块用于检测文件或文件系统状态
参数 | 描述 |
path | 要检测的对象路径 |
stat示例:
$ cat stat.yml
---
- hosts: 192.168.240.33
tasks:
- name: get /etc/fstab stat
stat:
path: /etc/fstab
register: stat_return
- name: print stat_return
debug:
msg: "{{ stat_return }}"
返回值信息有非常多的内容,常用的有以下几个信息
key | 描述 |
atime | 文件的atime值 |
ctime | 文件的ctime值 |
executable | 是否有执行权限 |
exists | 是否存在 |
gid | gid值 |
inode | inode号 |
isdir | 是否是目录 |
isgid | 调用的gid是否与属组的gid匹配 |
isuid | 调用的uid是否与属主的uid匹配 |
mode | 权限信息 |
mtime | 文件的mtime值 |
path | 文件路径 |
readable | 是否有读权限 |
size | 文件大小 |
uid | 文件uid值 |
writeable | 是否有写权限 |
debug 模块
debug模块用于输出一些debug信息
参数 | 描述 |
verbosity | 控制调试的层级,如果设置为3,执行的时候需要使用-vvv才会输出信息 |
msg | 自定义输出的信息,默认"Hello world!" |
var | 变量值内容 |
playbook示例如下:
# 输出主机的所有变量信息
$ cat debug.yml
---
- hosts: 192.168.240.33
tasks:
- name: -vvvv
debug:
var: hostvars[inventory_hostname]
verbosity: 2
wait_for模块
wait_for模块,当某些状态满足条件之后,才会继续往下执行task
参数 | 描述 |
delay | 开始检查前等待的秒数,默认0 |
host | 可解析的主机名/ip,因为一台机器上可能有多个IP,这里可以指定监控哪个IP/主机名状态 |
port | 等待端口处于启动状态 |
path | 等待path文件存在。与port参数互斥,可以利用这个检查进程/proc/进程号 |
search_regex | 在文件中进行正则匹配,匹配成功才会继续 |
state | present/started/stopped/absent/drained。默认started,当检查端口时,started表示等待端口打开,stopped表示等待端口关闭,当检查的是文件时,present/started检查到文件才会继续,absent检查到文件不存在才会继续 |
sleep | 两次检查的间隔 |
timeout | 检查的超时时间 |
playbook示例:
$ cat wait_for.yml
---
- hosts: 192.168.240.33
tasks:
- name: wait for 80 port
wait_for:
host: 192.168.240.33
port: 80
delay: 1
state: started
sleep: 1
timeout: 3
fail模块
fail模块用于自定义错误信息,与debug类似,但是这个模块可以用于检查某些状态是否执行完成,如果不符合预期,则抛出错误,但是debug试试输出信息,不会抛出错误
参数 | 描述 |
msg | 报错信息 |
playbook示例:
$ cat fail.yml
---
- hosts: 192.168.240.33
tasks:
- name: fail module
fail:
msg: " fail !"
执行之后的结果如下
$ ansible-playbook fail.yml
PLAY [192.168.240.33] *****************************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************************
ok: [192.168.240.33]
TASK [fail module] ********************************************************************************************************************************************************************************************
fatal: [192.168.240.33]: FAILED! => {"changed": false, "msg": " fail !"}
PLAY RECAP ****************************************************************************************************************************************************************************************************
192.168.240.33 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
get_url模块
get_url模块用于从指定的ftp,http,httpsurl下载文件
参数 | 描述 |
backup | yes/no,如果文件已经存在,覆盖之前会创建包含时间戳的备份文件 |
dest | 从url下载的文件存放路径 |
tmp_dest | 临时文件存放目录 |
owner | 设置下载的文件属主 |
group | 设置下载的文件属组 |
url | 下载的url路径 |
timeout | 请求url的超时时间 |
mode | 指定文件的权限 |
playbook示例:
$ cat get_url.yml
---
- hosts: 192.168.240.33
tasks:
- name: get url
get_url:
backup: yes
mode: '0644'
owner: ansible
group: ansible
timeout: 10
dest: /home/ansible/
url: http://mirrors.163.com/.help/CentOS7-Base-163.repo # 测试拉取网易镜像站的centos7 yum源配置文件
script模块
script模块,将本地的脚本传输到远端,然后执行
参数 | 描述 |
cmd | 执行的脚本命令 |
creates | 当文件在远端服务器存在时,不执行脚本 |
removes | 当文件在远端服务器不存在时,不执行脚本 |
测试脚本文件:
$ cat script.sh
echo "hello world" > /tmp/script.txt
playbook示例:
$ cat script.yml
---
- hosts: 192.168.240.33
tasks:
- name: script module
script:
cmd: /home/ansible/ADT/script.sh
creates: /tmp/script.txt
user模块
管理系统用户账号
参数 | 描述 |
name | 用户名 |
password | 密码,这里的密码是加密字符串,不能是密码,需要用 |
state | present/absent,创建还是删除用户 |
system | 是否设置成系统账户 |
createhome | 是否创建家目录 |
group | 设置用户的组名 |
shell | shell解释器 |
remove | 配合state的absent使用,如果删除用户是否删除家目录文件 |
home | 指定家目录路径 |
playbook示例
$ cat user.yml
---
- hosts: 192.168.240.33
tasks:
- name: create user t1
user:
name: t1
password: $1$Xjkqc/V8$DLJdGqGxeRPhsEogSc53j1 # 这个字符串是通过openssl passwd -1 123456 生成
state: present
system: no
createhome: yes
home: /home/t
shell: /bin/bash
synchronize模块
synchronize模块实现rsync常用的功能,当文件非常大的时候,copy效率会非常低,这时候可以考虑使用synchronize模块,速度快很多,但是需要服务器上已安装rsync包
参数 | 描述 |
src | 传输的文件路径 |
dest | 远端服务器路径 |
mode | 传输模式 push/pull, |
archive | 等价于rsync的-a选项, |
recursive | 是否递归 |
compress | 传输过程是否压缩 |
group | 传输后文件的属组 |
owner | yes/no,是否保留属主信息 |
perms | yes/no,是否保留权限 |
playbook示例:
$ cat synchronize.yml
---
- hosts: 192.168.240.33
tasks:
- name: synchronize module
synchronize:
src: /tmp
dest: /home/ansible/
archive: yes
recursive: yes
cron模块
cron模块用于管理cron任务
参数 | 描述 |
user | 指定用户的定时任务 |
job | 定时任务 |
state | present/absent,是否存在 |
name | 定时任务名称 |
minute | 分 |
hour | 时 |
day | 日 |
month | 月 |
weekday | 周 |
playbook示例:
$ cat cron.yml
---
- hosts: 192.168.240.33
tasks:
- name: cron module
cron:
minute: "0"
hour: "*"
day: "*"
month: "*"
weekday: "*"
name: ntpdate
job: "ntpdate ntp1.aliyun.com"
user: root
state: present
执行结果:root用户查看定时任务
# crontab -l
#Ansible: ntpdate
0 * * * * ntpdate ntp1.aliyun.com
file模块
file模块用于管理文件状态
参数 | 描述 |
src | 创建连接文件时的真实路径 |
path | 文件路径 |
mode | 文件的权限信息 |
owner | 文件的属主 |
group | 文件的属组 |
recurse | 是否递归设置 |
state | 文件的状态,present 存在,absent 不存在,file 文件,directory目录,link软链接,hard硬链接 |
playbook示例:
$ cat file.yml
---
- hosts: 192.168.240.33
tasks:
- name: file module
file:
owner: ansible
group: ansible
path: /tmp/file/a/b/c
recurse: yes
mode: '0755'
state: directory
执行结果
# tree /tmp/file/
/tmp/file/
└── a
└── b
└── c
authorized_key模块
authorized_key模块用于新增或一处ssh公钥
参数 | 描述 |
key | 公钥路径,可是本地文件也可以是url地址 |
path | 公钥存放路径 |
state | present/absent,是否存在 |
user | 添加到远程哪个用户下 |
playbook示例如下:
# 设置ansible用户 t2@192.168.240.33免密登录
# $ cat authorized_key.yml
---
- hosts: 192.168.240.33
tasks:
- name: authorized_key module
authorized_key:
key: "{{ lookup('file', '/home/ansible/.ssh/id_rsa.pub') }}"
state: present
user: t2