【问题标题】:Ansible - Get groups specific subgroupsAnsible - 获取组特定的子组
【发布时间】:2020-11-19 05:57:24
【问题描述】:

我的库存中定义了以下组:

[webservers]

[server_storage]

[server_ws1]

[webservers:children]
server_storage
server_ws1

在我玩的过程中,我只需要获取 group['webservers'] 的子组的名称(我认为这些是“子组”)

所以,假设我需要 set_fact 一个变量,在这种情况下包含字符串列表:

 - server_storage
 - server_ws1

这必须是动态的,所以如果我将组'server_ws2'添加到组['webservers'],这应该返回

 - server_storage
 - server_ws1
 - server_ws2

我一直在使用 group_names, group['webservers'](它不返回子组,而是主机名)

基本上,我需要一种简单的方法来获取特定组的子组列表。如果不使用黑魔法,这可能吗?

更新:这个想法是主机可以属于更多组,但我只需要 webservers 组的子组或子组。它是恒定的,无论主机如何,输出都应该是相同的。

顺便说一句,这个不起作用How can I get a list of child groups in Ansible?,因为它为当前主机重新调整所有组,我只需要指定组的子组。

【问题讨论】:

    标签: ansible ansible-inventory


    【解决方案1】:

    问:“获取 group['webservers'] 的子组的名称”

    A:例如库存

    shell> cat hosts
    [webservers]
    
    [server_storage]
    host_01
    
    [server_ws1]
    host_02
    
    [webservers:children]
    server_storage
    server_ws1
    

    和剧本

    shell> cat playbook.yml
    - hosts: webservers
      tasks:
    
        - set_fact:
            subgroups: "{{ subgroups|default([]) + hostvars[item].group_names }}"
          loop: "{{ groups.webservers }}"
          run_once: true
    
        - debug:
            msg: "{{ subgroups|unique|difference(['webservers']) }}"
          run_once: true
    

    给(删节)

    shell> ansible-playbook -i hosts playbook.yml 
    
      msg:
      - server_storage
      - server_ws1
    

    作为一种解决方法,可以使用ansible-inventory 列出库存的结构,将输出存储在文件中,并根据需要使用此文件,例如include_vars 在剧本中。请参阅下面的示例

    shell> cat hosts
    host_01
    host_02
    
    [webservers]
    
    [server_storage]
    
    [server_ws1]
    
    [webservers:children]
    server_storage
    server_ws1
    
    shell> ansible-inventory -i hosts --list --output hosts.json
    shell> cat hosts.json
    {
        "_meta": {
            "hostvars": {}
        },
        "all": {
            "children": [
                "ungrouped",
                "webservers"
            ]
        },
        "ungrouped": {
            "hosts": [
                "host_01",
                "host_02"
            ]
        },
        "webservers": {
            "children": [
                "server_storage",
                "server_ws1"
            ]
        }
    

    【讨论】:

    • 我很欣赏这个答案,但它没有按预期工作。我会用这个问题更新问题。仅当这些主机仅属于这些组时,您的答案才有效,但如果它们属于其他组,则它们也会与您的代码一起显示。
    • Ansible 不收集有关组结构的任何信息。只有hostvars[item].group_names 可用。结果:1)不可能从剧本中分析空组的结构。 2) 只能交叉/区分组的平面列表。
    • 我明白了,似乎没有简单的方法可以实现我所需要的,(实际需要这个的原因说来话长,不是心血来潮,到目前为止找不到方法来重新-在我当前的设置中构建一些东西,使其变得不必要)。我有一种感觉,这将是这种情况,因此是“黑魔法”评论。不过感谢您的努力。我会保持开放一段时间,看看是否有人提出了解决方法,如果没有任何反应,请将您的答案标记为正确答案。谢谢。
    • 作为一种解决方法,请尝试ansible-inventory。我已经用一个例子更新了答案。
    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多