#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
:
-
item: key: FIRST value: some_key: first_value
-
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. Я рад, что вы поняли то, что я описал. Спасибо за ваш ответ, это именно то, что я ищу! Спасибо.