访问ansible playbook中的库存主机变量

时间:2016-10-13 17:56:51

标签: ansible ansible-playbook ansible-2.x ansible-inventory

我正在使用ansible 2.1。我有以下清单主机文件和一个需要访问主机文件变量的播放器调用的角色。有关如何访问它的任何想法(目前收到错误):

主机文件

[test1]
test-1 ansible_ssh_host=abc.def.ghi.jkl ansible_ssh_port=1212

[test2]
test2-1 ansible_ssh_host=abc.def.ghi.mno ansible_ssh_port=1212

[test3]
test3-1 ansible_ssh_host=abc.def.ghi.pqr ansible_ssh_port=1212
test3-2 ansible_ssh_host=abc.def.ghi.stu ansible_ssh_port=1212

[all:children]
test1
test2
test3

作用 我曾尝试以下列方式访问该角色:

{{ hostvars.ansible_ssh_host }} 

&安培;&安培;

{{ hostvars.test1.ansible_ssh_host }}

我正在尝试访问test1部分中的ansible_ssh_host。

错误

fatal: [localhost]: FAILED! => {"failed": true, "msg": "'ansible.vars.hostvars.HostVars object' has no attribute 'ansible'"}

6 个答案:

答案 0 :(得分:34)

您在hostvars的正确轨道上 此magic variable用于访问有关其他主机的信息。

hostvars是一个哈希,库存主机名为键 要访问每个主机的字段,请使用hostvars['test-1']hostvars['test2-1']

自2.0起,{p> ansible_ssh_host deprecated赞成ansible_host 因此,您应首先从库存主机参数中删除“_ssh”(即成为“ansible_user”,“ansible_host”和“ansible_port”),然后在您的角色中调用它:

{{ hostvars['your_host_group'].ansible_host }}

答案 1 :(得分:11)

[host_group]
host-1 ansible_ssh_host=192.168.0.21 node_name=foo
host-2 ansible_ssh_host=192.168.0.22 node_name=bar

[host_group:vars]
custom_var=asdasdasd

您可以使用以下方式访问主机组变量:

{{ hostvars['host_group'].custom_var }}

如果您需要特定主机的特定值,您可以使用:

{{ hostvars[groups['host_group'][0]].node_name }}

答案 2 :(得分:5)

您应该可以直接使用变量名称

ansible_ssh_host

或者你可以通过hostvars而无需按字面指定主机 使用magic variable inventory_hostname

hostvars[inventory_hostname].ansible_ssh_host

答案 3 :(得分:1)

非常感谢您对我的帮助! 能够发送ansible剧本中/ group_var / vars下定义的变量 如下所示。

任务:
    -名称:检查服务帐户密码的有效期
    -命令:

sh /home/monit/get_ldap_attr.sh {{ item }} {{ LDAP_AUTH_USR }}

答案 4 :(得分:0)

我还发现了一种解决主机变量right on one of Ansible's Github issues

的好方法

看起来您也可以这样做:

 - debug:
    msg: "{{ ansible_ssh_host }}"

答案 5 :(得分:0)

我也为此感到挣扎。我的特定设置是:您的host.ini(具有现代名称):

[test3]
test3-1 ansible_host=abc.def.ghi.pqr ansible_port=1212
test3-2 ansible_host=abc.def.ghi.stu ansible_port=1212

加上播放fill_file.yml

---
- remote_user: ec2-user
  hosts: test3
  tasks:
   - name: fill file
     template:
       src: file.j2
       dest: filled_file.txt

加上模板文件j2,例如

{% for host in groups['test3'] %}
   {{ hostvars[host].ansible_host }}
{% endfor %}

这对我有用,结果是

abc.def.ghi.pqr
abc.def.ghi.stu

我必须承认它是2.7,而不是2.1。该模板是https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html中一个示例的变体。

接受的答案在我的设置中不起作用。带有模板

{{ hostvars['test3'].ansible_host }}

我的游戏失败,显示“ AnsibleUndefinedVariable:\” hostvars ['test3'] \”未定义”。

备注:我尝试了一些变体,但失败了,偶尔出现“ ansible.vars.hostvars.HostVars对象没有元素”;他们的话可能会解释其中的一些内容。在https://github.com/ansible/ansible/issues/13343#issuecomment-160992631

  

hostvars模拟字典[...]。 hostvars也被延迟加载