本来打算自己写一波 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 获取变量,也都是针对同一台主机,但是某些时候,我们可能想要在操作一台主机时,获取到之前操作的另一台主机中定义的变量,那么该怎样做呢?可参见「内置变量」。
评论区