gpt4 book ai didi

ansible:从同一剧本中的其他剧本访问寄存器变量

转载 作者:行者123 更新时间:2023-12-01 15:01:10 24 4
gpt4 key购买 nike

我正在尝试从第二个剧本中我的剧本中的第一个“play”访问名为“count”的变量。我在这里发现了一些关于同一问题的其他帖子,我认为我遵循了正确的步骤,但下面的代码仍然失败。

代码

- hosts: group1
tasks:
- name: count registrations on primary node
shell: psql -U widgets widgets -c 'SELECT COUNT(*) FROM location' -t
register: count
- debug: var=count.stdout

- hosts: group2
tasks:
#the line below works...
# - debug: msg={{ hostvars['myserver1.mydomain.com']['count']['stdout'] }}
# but this one fails
- debug: msg={{ hostvars['group1']['count']['stdout'] }}

这会产生以下输出:
PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [myserver1.mydomain.com]

TASK [count registrations on node] **************************************
changed: [myserver1.mydomain.com]

TASK [debug] *******************************************************************
ok: [myserver1.mydomain.com] => {
"count.stdout": " 2"
}

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [myserver2.mydomain.com]

TASK [debug] *******************************************************************
fatal: [myserver1.mydomain.com]: FAILED! => {"failed": true, "msg": "'ansible.vars.hostvars.HostVars object' has no attribute 'can_sip1'"}

NO MORE HOSTS LEFT *************************************************************
[ERROR]: Could not create retry file 'playbooks/test.retry'. The error was: [Errno 13] Permission denied: 'playbooks/test.retry'


PLAY RECAP *********************************************************************

myserver1.mydomain.com :确定=3 更改=1 无法访问=0 失败=0
myserver2.mydomain.com :确定=1 更改=0 无法访问=0 失败=1

我提到的另一篇文章在这里找到:
How do I set register a variable to persist between plays in ansible?

这可能很简单,但我看不出错误在哪里。
谢谢。

编辑 1

我也尝试过像这样使用 set_fact :
- hosts: group1
tasks:
- name: count registrations on primary node
shell: psql -U widget widget -c 'SELECT COUNT(*) FROM location' -t
register: result
- debug: var=result.stdout
- set_fact: the_count=result.stdout
- debug: var={{the_count}}

- hosts: group2
tasks:
- name: retrieve variable from previous play
shell: echo hello
- debug: var={{hostvars}}

我得到的结果是:
PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [myserver1.mydomain.com]

TASK [count reg on primary] ****************************************************
changed: [myserver1.mydomain.com]

TASK [debug] *******************************************************************
ok: [myserver1.mydomain.com] => {
"result.stdout": " 2"
}

TASK [set_fact] ****************************************************************
ok: [myserver1.mydomain.com]

TASK [debug] *******************************************************************
ok: [myserver1.mydomain.com] => {
"result.stdout": " 2"
}

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [myserver2.mydomain.com]

TASK [retrieve variable from previous play] ************************************
changed: [myserver2.mydomain.com]

TASK [debug] *******************************************************************
ok: [myserver2.mydomain.com] => {
"<ansible.vars.hostvars.HostVars object at 0x7f3b6602b290>": "VARIABLE IS NOT DEFINED!"
}

PLAY RECAP *********************************************************************
myserver1.mydomain.com : ok=5 changed=1 unreachable=0 failed=0
myserver2.mydomain.com : ok=3 changed=1 unreachable=0 failed=0

所以看起来hostvars中没有对象......

编辑 3

这就是今天早上的剧本。
- hosts: group1
tasks:
- name: count reg on primary
shell: psql -U widgets widgets -c 'SELECT COUNT(*) FROM location' -t
register: result
- debug: var=result.stdout
- set_fact: the_count={{result.stdout}}
- debug: var={{the_count}}

- hosts: group2
tasks:
- name: retrieve variable from previous play
shell: echo hello
- debug: var={{hostvars}}

第一次播放中的“debug: var={{the_count}}”行打印出正确的计数值,但它也表示 undefined variable ......就像这样:

任务 [set_fact] ************************************************ ******************
任务路径:/etc/ansible/playbooks/test.yml:8
好的:[myserver1.mydomain.com] => {“ansible_facts”:{“the_count”:“2”},“已更改”:false,“调用”:{“module_args”:{“the_count”:“2”} , "module_name": "set_fact"}}

任务[调试] ********************************************** ************************
任务路径:/etc/ansible/playbooks/test.yml:10
好的:[myserver1.mydomain.com] => {
"2": "变量未定义!"
}

然后一旦我打第二场比赛,我仍然会收到消息
TASK [debug] *******************************************************************
task path: /etc/ansible/playbooks/test.yml:16
ok: [myserver2.mydomain.com] => {
"<ansible.vars.hostvars.HostVars object at 0x7fb077fdc310>": "VARIABLE IS NOT DEFINED!"
}

在您的示例中,您建议我使用“debug: var={{hoSTLers}}”。如果你能为我澄清一下,请。看起来这是一个错字。

编辑 4:

如果您仔细查看 Edit 3,您会发现我已经按照您在回答中的建议实现了“debug:var={{hostvars}}”。但这给了我与 undefined variable 相同的错误。
我不只是试图将变量从一场比赛传递到另一场比赛……而是从一组主机传递给另一组主机。请注意播放 1 如何使用 group1,而播放 2 仅适用于 group2。

最佳答案

  • 寄存器变量,如事实,是每个主机的。这些值可能因机器而异。因此,您只能使用 list 中定义的主机/IP 作为键,而不是组名。我想你已经知道了,因为你在代码片段 1 中做了标记。
  • 在代码片段 2 中,set_fact行 ( - set_fact: the_count=result.stdout ) 实际上设置了键 the_count到文本值 result.stdout , 自 result.stdout被视为纯文本,而不是变量。如果你想把它当作一个变量,你最好使用{{ result.stdout }} .您可以通过运行带有 -v 的剧本来验证这一点。选项。

    任务:
  • set_fact: the_content1=content.stdout
  • set_fact: the_content2={{ content.stdout }}

  • 输出:
    TASK [set_fact] ****************************************************************
    ok: [192.168.1.58] => {"ansible_facts": {"the_content1": "content.stdout"}, "changed": false}

    TASK [set_fact] ****************************************************************
    ok: [192.168.1.58] => {"ansible_facts": {"the_content2": "hello world"}, "changed": false}
  • debug模块有两个可能的参数:varmsg . var参数期望一个变量名。
  • 调试:var={{hostvars}}

  • 在这一行中,首先,Ansible 提取 hostvars 的值, 因为它用两个括号括起来。其次,它试图找到一个名称为 hostvars 的变量。 , 自 var参数直接需要一个变量名。这就是为什么您会看到以下奇怪的输出。这意味着 Ansible 找不到名称为 <ansible.vars.hostvars.HostVars object at 0x7f3b6602b290> 的变量。 .
    "<ansible.vars.hostvars.HostVars object at 0x7f3b6602b290>": "VARIABLE IS NOT DEFINED!"

    您可以使用以下内容:
  • 调试:var=hostvars
  • 调试:msg={{hostvars}}

  • 引用:
  • Register variables don't survive across plays with different hosts
  • set_fact - Set host facts from a task
  • debug - Print statements during execution
  • 关于ansible:从同一剧本中的其他剧本访问寄存器变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35808649/

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