ansible 之 register
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible 之 register相关的知识,希望对你有一定的参考价值。
register
用于注册一个变量,保存命令的结果(shell或command模块),这个变量可以在后面的task、when语句或模板文件中使用。
[[email protected]_11 playbook]# cat register.yaml
- hosts: node3
tasks:
- shell: pwd
register: pwd_status
- name: print pwd_ststus value
debug: msg= pwd_status
register
接受到的值需要配个debug
模块来输出对应的值
TASK [print pwd_ststus value] *******************************************************************************************************
ok: [10.0.0.13] =>
"msg":
"changed": true, // 改变状态
"cmd": "pwd", // 执行命令
"delta": "0:00:00.002705", //
"end": "2018-11-14 23:18:40.941321", // 命令执行的结束时间
"failed": false, // 失败为假,即为真
"rc": 0, // 0成功,非0失败
"start": "2018-11-14 23:18:40.938616", // 开始的时间
"stderr": "", // 单行显示输入的值
"stderr_lines": [], // 多行显示输入的值
"stdout": "/root", // 一行赋值
"stdout_lines": [ // 以列表的形式赋值
"/root"
]
debug
模块可以输出register
模块中对应的变量属性。
实验测试:
在每个主机的/tmp目录下生产一个以自己主机名为目录名称的目录
[[email protected]_11 playbook]# cat register.yaml
- hosts: all
tasks:
- shell: hostname
register: Hostname
- name: print pwd_ststus value
file: name=/tmp/ Hostname.stdout state=touch
此步骤可以放在zabbix-agent端自动注册的时候,填写的hostsname主机名,可以使用这种方式来完成所有服务器agent端的更改.
循环处理命令结果:
- name: registered variable usage as a with_items list
hosts: all
tasks:
- name: retrieve the list of home directories
command: ls /home
register: home_dirs
- name: add home dirs to the backup spooler
file: path=/mnt/bkspool/ item src=/home/ item state=link
with_items: home_dirs.stdout_lines #等同于with_items: home_dirs.stdout.split()
ansible register 这个功能非常有用。当我们需要判断对执行了某个操作或者某个命令后,如何做相应的响应处理(执行其他 ansible 语句),则一般会用到register 。
举个例子:
我们需要判断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
注意:
1、register变量的命名不能用 -
中横线,比如dev-sda6_result
,则会被解析成sda6_result
,dev
会被丢掉,所以不要用-
2、ignore_errors
这个关键字很重要,一定要配合设置成True
,否则如果命令执行不成功,即 echo $?
不为0,则在其语句后面的ansible语句不会被执行,导致程序中止。
那我如何去做多种条件的判断呢,比如我还需要判断是否有 docker-thinpool 存在,则还需要为它注册一个变量。
- 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
然后在when
中用and
或者or
来组合判断。比如当两种条件之一成功,都对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
以上是关于ansible 之 register的主要内容,如果未能解决你的问题,请参考以下文章