首页 文章

Ansible通过库存嵌套循环

提问于
浏览
1

我正在查看Ansible https://docs.ansible.com/ansible/2.7/user_guide/playbooks_loops.html的循环页面,但我找不到我要找的东西......

我想测试一个“源”主机是否可以到达/连接到一组端口上的一组目标主机 . 例如,每组目标主机可以是库存组,并且每个库存组具有它们自己要测试的端口的列表 .

我们的想法是只指定两个vars作为playbook的输入:一组主机列表和一个或多个源主机的列表 .

循环应该怎么做?库存可以是YAML或INI文件:每个组一个或多个 . TCP连接的测试很简单......因此重点仅在于输入变量和循环结构 .

感谢致敬 .

燕姿

1 回答

  • 0

    给出以下 hosts 库存文件

    server1
    server2
    server3
    
    [dev]
    d1
    d2
    d3
    
    [dev:vars]
    ports=8080,8443
    
    [int]
    i1
    i2
    i3
    
    [int:vars]
    ports=80,443
    

    和以下的剧本 play.yml

    ---
    - hosts: all
      gather_facts: False
      vars:
        group: 'dev'
    
      tasks:
      - name: Just loop through a group and group_vars
        debug:
          msg: 'group is {{group}} target is {{item.0}} port is {{item.1}}'
        loop: >
          {{ groups[group] |
             product(hostvars[groups[group][0]]["ports"]) |
             list }}
    

    如您所述,您可以循环浏览您的库存

    ansible-playbook -i hosts play.yml -l server* -e group=int
    

    产生以下结果:

    PLAY [all] *********************************************************************
    
    TASK [Just loop through a group and group_vars] ********************************
    ok: [server1] => (item=[u'i1', 80]) => {
        "msg": "group is int target is i1 port is 80"
    }
    ok: [server1] => (item=[u'i1', 443]) => {
        "msg": "group is int target is i1 port is 443"
    }
    ok: [server2] => (item=[u'i1', 80]) => {
        "msg": "group is int target is i1 port is 80"
    }
    ok: [server2] => (item=[u'i1', 443]) => {
        "msg": "group is int target is i1 port is 443"
    }
    ok: [server1] => (item=[u'i2', 80]) => {
        "msg": "group is int target is i2 port is 80"
    }
    ok: [server3] => (item=[u'i1', 80]) => {
        "msg": "group is int target is i1 port is 80"
    }
    ok: [server1] => (item=[u'i2', 443]) => {
        "msg": "group is int target is i2 port is 443"
    }
    ok: [server3] => (item=[u'i1', 443]) => {
        "msg": "group is int target is i1 port is 443"
    }
    ok: [server2] => (item=[u'i2', 80]) => {
        "msg": "group is int target is i2 port is 80"
    }
    ok: [server1] => (item=[u'i3', 80]) => {
        "msg": "group is int target is i3 port is 80"
    }
    ok: [server3] => (item=[u'i2', 80]) => {
        "msg": "group is int target is i2 port is 80"
    }
    ok: [server2] => (item=[u'i2', 443]) => {
        "msg": "group is int target is i2 port is 443"
    }
    ok: [server1] => (item=[u'i3', 443]) => {
        "msg": "group is int target is i3 port is 443"
    }
    ok: [server3] => (item=[u'i2', 443]) => {
        "msg": "group is int target is i2 port is 443"
    }
    ok: [server2] => (item=[u'i3', 80]) => {
        "msg": "group is int target is i3 port is 80"
    }
    ok: [server3] => (item=[u'i3', 80]) => {
        "msg": "group is int target is i3 port is 80"
    }
    ok: [server2] => (item=[u'i3', 443]) => {
        "msg": "group is int target is i3 port is 443"
    }
    ok: [server3] => (item=[u'i3', 443]) => {
        "msg": "group is int target is i3 port is 443"
    }
    
    PLAY RECAP *********************************************************************
    server1                    : ok=1    changed=0    unreachable=0    failed=0
    server2                    : ok=1    changed=0    unreachable=0    failed=0
    server3                    : ok=1    changed=0    unreachable=0    failed=0
    

    您只需将调试替换为wait_for module即可 .

相关问题