gpt4 book ai didi

ansible - 如何注册变量并在针对不同节点的播放之间保留它?

转载 作者:行者123 更新时间:2023-12-03 05:58:16 24 4
gpt4 key购买 nike

我有一个Ansible playbook ,我希望在针对一个节点的第一次播放中注册的变量可在针对另一个节点的第二次播放中使用。

这是我正在使用的剧本:

---
- hosts: localhost
gather_facts: no

tasks:
- command: echo "hello world"
register: foo


- hosts: main
gather_facts: no

tasks:
- debug:
msg: {{ foo.stdout }}

但是,当我尝试访问第二个播放中的变量(针对 main)时,我收到以下消息:

The task includes an option with an undefined variable. The error was: 'foo' is undefined

如何访问注册于localhostfoo ,来自main

最佳答案

您遇到的问题是您试图从另一台主机的事实/变量中引用一台主机的事实/变量。

您需要记住,在 Ansible 中,分配给主机 localhost 的变量 foo 与分配给主机 localhost 的变量 foo 不同主机 main 或任何其他主机。
如果您想从另一台主机访问一台主机的事实/变量,那么您需要通过 hostvars 变量显式引用它。关于这个有更多的讨论in this question .

假设您有这样的剧本:

- hosts: localhost
gather_facts: no

tasks:
- command: echo "hello world"
register: foo


- hosts: localhost
gather_facts: no

tasks:
- debug:
var: foo

这将起作用,因为您在两个播放中都引用了主机 localhostlocalhosts 变量 foo 的实例。

这个剧本的输出是这样的:

PLAY [localhost] **************************************************

TASK: [command] ***************************************************
changed: [localhost]

PLAY [localhost] **************************************************

TASK: [debug] *****************************************************
ok: [localhost] => {
"var": {
"foo": {
"changed": true,
"cmd": [
"echo",
"hello world"
],
"delta": "0:00:00.004585",
"end": "2015-11-24 20:49:27.462609",
"invocation": {
"module_args": "echo \"hello world\",
"module_complex_args": {},
"module_name": "command"
},
"rc": 0,
"start": "2015-11-24 20:49:27.458024",
"stderr": "",
"stdout": "hello world",
"stdout_lines": [
"hello world"
],
"warnings": []
}
}
}

如果您稍微修改此剧本以在一个主机上运行第一个游戏并在另一台主机上运行第二个游戏,您将收到遇到的错误。

解决方案

解决方案是使用 Ansible 的内置 hostvars 变量让第二个主机显式引用第一个主机变量。

因此修改第一个示例如下:

- hosts: localhost
gather_facts: no

tasks:
- command: echo "hello world"
register: foo


- hosts: main
gather_facts: no

tasks:
- debug:
var: foo
when: foo is defined

- debug:
var: hostvars['localhost']['foo']
## alternatively, you can use:
# var: hostvars.localhost.foo
when: hostvars['localhost']['foo'] is defined

此 playbook 的输出显示第一个任务被跳过,因为 foo 未由主机 main 定义。
但第二个任务成功了,因为它显式引用了变量 foolocalhosts 实例:

TASK: [debug] *************************************************
skipping: [main]

TASK: [debug] *************************************************
ok: [main] => {
"var": {
"hostvars['localhost']['foo']": {
"changed": true,
"cmd": [
"echo",
"hello world"
],
"delta": "0:00:00.005950",
"end": "2015-11-24 20:54:04.319147",
"invocation": {
"module_args": "echo \"hello world\"",
"module_complex_args": {},
"module_name": "command"
},
"rc": 0,
"start": "2015-11-24 20:54:04.313197",
"stderr": "",
"stdout": "hello world",
"stdout_lines": [
"hello world"
],
"warnings": []
}
}
}
<小时/>

因此,简而言之,您希望修改 main playbook 中的变量引用,以通过以下方式引用 localhost 变量:

{{ hostvars['localhost']['foo'] }}
{# alternatively, you can use: #}
{{ hostvars.localhost.foo }}

关于ansible - 如何注册变量并在针对不同节点的播放之间保留它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33896847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com