play-book模块


官方文档(latest):点击跳转
官方文档(2.9):点击跳转

1. 错误处理

  1. ignore_errors

yes:忽略错误,并继续执行后面的tasks
no:不忽略错误,直接停止play

  1. force
  2. changed_when
  3. failed_when

当对应的条件成立时,将对应任务的执行状态设置为失败,退出playbook。(实际上是该task已经执行,并且执行成功了)

  1. 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使用正则表达式匹配对应的行。
当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换;
当删除文本时,如果有多行文本都能被匹配,那么这些行全都被删除
statepresent 默认值:新增即插入
absent,删除时使用
backrefsyes/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指定被管理模块的名称
statepresent
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时,表示强制创建链接文件
recurseyes当操作文件为目录时,可以递归的修改目录中文件的属性
stateabsent若是目录或文件,则递归删除;若是链接,则取消
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_algorithmsha1 | md5 | sha224 | sha256 | sha384 | sha512确定文件校验和的算法。
如果主机无法使用指定的算法,将抛出错误。
远程主机必须支持指定的散列方法,如果主机符合FIPS-140, md5可能不可用
followno | yes是否遵循符号链接
get_checksumyes | no是否返回文件的校验和
get_attributesyes | no如果存在,使用 lsattr 工具读取文件属性
get_mimeyes | 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值