在 Ansible 剧本中访问库存主机变量

Accessing inventory host variable in Ansible playbook

在 Ansible 2.1 中,我有一个角色被需要访问主机文件变量的剧本调用。关于如何访问它有什么想法吗?

我正在尝试访问以下清单 host 文件的 test1 部分中的 ansible_ssh_host

[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 }}

我收到这个错误:

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

关于 hostvars,您的方向是正确的。
magic variable 用于访问有关其他主机的信息。

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

ansible_ssh_host 自 2.0 以来 deprecated 有利于 ansible_host
因此,您应该首先从清单主机参数中删除“_ssh”(即变为“ansible_user”、“ansible_host”和“ansible_port”),然后在您的角色中调用它:

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

你应该可以直接使用变量名

ansible_ssh_host

或者您可以通过 hostvars 而不必逐字指定主机 通过使用 magic variable inventory_hostname

hostvars[inventory_hostname].ansible_ssh_host
[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 }}

我还找到了一种很好的简单方法来处理 hostvars right on one of Ansible's Github issues

看起来你也可以这样做:

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

我也为此苦苦挣扎。我的具体设置是:您的 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

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

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

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

我的播放失败并显示 "AnsibleUndefinedVariable: \"hostvars[[=​​36=]]\" is undefined" 。

备注:我尝试了一些变化,但失败了,偶尔 "ansible.vars.hostvars.HostVars object has no element ";其中一些可以用他们所说的来解释。在 https://github.com/ansible/ansible/issues/13343#issuecomment-160992631

hostvars emulates a dictionary [...]. hostvars is also lazily loaded

非常感谢这篇笔记对我很有用! 能够发送 ansible 剧本中 /group_var/vars 下定义的变量 如下所示。

任务:
- 名称:检查服务帐户密码是否过期
- 命令:

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