【发布时间】:2015-06-04 19:05:06
【问题描述】:
我有一本在不同主机上运行不同角色的剧本。 是否可以将变量从在一个主机上运行的一个角色传递到在同一剧本运行中运行的另一台主机上的另一个角色?或者任何解决方法?
playbook
host1
role1
here I get some variables: var1 var2 ...etc
host2
role2
here I need to use var1 var2 ... etc from the above host/role
role1 中设置变量 db 的任务如下所示:
- shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/ '{print $4}' | awk -F? '{print $1}'
register: db
更新:在第一台主机上,这些值是动态的,就像一个始终更新的配置文件。在我使用角色 1 将值存储在主机 1 上的变量中之后,我移动到主机 2,运行角色 2 并使用主机 1 存储的变量中的这些值进行处理。
我尝试使用主机变量:
{{ hostvars.LBL.db.stdout }}
{{ hostvars['LBL']['db'] }}
{{ hostvars['LBL']['db']['stdout'] }}
我得到错误:
in get_variables raise Exception("host not found: %s" % hostname) Exception: host not found: LBL
LBL 存在于主机中,因为我运行第一个角色
我在一台主机上设置了一个变量,我希望该变量对另一台主机可用。所有这些都在一个剧本中。可以吗?
hostvars 不能像这样使用它:
---
- name: test hostvars host1
hosts: LBL
tasks:
- command: "ls /bin"
register: ls_out
- name: test hostvars host2
hosts: LM
tasks:
- debug:
var: "{{ hostvars['LBL']['ls_out']['stdout'] }}"
错误:
fatal: [10.104.148.138] => host not found: LBL
/etc/ansible/hosts
[root@NS1 ansible]# cat /etc/ansible/hosts
[LBL]
10.104.148.136
[LM]
10.104.148.138
【问题讨论】:
-
你能发布剧本中设置变量 var1/2 的部分吗?
hostvars.LBL.*应该有效。如果 var1/2 是在库存文件中定义的,那么也发布它。 -
这是第一个角色
- name: bla bla shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/ '{print $4}' | awk -F? '{print $1}' register: db如果我这样做并在同一角色中回显 {{ do.stdout }} 效果很好。我不使用库存。在第二个角色中,如果我这样做shell: echo "{{ hostvars['LBL']['db']['stdout'] }}"它会给出错误 -
“hostvars 无法像这样使用它:”这是不可能的。这两个任务对我来说工作得很好,并按预期打印
ls_out。发布了错误的代码或什么...?请详细说明“不工作” -
我在上面的问题中添加了那个单一剧本的输出。 Ansible 版本是 1.9.0.1 ... 1.8.4 的输出相同
标签: variables ansible roles ansible-playbook