为什么在 Ansible 中,我不能在许多子组中拥有相同的密钥?

问题描述 投票:0回答:6

我想用我的 ansible 主机文件制作一些干净的东西。

如果我使用

ansible-playbook --limit calendar -i hosts update_common.yml

Ansible 在所有主机上执行我的剧本,甚至在其他组中的主机名上。

显然,它似乎来自我的钥匙

dev
prod

all:
  children:
    gitlab:
      children:
        dev:
          hosts:
            gitlab-dev:  # Stretch
        prod:
          hosts:
            gitlab-A:   # Stretch
            gitlab-B:   # Stretch
            gitlab-C.mysociety.fr:
              ansible_port: 22
    intranet:
      children:
        dev:
          hosts:
            intra-dev:      # Buster
            wordpress-dev:  # Buster
        prod:
          hosts:
            intra-prod:     # Buster
    calendar:
      children:
        dev:
          hosts:
            calendar-dev:
        prod:
          hosts:
            calendar:
ansible ansible-inventory hosts
6个回答
4
投票

Ansible 不存储组的树。该结构是所有组的平面列表。每个组都包含一个累积的主机列表。如果你运行下面的游戏

- hosts: all
  tasks:
    - debug:
        msg: "{{ groups[item] }}"
      loop: "{{ groups.keys()|list }}"
      run_once: true

您将看到组 gitlabintranetcalendar 是相同的,因为它们包含组 devprod 中的所有主机。接下来,您将看到组 dev 包含所有四个主机,组 prod 包含所有五个主机。

请参阅 Ansible:使用 yaml inventory 的两个主机组的交集


扁平化结构以实现你想要的,例如

all:
  children:
    gitlab_dev:
      hosts:
        gitlab-dev:  # Stretch
    gitlab_prod:
      hosts:
        gitlab-A:   # Stretch
        gitlab-B:   # Stretch
        gitlab-C.mysociety.fr:
          ansible_port: 22
    intranet_dev:
      hosts:
        intra-dev:      # Buster
        wordpress-dev:  # Buster
    intranet_prod:
      hosts:
        intra-prod:     # Buster
    calendar_dev:
      hosts:
        calendar-dev:
    calendar_prod:
      hosts:
        calendar:

3
投票

组名称必须是唯一的,这就是 ansible 的工作方式。您可以使用相同的组名称创建单独的清单文件,并使用不同的清单调用您的剧本或具有唯一的组名称。

查看此问题https://github.com/ansible/ansible/issues/32247以及其中一位开发人员的评论:

这不起作用,因为组名称是唯一的,它们不是基于与其他组的关系。

我建议创建具有您想要内置的层次结构的parent1_subgroup1命名组。


1
投票

我相信 Ansible 对库存的解释略有不同。

您指定要在

calendar
组中的所有主机上执行的 playbook。该包含
children
组中的所有内容。由于
children
还包含
gitlab
intranet
...

问题很可能是您在许多不同的级别和位置使用关键字。如果这可行,您必须指定剧本运行的路径。似乎不是 Ansible 的设计方式。


0
投票

是的,当我做

ansible-inventory -i hosts --list

我们可以看到它是如何管理的,开发主机被分组在一起,产品也是如此:(

    "all": {
        "children": [
            "calendar", 
            "gitlab", 
            "intranet", 
            "ungrouped"
        ]
    }, 
    "dev": {
        "hosts": [
            "calendar-dev", 
            "gitlab-test", 
            "intra-dev", 
            "wordpress-dev"
        ]
    }, 
    "fil-calendar": {
        "children": [
            "dev", 
            "prod"
        ]
    }, 
    "gitlab": {
        "children": [
            "dev", 
            "prod"
        ]
    }, 
    "intranet": {
        "children": [
            "dev", 
            "prod"
        ]
    }, 
    "prod": {
        "hosts": [
            "calendar", 
            "gitlab-A", 
            "gitlab-B", 
            "gitlab-C.mysociety.fr", 
            "intra-prod"
        ]
    }

0
投票

您是否有任何解决方法可以为所有新的唯一主机名共享相同的组变量,例如:

变量文件group_vars/de.yml

在此示例中所有主机之间共享?

gitlab:
  gitlab_dev:
intranet:
  intranet_dev:

0
投票

您不能在树中拥有相同的子密钥,但也许您可以退出树结构并将您的主机分配给多个独立组。

all:
  children:
    gitlab:
      hosts:
        gitlab-dev:
        gitlab-prod:
    calendar:
      hosts:
        calendar-dev:
        calendar-prod:
    dev:
      hosts:
        gitlab-dev:
        calendar-dev:
    prod:
      hosts:
        gitlab-prod:
        calendar-prod:  
© www.soinside.com 2019 - 2024. All rights reserved.