Использование with_nested и Ansible - PullRequest
2 голосов
/ 01 июля 2019

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

Вот что хранится в 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] }}" ]

Я ожидаю, что строка 'modify 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 }

1 Ответ

0 голосов
/ 02 июля 2019

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

То, что вы ищете, это zip фильтр , который позволит вам собрать несколько списков в один, объединяя все элементы одного индекса в один список.

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

---
- 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  
...