侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

ansible笔记(8)之注册变量

zze
zze
2020-03-28 / 0 评论 / 0 点赞 / 367 阅读 / 4215 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

本来打算自己写一波 ansible 系列的,后来发现一老哥写的太好了,「点击此处直达」,我这里也就边看边对该系列文章做下笔记,方便以后查阅,ansible 入门的话墙裂建议阅读前方链接博文~~~

ansible 的模块在运行之后,其实都会返回一些返回值,只是默认情况下,这些返回值并不会显示而已,我们可以把这些返回值写入到某个变量中,这样我们就能够通过引用对应的变量从而获取到这些返回值了,这种将模块的返回值写入到变量中的方法被称为注册变量。

我们来看一个 playbook 示例:

---
- hosts: B
  remote_user: root
  tasks:
  - name: test shell
    shell: "echo test"
    register: testvar
  - name: shell module return values
    debug:
      var: testvar

上例中共有两个任务,第一个任务使用 shell 模块在 B 主机中输出 test 文本到标准输出,然后使用 register 关键字将当前 shell 任务的返回值写入了名为 testvar 的变量中,第二个任务使用 debug 模块输出了第一个任务中的注册变量的值,没错,注册变量就是这么简单,使用 register 关键字指定对应的变量名即可。

上述 playbook 执行后,可以在控制台中看到名为 [shell module return values] 的任务中已经显示了第一个任务的返回值的信息,返回信息如下:

$ ansible-playbook test.yml 

PLAY [B] ************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************
        ok: [B]

TASK [test shell] ***************************************************************************************************************************
changed: [B]

TASK [shell module return values] ***********************************************************************************************************
ok: [B] => {
    "testvar": {
        "changed": true, 
        "cmd": "echo test", 
        "delta": "0:00:00.028069", 
        "end": "2020-03-28 20:52:43.405588", 
        "failed": false, 
        "rc": 0, 
        "start": "2020-03-28 20:52:43.377519", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "test", 
        "stdout_lines": [
            "test"
        ]
    }
}

PLAY RECAP **********************************************************************************************************************************
B                          : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

从上述返回信息可以看出,返回值是 json 格式的,上述返回值中包含一些键值对,比如 "change": true"cmd": "echo test > /var/testshellfile" 等, 如果你只是想要获取到返回值中的某一项特定值,只需要指定键值对中的 key 即可,假设,我只是想要获取到上述返回信息中 cmd 的值,则可以使用如下两种语法:

# 语法一
  - name: shell module return values
    debug:
      msg: "{{testvar.cmd}}"
# 语法二
  - name: shell module return values
    debug:
      msg: "{{testvar['cmd']}}"

上述示例的返回信息为 shell 模块的返回值,不同的模块,返回值也不尽相同,如果你想要了解返回值中每一项的含义,则可以查看官方手册中对应模块的说明。

ansible 官网对一些常见的返回值进行了总结,链接如下:
https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html

注册的变量有一个特殊性,他可以被后续同一个主机的 play 所引用,看下面示例:

---
- hosts: B
  vars:
    testvar3: tv3
  tasks:
  - shell: "echo tv4"
    register: testvar4
  - debug:
      msg: "{{testvar3}} -- {{testvar4.stdout}}"
 
- hosts: B
  tasks:
  - name: other play get testvar4
    debug:
      msg: "{{testvar4.stdout}}"
  - name: other play get testvar3
    debug:
      msg: "{{testvar3}}"

执行上例的 playbook 时,在第二个 play 中获取 testvar3 时会报错,而在第二个 play 中获取注册变量 testvar4 时则正常,但是,注册变量中的信息是模块的返回值,这并不是我们自定义的信息,所以,如果想要在 tasks 中给变量自定义信息,并且在之后的 play 操作同一个主机时能够使用到之前在 tasks 中定义的变量时,则可以使用「set_facts 模块」定义对应的变量。

细心如你一定发现了,上述示例中,即使是跨 play 获取变量,也都是针对同一台主机,但是某些时候,我们可能想要在操作一台主机时,获取到之前操作的另一台主机中定义的变量,那么该怎样做呢?可参见「内置变量」。

0

评论区