【问题标题】:Ansible inventory: Categorize hosts with multiple criteriaAnsible 清单:使用多个标准对主机进行分类
【发布时间】:2020-05-23 13:14:15
【问题描述】:

我对 Ansible 完全陌生,所以我仍在为它的工作方式苦苦挣扎……我有一个清单文件,其中包含按环境和功能排序的多个主机:

[PRO-OSB]
host-1
host-2
[PRO-WL]
host-3
host-4
[PRO:children]
PRO-OSB
PRO-WL

但我认为有时我可能需要运行剧本来指定更多内容,即关注环境、其功能、主机集群和在主机上运行的应用程序。因此,在简历中,每个主机都必须有 4 个“类别”:环境、功能、集群和应用程序。 我怎样才能做到这一点而不必不断重复输入?

【问题讨论】:

    标签: ansible ansible-inventory


    【解决方案1】:

    我怎样才能做到这一点而不必不断重复输入?

    你不能。您必须在每个需要的组中声明属于它的机器。因此,如果一台机器属于 4 个不同的组(不考虑父组),您必须在 4 个相关组中声明该主机。

    Ansible 可以选择其他方式(即为每个主机列出它所属的组),但这不是保留的解决方案,它会很冗长。

    为了让事情变得更简单并且 IMO 更安全一些,您可以将您的库存拆分为多个环境库存(产品、开发......),这样您就可以消除每个库存中的一个复杂级别。缺点是您无法使用这样的设置同时定位所有环境。

    如果您的广告资源很大并且针对某种集群/云环境(vsphere、aws...),dynamic inventories 可以提供帮助。

    【讨论】:

      【解决方案2】:

      问:“每个主机都必须有 4 个“类别”:环境、功能、集群和应用程序。我怎样才能在不不断重复条目的情况下实现这一点?”

      答:可以在 [*:vars] 部分中声明默认选项并使用主机的特定选项覆盖它。见How variables are merged。例如库存

      $ cat hosts
      [PRO_OSB]
      test_01 my_cluster='cluster_A'
      test_02
      [PRO_WL]
      test_03 my_cluster='cluster_A'
      test_04
      [PRO:children]
      PRO_OSB
      PRO_WL
      [PRO:vars]
      my_environment='default_env'
      my_function='default_fnc
      my_cluster='default_cluster'
      my_app='default_app'
      

      与剧本

      - hosts: PRO
        gather_facts: false
        tasks:
          - debug:
              msg: "{{ inventory_hostname }}
                    {{ my_environment }}
                    {{ my_function }}
                    {{ my_cluster }}
                    {{ my_app }}"
      

      给出(test_01 和 test_03 的 my_cluster 变量被主机值覆盖)

      "msg": "test_01 default_env 'default_fnc cluster_A default_app"
      "msg": "test_02 default_env 'default_fnc default_cluster default_app"
      "msg": "test_04 default_env 'default_fnc default_cluster default_app"
      "msg": "test_03 default_env 'default_fnc cluster_A default_app"
      

      问:“运行 playbooks 指定更多内容,即关注环境、其功能、主机集群和应用程序。”

      可以使用模块add_host 创建动态组并根据需要选择主机。例如在第一个播放中创建新组cluster_A并在下一个播放中使用它

      - hosts: all
        tasks:
          - add_host:
              name: "{{ item }}"
              group: cluster_A
            loop: "{{ hostvars|
                      dict2items|
                      json_query('[?value.my_cluster == `cluster_A`].key') }}"
            delegate_to: localhost
            run_once: true
      
      - hosts: cluster_A
        tasks:
          - debug:
              var: inventory_hostname
      

      给予

      ok: [test_01] => {
          "inventory_hostname": "test_01"
      }
      ok: [test_03] => {
          "inventory_hostname": "test_03"
      }
      

      【讨论】:

        【解决方案3】:

        对于可能需要这样的人-

        当我尝试为每个主机建立多个变量以根据角色或团队交付文件时,我最终将这种格式用于我的库存文件。

        库存/支持/主机

        support:
          hosts: 
            qahost:
              host_role: 
                waiter
                dishwasher
              host_teams: 
                ops
                sales
            awshost:
              host_role:
                waiter
              host_teams:
                dev
            testhost1:
              host_role:
                dishwasher
              host_teams:
                ops
                dev
            testhost2:
              host_role:
                dishwasher
                boss
              host_teams:
                ops
                dev
                sales
        
        

        并在本剧中引用了他们:

        - name: parse inventory file host variables
          debug:
            msg: |
              - "role attribute of host: {{ item }} is {{ hostvars[item]['host_role'] }}"
              - "team attribute of host: {{ item }} is {{ hostvars[item]['host_teams'] }}"
          with_items: "{{ inventory_hostname }}"
          when: hostvars[item]['host_teams'] is contains (team_name)
        

        带有自定义 extra_var 的 ansible 命令被传递到 playbook 并在清单中与 when 条件匹配:

        ansible-playbook -i inventory/support/hosts -e 'team_name="sales"' playbook.yml
        
        

        【讨论】:

          猜你喜欢
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-08
          • 1970-01-01
          相关资源
          最近更新 更多