【问题标题】:Ansible, how to define a list in host inventory?Ansible,如何在主机清单中定义列表?
【发布时间】:2017-02-10 01:22:34
【问题描述】:

我有一本剧本,我想在我的主机文件中定义一个字符串列表。

这是我的主机文件:

[dashboard]
1.2.3.4 dashboard_domain=test site_domain=['one','two','foo', 'bar'] 

这是我尝试使用list documentation 编写的剧本:

---
- hosts: dashboard
  gather_facts: False
  remote_user: ubuntu
  become: yes

  tasks:

    - name: ping
      ping:

    - debug: 
        msg: "Domain: {{dashboard_domain}}"

    - debug: 
        msg: "Site: {{ item }}"
      with_items: "{{site_domain}}"

但是使用ansible-playbook -i hosts ping.yml 运行此剧本会导致此错误:

任务:[调试] ****************************************** ************************
致命的:[1.2.3.4] => with_items 需要一个列表或一个集合

这似乎是将定义的列表从主机文件传输到 playbook 的问题,因为直接在 playbook 中定义列表是可行的:

---
- hosts: dashboard
  gather_facts: False
  remote_user: ubuntu
  become: yes
  vars:
    site_domain: ['one','two','foo', 'bar'] 
  tasks:

    #### APPLY HTTP-AUTH ####
    - name: ping
      ping:

    - debug: 
        msg: "Domain: {{dashboard_domain}}"

    - debug: 
        msg: "Site: {{ item }}"
      with_items: "{{site_domain}}"

【问题讨论】:

    标签: ansible yaml ansible-inventory


    【解决方案1】:

    只需引用变量值:

    [dashboard]
    1.2.3.4 dashboard_domain=test site_domain="['one','two','foo', 'bar']"
    

    对于 INI 格式的清单文件,如果变量值以未引用的 [ 开头并将其作为字符串传递,Ansible 似乎不会解析它。


    关于您的示例:如果您确实有空间,我不确定为什么您在读取库存文件时没有收到expected key=value 错误。

    【讨论】:

      【解决方案2】:

      @techraf 确实回答了您的问题,如果dashboard 组中的每个主机都有一个具有不同值的site_domain 列表,他们的解决方案就是完美的。

      不过,看看你的剧本,site_domain 在整个dashboard 组中似乎是不变的。如果dashboard 中有 10 个主机,则必须将列表复制到每个主机的行中。为避免重复,您可以在清单中有一个 dashboard:vars 部分,您可以在其中为组中的所有主机定义具有相同值的变量:

      [dashboard:vars]
      site_domain="['one','two','foo', 'bar']"
      
      [dashboard]
      1.2.3.4 dashboard_domain=test
      1.2.3.5 dashboard_domain=uat
      1.2.3.6 dashboard_domain=integ
      

      https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#assigning-a-variable-to-many-machines-group-variables

      如果您的库存文件夹更加结构化,您还可以在 YAML 中的单独文件中为 dashboard 组定义变量。您的库存文件夹树可能是:

      inventories
       |
       +-- group_vars
       |    \-- dashboard.yml
       |
       +-- hosts.ini
      

      在该配置中,dashboard.yml 可能只是:

      site_domain: ['one', 'two', 'foo', 'bar']
      

      ...或:

      site_domain:
        - one
        - two
        - foo
        - bar
      

      https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#organizing-host-and-group-variables

      【讨论】:

        猜你喜欢
        • 2019-09-28
        • 2018-06-30
        • 1970-01-01
        • 2018-04-13
        • 2018-12-08
        • 2021-03-04
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        相关资源
        最近更新 更多