Ansible - Перечислять список при циклической обработке списка товаров (вложенный цикл) - PullRequest
0 голосов
/ 09 апреля 2019

Я использую вложенный цикл в Ansible («создать 3 виртуальные машины для каждого из 10 пользователей»):

  - name: Add hosts to inventory
    add_host:
      name: "{{ '%s-%02d-%02d' | format(vm_prefix, item.0, item.1.number) }}"
      groups: vms
    loop: "{{userlist | product(vms_per_user) | list }}"  

У меня вопрос: есть ли у меня какой-либо способ получить индекс элемента во втором списке?

  - name: Add hosts to inventory
    add_host:
      name: "{{ '%s-%02d-%02d' | format(vm_prefix, item.0, item.1.number) }}"
      groups: vms
      vm_index: "{{ get the index of this particular VM in vms_per_user }}"
    loop: "{{userlist | product(vms_per_user) | list }}"  

Я знаю о with_indexed_items и flatten + loop_control.index, но я не могу понять, как написать это так, чтобы получить индекс, который повторяется только во втором списке, и перезапускается с 0 для каждого новый пользователь (каждый новый элемент в первом списке).

TL; DR - я ищу ответный эквивалент этой конструкции Python:

for user in users:
  for (index, vm_name) in enumerate(vms_per_user):
     do_something_with user, index, vm_name

Спасибо!

1 Ответ

2 голосов
/ 09 апреля 2019

Если бы у Ansible был фильтр enumerate, это было бы довольно просто.Это не так, но мы можем дать это один.Я поместил следующее содержимое в filter_plugins/enumerate.py:

#!/usr/bin/python


def filter_enumerate(v):
    return list(enumerate(v))


class FilterModule (object):
    def filters(self):
        return {
            'enumerate': filter_enumerate,
        }

Для списка [a, b, c] это вернет новый список [[0,a], [1,b], [2,c]].Мы можем использовать это в вашей пьесе следующим образом:

---
- hosts: localhost
  gather_facts: false
  vars:
    userlist:
      - alice
      - bob
      - mallory
    vms_per_user:
      - vm1
      - vm2
      - vm3
    vm_prefix: foo-

  tasks:
    - debug:
        msg:
          add_host:
            name: "{{ vm_prefix }}{{ item.0 }}-{{ item.1.1 }}"
            groups: vms
            vm_index: "{{ item.1.0 }}"
      loop: "{{ userlist | product(vms_per_user|enumerate) | list }}"

Вывод этой задачи отладки будет выглядеть примерно так:

ok: [localhost] => (item=[u'alice', [0, u'vm1']]) => {                                                                                                                                         
    "msg": {                                                                                                                                                                                   
        "add_host": {                                                                                                                                                                          
            "groups": "vms",                                                                                                                                                                   
            "name": "foo-alice-vm1",                                                                                                                                                           
            "vm_index": "0"                                                                                                                                                                    
        }                                                                                                                                                                                      
    }                                                                                                                                                                                          
}                                                                                                                                                                                              
ok: [localhost] => (item=[u'alice', [1, u'vm2']]) => {                                                                                                                                         
    "msg": {                                                                                                                                                                                   
        "add_host": {                                                                                                                                                                          
            "groups": "vms",                                                                                                                                                                   
            "name": "foo-alice-vm2",                                                                                                                                                           
            "vm_index": "1"                                                                                                                                                                    
        }                                                                                                                                                                                      
    }                                                                                                                                                                                          
}                                                                                                                                                                                              
ok: [localhost] => (item=[u'alice', [2, u'vm3']]) => {                                                                                                                                         
    "msg": {                                                                                                                                                                                   
        "add_host": {                                                                                                                                                                          
            "groups": "vms", 
            "name": "foo-alice-vm3", 
            "vm_index": "2"
        }
    }
}

И т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...