ansible:从同一剧本中的其他剧本中访问寄存器变量
我试图从第二个剧本的剧本中的第一个剧本中访问名为“count”的变量。我在这里找到了一些关于同一问题的其他帖子,我认为我遵循了正确的步骤,但下面的代码仍然失败 代码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 -
- 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=0myserver2.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
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}}
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!"