Использование with_nested и Ansible

Может ли кто-нибудь порекомендовать способ взять содержимое двух регистровых переменных и передать их в одну команду? При этом также выстраивают результаты выходных данных каждой переменной в формате 1: 1. (например, VS1: rule1, VS2: rule2 и т. д. из выходных данных, показанных ниже)

Вот что хранится в stdout_lines для Virtual_Check и Rule_Check:

     "Virtual_Check.stdout_lines": [
        [
            "ltm virtual VS1 ", 
            "ltm virtual VS2 ", 
            "ltm virtual VS3 ", 
            "ltm virtual VS",           
    "Rule_Check.stdout_lines": [
        [
            "myrule1", 
            "    ", 
            "", 
            "        myrule2", 
            "    ", 
            "", 
            "        myrule3", 
            "    ", 
            "", 
            "        myrule4", 
            "    ", 
            "", 

Теперь я хотел бы передать содержимое переменных в одну команду, как показано ниже. Когда я запускаю эту пьесу, часть Virtual_Check в цикле with_nested, как и ожидалось, но проблема, с которой я сталкиваюсь, заключается в том, что она не зацикливается должным образом для части Rule_Check (я оставил два метода, которые я пробовал ниже)

До сих пор я пробовал использовать with_nested для достижения этой цели, и мне кажется, что цикл по второй переменной не выполняется правильно.

     - name:  Update VS iRule
        bigip_command:
          commands:
            - "modify ltm virtual {{ item.0 }} rules { {{ item.1 }} myrule10 }"
          provider:
            server: "{{ inventory_hostname }}"
            password: "{{ remote_passwd }}"
            user: "{{ remote_username }}"
          validate_certs: no
        delegate_to: localhost
        with_nested:
          - [ "{{ Virtual_Check['stdout'][0] | replace('ltm virtual', '') | replace('\n', '') }}"]
          - [ "{{ Rule_Check['stdout'][0] | replace('\n', '') }}" ]
          - [ "{{ Rule_Check['stdout_lines'][0] }}" ]

Я ожидал, что строка 'изменить ltm virtual {{item.0}} rules {{{item.1}} myrule10}' будет обработана с содержанием в списках Virtual_Check и Rule_Check

Например:

modify ltm virtual VS1 rules { myrule1 myrule10 }
modify ltm virtual VS2 rules { myrule2 myrule10 }
modify ltm virtual VS3 rules { myrule3 myrule10 }
modify ltm virtual VS4 rules { myrule4 myrule10 }

person Pete    schedule 01.07.2019    source источник


Ответы (1)


nested lookup не выполняет то, что вы ожидаете: это создает цикл на первом элементе с подпрограммой на втором элементе и подподциклом на третьем элементе и т. д.

Вам нужен zip filter, который позволит вам собрать несколько списков в один, объединив все элементы с одним индексом в один список.

Пример ниже с вашими исходными образцами данных в вашем вопросе. Вам просто нужно адаптироваться к вашему реальному случаю:

---
- name: zip example
  hosts: localhost
  gather_facts: false

  vars:
    servers: [ 'VS1', 'VS2', 'VS3', 'VS4' ]
    rules: [ myrule1, myrule2, myrule3, myrule4 ]

  tasks:
    - name: Show zipped data from servers and rules
      debug:
        msg: "Server {{ item.0 }} has rule: {{ item.1 }}"
      loop: "{{ servers | zip(rules) | list }}"

который дает

PLAY [zip example] ********************************************************************************************************************************************************************************************************

TASK [Show zipped data from servers and rules] ****************************************************************************************************************************************************************************
ok: [localhost] => (item=['VS1', 'myrule1']) => {
    "msg": "Server VS1 has rule: myrule1"
}
ok: [localhost] => (item=['VS2', 'myrule2']) => {
    "msg": "Server VS2 has rule: myrule2"
}
ok: [localhost] => (item=['VS3', 'myrule3']) => {
    "msg": "Server VS3 has rule: myrule3"
}
ok: [localhost] => (item=['VS4', 'myrule4']) => {
    "msg": "Server VS4 has rule: myrule4"
}

PLAY RECAP ****************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
person Zeitounator    schedule 01.07.2019
comment
Спасибо за ответ и объяснение! Ваше решение очень близко к тому, что мне нужно, есть ли способ передать содержимое регистровых переменных Virtual_Check и Rule_Check? Примерно так: 'цикл: {{Virtual_Check | zip (Rule_Check) | список }} ' - person Pete; 02.07.2019
comment
Это был просто пример для иллюстрации, просто адаптируйте его к вашим варам реального мира. - person Zeitounator; 02.07.2019
comment
Спасибо, @Zeitounator. Я понимаю, что то, что вы предоставили, было примером, я просто не уверен, что он будет правильно работать с регистровыми переменными, поскольку он передает случайные значения в команду «изменить ltm». Например, в этом случае он передал 'исполненные_команды' в команду, которая не является частью содержимого регистровых переменных: invocation: {module_args: {auth_provider: null, chdir: null, commands: [изменить ltm виртуальные правила выполнения_команд {исполняемые_команды myrule10} - person Pete; 02.07.2019
comment
Вы привели пример структуры данных, я ответил вашим примером. zip будет работать с любым типом предоставленного вами списка (строк, чисел, списков, хэш-карт ...). Вы ожидаете, что люди здесь догадаются, как выглядят ваши реальные переменные и каков результат вашей текущей реализации? Или для установки инфраструктуры F5 им не нужно пробовать сами команды и выяснять, что они возвращают? Прочтите Как создать минимально воспроизводимый пример и убедитесь, что вы включили необходимую информацию в свой вопрос. - person Zeitounator; 02.07.2019
comment
Я попытался объяснить свой сценарий как можно лучше, но я не использую его ежедневно, поэтому я все еще учусь, и мои знания ограничены. Я отредактировал вопрос выше, чтобы включить вывод stdout_lines из Virtual_Check и Rule_Check. Я понимаю, что работать с новичком может быть неприятно, но иногда вы можете задавать вопросы, чтобы помочь человеку найти ответ, поскольку у вас есть опыт. Если вы все еще готовы помочь, дайте мне знать, полезен ли предоставленный мной новый вывод, если нет, я буду рад предоставить все, что может отсутствовать. - person Pete; 02.07.2019
comment
Я не разочарован. Я задал вопросы и направил вас в раздел помощи. Новички приветствуются, хотя, для вашего удобства, вы должны знать, что люди здесь обычно ждут, что с вашей стороны будет немало усилий. Что касается вашего последнего редактирования, похоже, что stdout_lines из вашего первого зарегистрированного файла можно использовать, как и там, где ваш второй нуждается в доработке или доработке. Если вы хотите использовать zip, вам нужно получить два списка. Я хотел бы убедиться, что нет другого способа напрямую получить эту информацию в хорошем формате. Здесь мы уходим далеко от первоначального вопроса. - person Zeitounator; 03.07.2019
comment
Спасибо, что просмотрели мое обновление. В настоящее время я изучаю другие варианты выполнения этой работы, и если я что-то найду, я предоставлю обновление. Оцените ваше почтовое решение, пригодится :) - person Pete; 04.07.2019