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_resultdev会被丢掉,所以不要用-
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的主要内容,如果未能解决你的问题,请参考以下文章

云原生之 Ansible 篇

Ansible之playbook的使用

Ansible之YAML语言

Ansible 之 playbook使用

三Ansible之playbook

[自动化] Ansible之使用Playbooks详解