ansible常用模块(playbook)
hostname
例子
- name: change hostname
hostname:
name: ansimgr
参数
name: 设置的主机名
file
例子
- name: touch ansible file
file:
path: /root/ansible_test/ansible_test2.yaml
state: touch
owner: root
group: root
mode: 0755
参数
follow: yes/no,默认no;如果原来的文件是link,拷贝后依旧是link
force: yes/no,默认no;强制执行
group: 设定一个群组拥有拷贝到远程节点的文件权限
mode: 等同于chmod,参数可以为“u+rwx or u=rw,g=r,o=r”
owner: 设定一个用户拥有拷贝到远程节点的文件权限
path: 目标路径,也可以用dest,name代替
src: 待拷贝文件/文件夹的原始位置。
state: file/link/directory/hard/touch/absent,默认file;file代表拷贝后是文件;link代表最终是个软链接;directory代表文件夹;hard代表硬链接;touch代表生成一个空文件;absent代表删除
blockinfile
例子
- name: edit sshd_config
blockinfile:
backup: yes
path: /etc/ssh/sshd_config
block: |
Match User ansible-agent
PasswordAuthentication no
state: present
参数
path: required,指定要操作的文件。
block: 指定要操作的”一段文本”,此参数有一个别名叫”content”,使用content或block的作用是相同的。
marker: 在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK,使用marker参数自定义”标记”。比如,marker=#{mark}test ,这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test。
state: state参数有两个可选值,present与absent,插入和删除对应标记的段落。
insertafter: 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。
insertbefore: 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。
backup: 是否在修改文件之前对文件进行备份。
create: 当要操作的文件并不存在时,是否创建对应的文件。
lineinfile
例子
- name: set limit 2
lineinfile:
backup: yes
path: /etc/security/limits.conf
insertafter: '# End of file'
line: "{{ item }}"
state: present
with_items:
- '* soft nofile 655360'
- '* hard nofile 131072'
- '* soft nproc 655350'
- '* hard nproc 655350'
- '* soft memlock unlimited'
- '* hard memlock unlimited'
参数
path/dest: 目标文件绝对路径+文件名,必须参数
line: 替换/插入的内容
regexp: 待匹配内容
insertbefore: 匹配行前面插入
insertafter: 匹配行后面插入
state: 删除匹配行,需要将值设为absent,默认值present。
backup: 是否在修改文件之前对文件进行备份。 yes/no
create: 当要操作的文件并不存在时,是否创建对应的文件。yes/no
backrefs:yes/no,backrefs为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容;backrefs为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容。
setup
例子
- name: get server kernet
setup: filter=ansible_kernel
参数
filter: 可以筛选关键词,主要可选的筛选项如下
ansible_all_ipv4_addresses #所有机器的ipv4地址
ansible_all_ipv6_addresses #所有机器的ipv6地址
ansible_date_time #系统时间
ansible_kernel #内核版本
ansible_default_ipv4 #默认机器的ipv4地址
ansible_default_ipv6 #默认机器的ipv6地址
ansible_distribution #linux系统发行版本,如centos,ubuntu,debian等
ansible_nodename #主机名
ansible_pkg_mgr #包管理器
ansible_python_version #python版本
group
例子
- name: add group admin
group:
gid: 1111
name: admin
system: yes
state: present
参数
gid: 指创建的组ID信息
name: 指创建组名称信息
system: yes/no system=yes 则表示创建系统组
state: present(默认)/absent,指定组状态;present创建指定的用户组,absent删除指定的用户组
cron
例子
- name: start chkrootkit
cron:
name: start chkrootkit
minute: "0"
hour: "2"
weekday: "1"
job: "/opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh"
user: root
参数
backup: yes/no,默认no 如果设置了,请在修改crontab之前创建备份。该模块在backup_file变量中返回备份的位置。
cron_file: 如果指定了该文件,将使用该文件而不是单个用户的crontab。如果这是一个相对路径,它将根据/etc/cron.d进行解释,如果它是绝对的,它通常会是/etc/crontab。要使用cron_file参数,还必须指定use。
day: 默认"" 作业应该运行的月份(1-31、、/2等)
disabled: yes/no,默认no 是否应该在crontab中禁用该作业(注释掉)。只有state=present时才有效。
env: yes/no,默认no 如果设置了,则管理crontab的环境变量。在crontab上添加了新的变量。Name和value参数是环境变量的名称和值。
hour: 默认"" 作业应该运行的时间(0-23、、/2等)
insertafter: 与state=present和env一起使用。如果指定了,环境变量将被插入到指定环境变量的声明之后。
insertbefore: 与state=present和env一起使用。如果指定了,环境变量将被插入到指定环境变量的声明之前。
job: 执行的命令,如果设置了env,则为环境变量的值。命令不应该包含换行符。如果需要state=present。
minute: 默认"" 作业应该运行的时间(0-59、、/2等)
month: 默认"" 作业应该运行的月份(1-12,,/2,等等)
name: crontab表项的描述,如果设置了env,则是环境变量的名称。如果需要state=absent。如果没有设置name并且state=present,那么无论现有的crontab条目是什么,都会创建一个新的crontab条目。
reboot: yes/no,默认no 是否应该在重新启动时运行作业。不赞成使用该选项。用户应该使用special_time。
special_time: annually or daily or hourly or monthly or reboot or weekly or yearly 特殊时间规范昵称。
state: absent/present,默认present 是否确保作业或环境变量存在或不存在。
user: 需要修改crontab的用户。如果不设置,该参数默认使用root。
weekday: 默认"" 作业应该运行的星期几(0-6表示周日-周六,等)
fetch
例子
- name: fetch chkrootkit
fetch:
src: /opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh
dest: /root/
参数
dest: 保存文件的目录。例如,如果dest目录是/backup,则主机host.example.com上名为/etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。主机名以库存名称为准
fail_on_missing: yes/no,默认为yes 当设置为yes时,如果由于任何原因无法读取远程文件,则任务将失败。
flat: yes/no,默认no 允许您覆盖将主机名/path/to/文件追加到目标的默认行为。如果dest以’/'结尾,它将使用源文件的基名,类似于copy模块。如果使用单个主机,或者检索每个主机唯一命名的文件,这可能很有用。如果使用多个具有相同文件名的主机,则每个主机的文件将被覆盖。
src: 要在远程系统上获取的文件。这必须是一个文件,而不是目录。在以后的版本中可能会支持递归抓取。
validate_checksum: yes/no,默认yes 在获取文件之后,验证源和目标校验和是否匹配。
firewalld
例子
- name: deny 8081 port
firewalld:
port: 8081/tcp
permanent: yes
state: enabled
参数
icmp_block: 在防火墙中添加或者移除的ICMP块。
icmp_bolck_inversion: 开启/关闭防火墙区域ICMP报文反转功能。
immediate: yes/no,默认no 如果将此配置设置为永久性,则应立即应用此配置。
interface: 在防火墙中添加或移除interface
masquerade: 在在防火墙中开启或关闭masquerade功能
offline: yes/no 是否在防火墙离线时运行此模块。
permanent: yes/no 该配置是否在运行的防火墙配置中,或者在重新启动时仍然存在。注意,如果这是no, immediate被假定为yes。
port: 在防火墙中添加或移除端口名称或端口范围。端口范围必须为PORT/PROTOCOL或PORT-PORT/PROTOCOL格式。
rich_rule: rich_rule添加或删除到防火墙
service: 在防火墙中添加或移除服务名称该服务必须在firewall-cmd --get-services的输出中列出。
source: 在防火墙中添加或移除某个来源的网络
state: absent/disabled/enabled/present 启用或禁用一项设置。对于端口:该端口是否接受(enabled)或拒绝(disabled)连接。状态的(present)和(absent)只能在区域级别操作中使用(即,当除了zone和state没有设置其他参数时)。
timeout: 默认0 该规则应在非永久性时生效的时间
zone: 添加或移除的防火墙区域。注意,可以为每个系统配置默认的区域,可能的值有block, dmz, drop, external, home, internal, public, trusted, work,public
script
例子
- name: sh chkrootkit
script:
cmd: /opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh
参数
chdir: 在运行脚本之前,在远程节点上切换到这个目录。
cmd: 要运行的本地脚本的路径,后跟可选参数。
creates: 远程节点上的文件名,如果它已经存在,则不会运行此步骤。
decrypt: yes/no,默认yes 此选项控制使用保险库对源文件进行自动解密。
executable: 用于调用脚本的可执行文件的名称或路径。
free_form: 本地脚本文件的路径,后跟可选参数。
removes: 远程节点上的文件名,如果不存在,则不会运行此步骤。
user
例子
- name: add user luorf
user:
system: yes
comment: user luorf
home: /home/luorf
groups: root
name: luorf
shell: /bin/bash
参数
system: 默认创建为普通用户,为yes则创建系统用户
append: 添加一个新的组
comment: 添加描述信息
createhome: 给用户创建家目录
force: 强制删除用户
group: 创建用户主组
groups: 将用户加入组或者附属组添加
home: 指定用户的家目录
name: 表示状态,是否create、remove、modify
password: 指定用户的密码,为加密密码
remove: 删除用户
shell: 设置用户的shell登录环境
uid: 设置用户ID
update_password: 修改用户密码
state: 用户状态,默认为present,表示新建用户
command
例子
- name: cat hosts file
command: chdir=/root ls -lt
参数
chdir: 执行命令前,切换到目录
creates: 当该文件存在时,不执行该步骤
executable: 切换shell来执行命令,需要使用命令的绝对路径
free_from: 需要执行的脚本,一般使用Ansible的-a参数代替。
removes: 当该文件不存在时,不执行该步骤
warn: 如果在ansible.cfg中存在告警,如果设定了false,不会告警该行
说明
command模块不支持变量、重定向、管道符等
shell
例子
- name: hosts bak
shell: cp /etc/hosts /etc/hosts.bak.`date +%Y%m%d`
参数
chdir: 在哪个目录下执行shell命令,相当于执行shell命令前先cd到对应目录
creates: 如果存在某文件,就不执行shell
removes: 如果不存在某文件,就不执行shell;与creates左右相反
executable: 修改并指定shell解释器来执行命令
free_form: 指的就是具体的shell命令,实际上是一个不存在的选项
ping
例子
- name: ping all server
ping:
data: crash
参数
data: 为ping
返回值返回的数据。默认为’pong’,如果该参数设置为crash
,模块将引发异常。
make
例子
- name: Build ClamAV 3
make:
chdir: /root/clamav-{{clamav_version}}/build
target: install
become: yes
参数
chdir: 在执行task
之前,需要切换的目录路径—必须
file: 标准Makefile
的路径
params: 一些额外的需要传给make
命令的参数
target: make要执行的操作,可以写:
install/
test/
all
make.params.PREFIX: 编译之后的文件存放位置。适用于不是root
用户执行的脚本
archive
例子
- name: archive ansible test files
archive:
path: /root/ansible_test/
dest: /root/ansible_test.gz
owner: root
参数
path: 远程主机上需要被打包/压缩的源文件(可以是文件列表,支持glob模式)
dest: 打包/压缩后的包文件路径(包文件的父目录必须存在);如果包文件已存在,则会被覆盖。
format: 指定压缩类型,包括:bz2、gz(默认)、tar、xz、zip
owner: 指定属主
group: 指定属组
mode: 指定权限
remove: yes|no,默认为no,在打包/压缩后,不删除源文件
unarchive
例子
- name: Unarchive kubernetes package
unarchive:
src: "/opt/kubernetes-server-linux-amd64.tar.gz"
dest: "/usr/local/bin/"
remote_src: yes
extra_opts:
- --strip-components=3
exclude:
- "*.tar"
- "*_tag"
- "*.org"
- "*.io"
- "*.com"
- "*.net"
参数
creates: 如果指定的绝对路径(文件或目录)已存在,则不会运行此步骤。。
copy: 默认为yes,拷贝的文件从ansible主机复制到远程主机,如果没有可复制对象,在远程主机上寻找,no在远程主机上寻找src源文件解压
src: tar源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需设置copy=no
dest: 远程主机上的目标绝对路径
mode: 设置解压缩后的文件权限
exec: 列出需要排除的目录和文件
remote_src: 设置remote_src=yes为解包目标上已经存在的档案。对于Windows目标,改用win_unzip模块。
owner: 解压后文件或目录的属主
group: 解压后的目录或文件的属组
exclude: 列出要从unarchive操作中排除的目录和文件条目。
extra_opts:通过传入数组指定其他选项
keep_newer:不要替换比归档文件更新的现有文件
k8s
例子
- name: create namespace
k8s:
name: my-namespace
api_version: v1
kind: Namespace
state: present
参数
name: 用于指定对象的名称
api_version: 指定API版本号,默认“v1”
force:yes/no,默认为no;如果设置为“yes”,并且存在状态,则将替换现有对象。
kind: 指定对象资源类型
namespace:用于指定对象的命令空间
state:absent/present /patched,默认为present ;present,如果不存在,则安装;absent,如果存在,则删除,patched,如果存在,则修补
reboot
例子
- name: Wait for server to restart
reboot:
reboot_timeout: 180
参数
reboot_timeout: 等待计算机重新启动并响应测试命令的最长秒数,默认为600S
test_command: 重启后测试命令,默认为“whoami”
msg:重启前提示用户的消息,默认为“Reboot initiated by Ansible”
service
例子
- name: init service chrony
service:
name: chronyd
enabled: yes
state: started
参数
name(required): 设置启停服务名称
enabled: 设置服务是否开机自启动,可选项yes/no;如果参数不指定,原有服务开机自启动状态进行保留
sleep: 如果执行了restarted,则在stop和start之间沉睡几秒钟
state: 需要对当前服务执行的动作,可选项reloaded(平滑重启),restarted(重启),started(启动),stopped(停止)
get_url
例子
- name: get file calico-etcd.yaml
get_url:
url=https://docs.projectcalico.org/manifests/calico-etcd.yaml
dest=/root/
validate_certs=no
参数
dest: 指定将文件下载的绝对路径—必须
url: 文件的下载地址(网址)—必须
url_username: 用于http基本认证的用户名
url_password: 用于http基本认证的密码
validate_certs: 如果否,SSL证书将不会验证。这只应在使用自签名证书的个人控制站点上使用
owner: 指定属主
group: 指定属组
mode: 指定权限
copy
例子
- name: calico-etcd cfg 1
copy:
src: calico.sh
dest: /root/
owner: root
group: root
mode: 0755
参数
src: 用于指定需要copy的文件或目录。
dest: 用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数。
content: 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
force: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
backup: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
owner : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group: 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode: 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r--r--“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
template
例子
- name: 将index.html文件复制到节点,并将其中的变量替换为对应的值
template:
src: ~/play/template/index.html
dest: /var/www/html/index.html
$ cat index.html
# 将变量写在文件中
welcome to {{ ansible_hostname }} on {{ ansible_ztuzex7lqa.ipv4.address }}
参数
backup: yes/no,建立个包括timestamp在内的文件备份,以备不时之需
dest: 必选项,远程节点上的绝对路径,用于放置template文件
group: 设置远程节点上的的template文件的所属用户组
mode: 设置远程节点上的template文件权限。类似Linux中chmod的用法
owner: 置远程节点上的template文件所属用户
src: 必选项,本地Jinjia2模版的template文件位置
filesystem
例子
- name: Create a ext4 filesystem on /dev/sdb1 and check disk blocks
filesystem:
fstype: ext4
dev: /dev/sdb1
opts: -cc
参数
fstype: 文件系统的类型(Choices: btrfs, ext2, ext3, ext4, ext4dev, f2fs, lvm, ocfs2, reiserfs, xfs, vfat,swap)
dev: 预备检查的硬盘分区
force: yes/no,默认为no;强制格式化文件系统,在已经格式化文件系统的基础上重新格式化文件系统需要把参数配成yes
opts: 其他mkfs命令的参数
lvol
例子
- name: Create a logical volume of 512m with disks /dev/sdb1 and /dev/sdb2
lvol:
vg: firefly
lv: test
size: 512
pvs: /dev/sdb1,/dev/sdb2
参数
vg: 在哪个卷组上创建lv
lv: 逻辑卷名
size: 逻辑卷大小,默认单位是M。
pvs: 指定物理卷
force: yes/no,默认no,即默认不允许缩小和删除lv操作,如果一定要执行就force=yes
state: 模块状态,absent代表删除,present代表新建,默认是present。
active: 卷是否已激活并且对主机可见
lvg
例子
- name: Create a volume group on top of /dev/sdb1 with physical extent size = 32MB
lvg:
vg: vg.services
pvs: /dev/sdb1
pesize: 32
参数
vg: 要创建的卷组名称
pvs: 要加入到卷组中的物理卷列表
pesize: 指定pe大小,默认值是4M,默认单位是M。
state: 模块状态,absent代表删除,present代表新建,默认是present。
yum_repository
例子
- name: Add repository
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
参数
name: 指定repository ID。
description: 软件源的描述信息。
file: 保存repo信息的文件(不用加.repo后缀);如果不指定,默认保存在以name命名的repo文件中。
baseurl: repodata文件的URL。
state: present(默认)或absent。
mirrorlist: mirrorlist是一个包含多个baseurl的列表文件,这里指定的是mirrorlist文件的URL。
gpgcheck: yes|no,是否需要对该软件源的程序包进行GPG校验。没有默认值,如果不设置,将会延用/etc/yum.conf中的配置,或者系统默认的no。
package_facts
例子
- name: take installed package
package_facts:
manager: auto
- name: list installed package
debug:
var: ansible_facts.packages
参数
manager: auto/rpm/apt/portage/pkg/pacman/apk,默认auto;表示系统使用的包管理器,auto表示自动判断包管理器类型
strategy:first/all,默认first;如何查询系统上的程序包管理器。 first意味着它将仅返回有关第一个受支持的程序包管理器的信息。 all 将返回系统上所有受支持的可用软件包管理器的信息。
package
例子
- name: install package mariadb
package:
name:
- mariadb-server
state: latest
参数
name: 指定要安装的软件包名
state: present/absent;present 安装 absent 卸载
yum/dnf
例子
- name: install service chrony
dnf:
name:
- chrony
参数
name: 用于指定需要管理的软件包,比如 chrony。
state: 状态 present,installed,removed,latest,absent;默认为present;installed and present等效;latest标志安装yum中最新版本;absent and removed 等效,表示删除安装包。
disable_gpg_check: 用于禁用rmp包的公钥gpg验证,默认值no,表示不做验证,设置为yes 表示禁用验证,即不验证包,直接安装。在对应的yum源没有开启gpg验证的情况下,需要将此参数的值设置为yes,否则会报错而无法进行安装。
enablerepo: 用于指定安装软件包是临时启用的yum源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
Disablerepo: 用于指定安装软件包是临时禁止用的yum源。当多个yum源中同时存在要安装的软件包时,可以使用此参数临时禁用某个源
mount
例子
- name: mount media
mount:
src=/dev/sr0
path=/media
state=mounted
fstype=iso9660
参数
src: 定义挂载内容
path: 设备挂载至本地的路径,必须指定
fstype: 挂载的文件系统类型,xfs、nfs...,必须指定
opts: 挂载的参数,defaults、ro...
state: 挂载的状态,absent/mounted/unmounted;mounted进行挂载,修改/etc/fstab信息,unmounted临时卸载,不修改/etc/fstab信息,absent永久性卸载,并修改 /etc/fstab信息
其他
main.yml
例子
# cat main.yml
- import_tasks: kube-proxy_cfg.yml
参数
import_tasks:静态加载,playbook在运行一开始解析的时候,加载子任务中全部变量;
include_tasks:动态加载,playbook在执行到该子任务的时候,才会加载该子任务中全部变量;
补充:import_tasks调用的子任务文件名称不可以使用变量,但是include_tasks调用的子任务名称则可以加变量;import_tasks会调用子任务中的所有tag,使用–list-tags参数时也能看到,但是include_tasks调用的子任务中如果定义了tag,则不会生效。
常用的通用参数
忽略错误
ignore_errors: True
打标签
tags: kube-proxy_cfg
输出结果
register: result3
- debug:
var: result3.stdout
判断后输出结果
debug:
msg: "NetworkManager版本:{{ansible_facts.packages['NetworkManager'][0].version}}"
when: "'NetworkManager' in ansible_facts.packages"
# 如果NetworkManager在已安装列表中,显示NetworkManager的版本
循环参数
line: "{{ item }}"
with_items:
- '* soft nofile 655360'
- '* hard nofile 131072'
- '* soft nproc 655350'
- '* hard nproc 655350'
- '* soft memlock unlimited'
- '* hard memlock unlimited'
使用root
或者sudoer
的权限
become: yes
如何查询模块的用法和写法
执行命令ansible-doc 「ansiblem模块名称」,然后输入「/EXAMPLE(注意大写) 」回车键
$ ansible-doc user
/EXAMPLE