1. 错误处理
- ignore_errors
yes:忽略错误,并继续执行后面的tasks
no:不忽略错误,直接停止play
- force
- changed_when
- failed_when
当对应的条件成立时,将对应任务的执行状态设置为失败,退出playbook。(实际上是该task已经执行,并且执行成功了)
- block
2. 条件判断
when:
- 条件1
- 条件2
#条件判断#
= value == "字符串",value == 数字
< value < 数字
> value > 数字
<= value <= 数字
>= value >= 数字
!= value != 数字
is defined value value is defined 变量存在
is not defined value is not defined 变量不存在
in value is in value 变量为
not in value is not in value 变量不为
bool变量 为true value value的值为true
bool变量 false not value value的值为false
value in value2 value的值在value2列表中
多条条件组合
when:
条件1 and 条件2
- 条件1
- 条件2
when:条件1 or 条件2
when: >
条件1
or
条件2
register
对某个命令或操作结果做判断,然后后面要执行的操作
1、register变量的命名不能用 -中横线,比如dev-sda6_result,则会被解析成sda6_result,dev会被丢掉,所以不要用-;
2、ignore_errors这个关键字很重要,一定要配合设置成True,否则如果命令执行不成功,即 echo $?不为0,则在其语句后面的ansible语句不会被执行,导致程序中止
示例
- name: apt更新缓存刷新
apt: update_cache=yes cache_valid_time=72000
ignore_errors: true
when:
- 'ansible_distribution in ["Ubuntu","Debian"]'
- 'INSTALL_SOURCE != "offline"'
# 我们需要判断sda6是否存在,如果存在了就执行一些相应的脚本,则可以为该判断注册一个register变量,并用它来判断是否存在,存在返回 succeeded, 失败就是 failed
- name: Create a register to represent the status if the /dev/sda6 exsited
shell: df -h | grep sda6
register: dev_sda6_result
ignore_errors: True
tags: docker
- name: Copy docker-thinpool.sh to all hosts
copy: src=docker-thinpool.sh dest=/usr/bin/docker-thinpool mode=0755
when: dev_sda6_result | succeeded
tags: docker
# 多条件
- name: Create a register to represent the status if the docker-thinpool exsited
shell: lsblk | grep docker-thinpool
register: docker_thinpool_result
ignore_errors: True
tags: docker
- name: Special config for docker-thinpool devicemapper
lineinfile: dest=/etc/sysconfig/docker regexp=^OPTIONS= line=OPTIONS='--selinux-enabled=false --insecure-registry=10.213.42.254:10500 --log-level=warn --storage-opt dm.basesize={{ dm_base_size }} --storage-opt dm.loopdatasize={{ dm_loop_data_size }} --storage-opt dm.loopmetadatasize={{ dm_loop_meta_size }} --storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt=dm.use_deferred_removal=true --storage-opt=dm.use_deferred_deletion=true'
when: (dev_sda6_result | succeeded) or (docker_thinpool_result | succeeded)
tags: docker
3. import_tasks
导入task
示例
- import_tasks: centos.yml
when: 'ansible_distribution in ["CentOS","RedHat","Amazon","Aliyun"]'
4. lineinfile 模块
作用:在文件中插入、删除或替换某一行文本
参数 | 作用 |
---|---|
path | 必要参数,用于指定要操作的文件 |
line | 指定文本内容(要插入的内容) |
regexp | 使用正则表达式匹配对应的行。 当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换; 当删除文本时,如果有多行文本都能被匹配,那么这些行全都被删除 |
state | present 默认值:新增即插入 absent,删除时使用 |
backrefs | yes/no,是否开启后向引用。默认:no 默认情况下(backrefs=no),当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾 使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变 |
insertbefore | 将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式。 BOF为Begin Of File之意,表示插入到文档的开头;如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略 |
insertafter | 将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式。 EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF; 如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略 |
backup | 是否修改文件之前进行备份 |
create | 当要操作的文件不存在时,是否需要创建对应文件 |
示例
- name: 永久关闭 selinux
lineinfile:
dest: /etc/selinux/config
regexp: "^SELINUX="
line: "SELINUX=disabled"
- name: 禁止rsyslog获取journald日志
lineinfile:
dest: /etc/rsyslog.conf
state: present
regexp: 'ModLoad imjournal'
line: '#$ModLoad imjournal # provides access to the systemd journal'
5. yum
用来在CentOS 系统中安装软件
参数 | 作用 |
---|---|
name | 必要参数,软件包名称 |
state | 状态 present 默认值,下载安装 installed 等同于present latest 安装yum中最新版本 absent 删除安装包 removed 等同于absent |
disable_gpg_check | 用于禁用rmp包的公钥gpg验证,默认值no ,表示不做验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装 |
enablerepo | 用于指定安装软件包是临时启用的yum源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源 |
Disablerepo | 用于指定安装软件包是临时禁止用的yum源。当多个 yum源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源 |
update_cache | 强制更新yum的cache |
示例
- name: 安装基础软件包
yum:
name:
- bash-completion # bash命令补全工具,需要重新登录服务器生效
- conntrack-tools # ipvs 模式需要
- ipset # ipvs 模式需要
- ipvsadm # ipvs 模式需要
- libseccomp # 安装containerd需要
- nfs-utils # 挂载nfs 共享文件需要 (创建基于 nfs的PV 需要)
- psmisc # 安装psmisc 才能使用命令killall,keepalive的监测脚本需要
- rsync # 文件同步工具,分发证书等配置文件需要
- socat # 用于port forwarding
state: present
when: 'INSTALL_SOURCE != "offline"'
6. service
对服务进行启动、停止、重载等操作
参数 | 作用 | |
---|---|---|
name | 指定服务名称 | |
state | 对应服务需要执行的操作 started/stoped/reloaded/restarted | state与enabled至少要有一个 |
enabled | 开机自启动,默认为no yes/no |
示例
- name: 重启rsyslog服务
service: name=rsyslog state=restarted
7. set_fact
用来在tasks中定义变量
示例
- name: 转换内核版本为浮点数
set_fact:
KERNEL_VER: "{{ ansible_kernel.split('-')[0].split('.')[0]|int + ansible_kernel.split('-')[0].split('.')[1]|int/100 }}"
8. modprobe
用来加载或卸载内核模块
参数 | 作用 |
---|---|
name | 指定被管理模块的名称 |
state | present |
params | 模块参数 |
示例
- name: 加载内核模块
modprobe: name={{ item }} state=present
with_items:
- br_netfilter
- ip_vs
- ip_vs_rr
- ip_vs_wrr
- ip_vs_sh
- nf_conntrack
ignore_errors: true
9. file
用来处理文件或目录
参数 | 默认值 | 描述 |
---|---|---|
name/path/dest | 用于指定要操作的文件或目录 | |
group | 文件复制到远程主机,设置文件组用户信息 | |
mode | 文件复制到远程主机,设置数据的权限,如 0777 755 | |
owner | 文件复制到远程主机,设置文件属主用户信息 | |
src | link | hard表示创建软链接或硬链接,通过src参数指定链接源 | |
force | 当state=link的时候,可配合此参数强制创建链接文件。当force=yes时,表示强制创建链接文件 | |
recurse | yes | 当操作文件为目录时,可以递归的修改目录中文件的属性 |
state | absent | 若是目录或文件,则递归删除;若是链接,则取消 |
directory | 创建空目录 | |
file | 查看指定目录信息是否存在 | |
touch | 创建空文件 | |
hard | link | 创建链接文件 |
示例
# 创建目录
- name: prepare some dirs
file: name={{ item }} state=directory
with_items:
- "{{ cluster_dir }}/ssl"
- "{{ cluster_dir }}/backup"
- "{{ cluster_dir }}/yml"
- "~/.kube"
# 递归设置目录权限
- name: 本地设置 bin 目录权限
file: path={{ base_dir }}/bin state=directory mode=0755 recurse=yes
# 软链接
- name: ansible 控制端创建 kubectl 软链接
file: src={{ base_dir }}/bin/kubectl dest=/usr/bin/kubectl state=link
ignore_errors: true
- name: 本地创建 ezdown/ezctl 工具的软连接
file: src={{ base_dir }}/{{ item }} dest=/usr/bin/{{ item }} state=link
with_items:
- ezdown
- ezctl
10. stat
检索文件或文件系统状态
参数 | 默认值 | 描述 |
---|---|---|
checksum_algorithm | sha1 | md5 | sha224 | sha256 | sha384 | sha512 | 确定文件校验和的算法。 如果主机无法使用指定的算法,将抛出错误。 远程主机必须支持指定的散列方法,如果主机符合FIPS-140, md5可能不可用 |
follow | no | yes | 是否遵循符号链接 |
get_checksum | yes | no | 是否返回文件的校验和 |
get_attributes | yes | no | 如果存在,使用 lsattr 工具读取文件属性 |
get_mime | yes | no | 使用文件魔法并返回关于文件性质的数据。它使用了在大多数Linux/Unix系统上都可以找到的“文件”实用程序。 这将同时添加’ mime_type ‘和’charset’字段,如果可能的话。 在Ansible 2.3中,这个选项从’mime’变为’get_mime’,默认为’Yes’ |
path | 要获取的事实的文件/对象的完整路径 |
示例
# 获取/etc/foo.conf的统计信息,并检查该文件仍然属于'root',如果不是就报失败。
- stat:
path: /etc/foo.conf
register: st
- fail:
msg: "Whoops! file ownership has changed"
when: st.stat.pw_name != 'root'
# 确定路径是否存在且为符号链接。请注意,如果路径不存在,我们将测试symm.stat.Islnk,它将失败,并出现错误。因此,我们必须测试它是否被定义。运行这个来理解结构,跳过的那些不会通过'when'执行的检查。
- stat:
path: /path/to/something
register: sym
- debug:
msg: "islnk isn't defined (path doesn't exist)"
when: sym.stat.islnk is not defined
- debug:
msg: "islnk is defined (path must exist)"
when: sym.stat.islnk is defined
- debug:
msg: "Path exists and is a symlink"
when: sym.stat.islnk is defined and sym.stat.islnk
- debug:
msg: "Path exists and isn't a symlink"
when: sym.stat.islnk is defined and sym.stat.islnk == False
# 确定路径是否存在且为目录。注意,我们需要测试p.stat.isdir是否真的存在,以及它是否被设置为true。
- stat:
path: /path/to/something
register: p
- debug:
msg: "Path exists and is a directory"
when: p.stat.isdir is defined and p.stat.isdir
# 不做校验和
- stat:
path: /path/to/myhugefile
get_checksum: no
# 使用sha256计算校验和
- stat:
path: /path/to/something
checksum_algorithm: sha256