使用--limit

时间:2019-05-13 21:37:57

标签: ansible

我想将剧本应用于一部分主机。对于所有位于“ atlanta”下而不是“ raleigh

下的dbserver主机

但是我不知道如何使用--limit指向清单中主机的特定子树

 ansible all -i ./testhosts.yml --limit atlanta --list-hosts

  hosts (4):
    host1-atlanta
    host2-atlanta
    host1-raleigh
    host2-raleigh

 ansible all -i ./testhosts.yml --limit 'atlanta:&dbservers' --list-hosts

  hosts (4):
    host1-atlanta
    host2-atlanta
    host1-raleigh
    host2-raleigh

我希望得到的是

    host1-atlanta
    host2-atlanta

(在我的情况下,子树的“逻辑”路径是:all:usa:southeast:atlanta:dbservers)

我的示例testhosts.yml

all:
  children:
    usa:
      children:
        southeast:
          children:
            atlanta:
                children:
                    dbservers:
                      hosts:
                        host1-atlanta:
                          ansible_port: 11022
                          ansible_host: 11.0.1.2
                        host2-atlanta:
                          ansible_port: 11022
                          ansible_host: 11.0.1.3
            raleigh:
                children:
                    dbservers:
                      hosts:
                        host1-raleigh:
                          ansible_port: 11022
                          ansible_host: 10.0.1.2
                        host2-raleigh:
                          ansible_port: 11022
                          ansible_host: 10.0.1.3
        northeast:
        northwest:
        southwest:

是否可以使用--limit命令行选项来过滤掉除特定子树之外的所有内容?

我的上层ansible调用脚本已经知道它们将在哪个站点上运行,因此我希望可以以某种方式拥有一个公共主机文件,但能够使用某种树形导航“选择器”来指定组。

我意识到我可以做到

 ansible atlanta -i ./testhosts.yml --limit atlanta --list-hosts

但是我遇到的问题是,当我使用ansible-playbook时,这种类型的“选择器”不可用。 我可以找到的唯一选择器(过滤器)是--limit,这似乎对我不起作用。

2 个答案:

答案 0 :(得分:1)

尽管出现,但ansible中的组不是分层的。您只有一个dbservers组,并且该组的成员也同时属于atlantaraleigh。只需少量更改库存,您就可以更接近想要的东西:

all:
  children:
    dbservers:
      children:
        dbservers-atl:
        dbservers-ral:
    usa:
      children:
        southeast:
          children:
            atlanta:
                children:
                    dbservers-atl:
                      hosts:
                        host1-atlanta:
                          ansible_port: 11022
                          ansible_host: 11.0.1.2
                        host2-atlanta:
                          ansible_port: 11022
                          ansible_host: 11.0.1.3
            raleigh:
                children:
                    dbservers-ral:
                      hosts:
                        host1-raleigh:
                          ansible_port: 11022
                          ansible_host: 10.0.1.2
                        host2-raleigh:
                          ansible_port: 11022
                          ansible_host: 10.0.1.3
        northeast:
        northwest:
        southwest:

使用此清单,每个区域都有一个单独的dbservers-<tag>组。您所在区域层次结构之外的全局dbservers组包括 all dbservers-<tag>组。有了这个,您可以要求:

ansible all --list-hosts --limit dbservers-atl

并获得:

  hosts (2):
    host1-atlanta
    host2-atlanta

或者您可以要求加入dbservers组:

ansible all --list-hosts --limit dbservers

并获得:

  hosts (4):
    host1-raleigh
    host2-raleigh
    host1-atlanta
    host2-atlanta

答案 1 :(得分:0)

您对'-limit '选项的说明不正确:

  

...当我使用ansible-playbook时,这种类型的“选择器”不可用。

引用“ man ansible ”或“ man ansible-playbook ”:

  

-l'SUBSET',--limit'SUBSET'             进一步将选定的主机限制为其他模式

详细信息可在Working with Patterns中找到。例如,相当于运行ansible

ansible all --limit '!dbservers' ...

在剧本中声明了“ 主机”。yml

- hosts: all:!dbservers

并运行

ansible-playbook playbook.yml

下一个等效项是在playbook.yml中声明所有“ 主机

- hosts: all

并运行

ansible-playbook --limit '!dbservers' playbook.yml