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

ansible:从同一剧本中的其他剧本中访问寄存器变量,ansible,ansible-playbook,Ansible,Ansible Playbook,我试图从第二个剧本的剧本中的第一个剧本中访问名为“count”的变量。我在这里找到了一些关于同一问题的其他帖子,我认为我遵循了正确的步骤,但下面的代码仍然失败 代码 - hosts: group1 tasks: - name: count registrations on primary node shell: psql -U widgets widgets -c 'SELECT COUNT(*) FROM location' -t register: count -

我试图从第二个剧本的剧本中的第一个剧本中访问名为“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:ok=3 changed=1 unreachable=0 failed=0
myserver2.mydomain.com:ok=1 changed=0 unreachable=0 failed=1

我提到的另一个帖子在这里:

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

编辑1

我也尝试过这样使用set_事实:

- 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   
第一次播放的“debug:var={{The_count}}}”行打印出正确的计数值,但它也表示未定义变量。。。像这样:

任务[设置事实]**************************************************************** 任务路径:/etc/ansible/playbooks/test.yml:8 ok:[myserver1.mydomain.com]=>{“ansible_facts”:{“the_count”:“2”},“changed”:false,“invocation”:{“module_args”:{“the_count”:“2”},“module_name”:“set_facts”}

任务[调试]******************************************************************* 任务路径:/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!"
}
任务[调试]*******************************************************************
任务路径:/etc/ansible/playbooks/test.yml:16
确定:[myserver2.mydomain.com]=>{
“”:“未定义变量!”
}
在您的示例中,您建议我使用“debug:var={{{hostlers}}”。如果你能为我澄清这一点,请。看起来像是打字错误

编辑4:

如果您仔细查看edit3,您将看到我已经按照您在回答中的建议实现了“debug:var={{{hostvars}}”。但是它给了我一个错误,变量没有定义。 我不仅仅是想把变量从一个剧本传递到另一个剧本。。但是从一组主机到另一组主机。请注意,播放1如何使用组1,播放2如何仅适用于组2

  • 寄存器变量,如事实,是每个主机。这些值可能因机器而异。因此,您只能将清单中定义的主机/ip用作密钥,而不能使用组名。我想您已经知道了这一点,因为您在代码片段1中标记了这一点

  • 在代码片段2中,
    set_fact
    行(
    -set_fact:the_count=result.stdout
    )实际上将键
    the_count
    设置为文本值
    result.stdout
    ,因为
    result.stdout
    被视为纯文本,而不是变量。如果要将其作为变量处理,最好使用
    {{{result.stdout}}
    。您可以通过使用
    -v
    选项运行playbook来验证这一点

    任务:

    • 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
    模块有两个可能的参数:
    var
    msg
    var
    参数需要一个变量名

    • 调试:var={{hostvars}}
    在这一行中,首先,Ansible提取
    hostvars
    的值,因为它用两个括号括起来。其次,它试图找到一个名为
    hostvars
    值的变量,因为
    var
    参数直接需要一个变量名。这就是为什么您会看到以下奇怪的输出。这意味着Ansible找不到名为

  • @dot编辑3中的错误消息表示Ansible试图查找名为
    2
    的变量,但该变量不存在。请你核对一下我的答案好吗?
    debug
    var
    参数需要纯文本形式的变量名。而
    {{u count}}
    提供
    u count
    变量的值
    2
    。所以Ansible尝试查找名为
    2
    @dot的变量。很抱歉,我想使用调试模块的msg参数。没关系。你能在这里闲聊几分钟而不是来回走动吗?
    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}
    
    "<ansible.vars.hostvars.HostVars object at 0x7f3b6602b290>": "VARIABLE IS NOT DEFINED!"