【问题标题】:Accessing inventory host variable in Ansible playbook在 Ansible playbook 中访问库存主机变量
【发布时间】:2016-10-13 17:56:50
【问题描述】:

在 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'"}

【问题讨论】:

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


    【解决方案1】:

    关于hostvars,您走在正确的轨道上。
    这个magic variable 用于访问其他主机的信息。

    hostvars 是一个以清单主机名作为键的哈希。
    要访问每个主机的字段,请使用hostvars['test-1']hostvars['test2-1'] 等。

    ansible_ssh_hostdeprecated,从 2.0 开始支持 ansible_host
    所以你应该首先从清单主机参数中删除“_ssh”(即成为“ansible_user”、“ansible_host”和“ansible_port”),然后在你的角色中调用它:

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

    【讨论】:

    • spaciba- 我尝试了那个语法,但我认为它不起作用,因为我这边的错字
    • 可以通过hostvars[inventory_hostname].ansible_host访问本机的ansible_host
    • 根本不用hostvars,我可以直接使用ansible_host变量
    【解决方案2】:
    [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 }}
    

    【讨论】:

      【解决方案3】:

      应该可以直接使用变量名

      ansible_ssh_host
      

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

      hostvars[inventory_hostname].ansible_ssh_host
      

      【讨论】:

        【解决方案4】:

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

        加一个playfill_file.yml

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

        加上一个模板file.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['test3']\" is undefined" 。

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

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

        【讨论】:

        • my play fails with "AnsibleUndefinedVariable: \"hostvars['test3']\" is undefined" 这是因为您没有主机test3。它适用于{{ hostvars['test3-1'].ansible_host }}{{ hostvars['test3-2'].ansible_host }}
        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          我还发现了一种很好且简单的方式来处理主机变量right on one of Ansible's Github issues

          看起来你也可以这样做:

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

          【讨论】:

          • 这已被弃用为“ansible_host”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          • 2020-09-07
          • 2020-08-25
          • 2015-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多