Ansible — установленный факт для ключа dict на основе значения подключей

#linux #ansible

Вопрос:

Pfoef, описать мою проблему довольно сложно. Пожалуйста, потерпи меня.

У меня есть этот диктант:

 my_dict:  FIRST:  some_key: first_value  SECOND:  some_key: second_value  

Моя возможная задача состоит в том, чтобы:

 - shell: "echo {{ item.value['some_key'] }}"  register: exec_output  loop: "{{ my_dict | dict2items }}"  # This is something where I do not know what to do - set_fact:  desired_output: ???  when: lt;some_key_contains_a_valuegt;   

Когда Ansible выполняется, он выполнит команду оболочки дважды, потому что в dict есть 2 элемента.

Вопрос: Как я могу настроить Ansible так, чтобы: Ansible установил факт и добавил ключ (ПЕРВЫЙ или ВТОРОЙ), если значение some_key, например, «second_value». В данном примере факт будет содержать «ВТОРОЕ».

Ответ №1:

Вы можете найти все item , что было частью цикла, при register выводе его через item.item свойство.

Итак, в вашем случае вы найдете, в пунктах под exec_output.results :

  1.  item:  key: FIRST  value:  some_key: first_value   
  2.  item:  key: SECOND  value:  some_key: second_value   

Итак, исходя из этого, у вас может быть такой сборник пьес, как:

 - hosts: localhost  gather_facts: no   tasks:  - shell: "echo {{ item.value.some_key }}"  register: exec_output  loop: "{{ my_dict | dict2items }}"  vars:  my_dict:  FIRST:  some_key: first_value  SECOND:  some_key: second_value   - set_fact:  desired_output: "{{ item.item.key }}"  when: some_key in item.stdout  loop: "{{ exec_output.results }}"  vars:  some_key: second  loop_control:  label: "{{ item.stdout }}"   - debug:   var: desired_output  

Это дало бы вам ожидаемый результат:

 PLAY [localhost] *******************************************************************************************************************  TASK [shell] *********************************************************************************************************************** changed: [localhost] =gt; (item={'key': 'FIRST', 'value': {'some_key': 'first_value'}}) changed: [localhost] =gt; (item={'key': 'SECOND', 'value': {'some_key': 'second_value'}})  TASK [set_fact] ******************************************************************************************************************** skipping: [localhost] =gt; (item=first_value)  ok: [localhost] =gt; (item=second_value)  TASK [debug] *********************************************************************************************************************** ok: [localhost] =gt;   desired_output: SECOND  PLAY RECAP ************************************************************************************************************************* localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0   

Комментарии:

1. Я рад, что вы поняли то, что я описал. Спасибо за ваш ответ, это именно то, что я ищу! Спасибо.