Инструменты пользователя

Инструменты сайта


linux:ansible:loops

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
linux:ansible:loops [2023/12/28 22:27]
werwolf [Перебор простого списка]
linux:ansible:loops [2023/12/28 22:38] (текущий)
werwolf
Строка 1: Строка 1:
-===== Как использовать loops в Ansible =====++===== Как использовать loops в Ansible =====
  
  
Строка 105: Строка 105:
 </​code>​ </​code>​
  
-Copy+* '​серверы'​ - это словарь,​ где каждый ключ представляет собой имя сервера,​ а значение - роль этого сервера. 
 +* Мы используем фильтр '​dict2items'​ для преобразования словаря '​серверы'​ в список элементов. Каждый элемент представляет собой словарь меньшего размера с '​ключом'​ (именем сервера) и '​значением'​ (ролью). 
 +* '​ansible.builtin.debug'​ - это модуль,​ который выводит сообщения на консоль. Мы используем его для распечатки каждого сервера и соответствующей ему роли. 
 +* сообщение:​ Сервер:​ %%{{ item.key }}%%, Роль: %%{{ item.value }}%% - это место, где мы указываем Ansible, что печатать. Он берет имя каждого сервера и его роль и печатает их в удобочитаемом формате.
  
-  * ''​servers''​ is a dictionary where each key is a server name and the value is the role of that server. +Когда вы запускаете этот сборник задачAnsible распечатывает сообщение для каждого сервера с указанием назначенной ему ролиЭто простой способ перебирать словари в Ansible, когда каждый ключ имеет единственное соответствующее значение.
-  * We're using the ''​dict2items''​ filter to convert the ''​servers''​ dictionary into a list of items. Each item is a smaller dictionary with a '​key'​ (the server name) and a '​value'​ (the role). +
-  * ''​ansible.builtin.debug''​ is a module that prints messages to the console. We're using it to print out each server and its corresponding role. +
-  * ''​msg:​ "​Server:​ %%{{%% item.key }}Role: %%{{%% item.value }}"''​ is where we tell Ansible ​what to print. It takes each server name and its role and prints them in a readable format.+
  
-When you run this playbook, Ansible will print out a message for each server, showing the role assigned to it. This is a straightforward way to loop over dictionaries in Ansible when each key has a single corresponding value. +<​code ​bash
- +➜  ​ansible_local ansible-playbook loop_dict.yml
-<​code>​ +
- ​ansible_local ansible-playbook loop_dict.yml+
  
 PLAY [Assign roles to servers] ******************************************************************************************************** PLAY [Assign roles to servers] ********************************************************************************************************
Строка 128: Строка 126:
 </​code>​ </​code>​
  
-Copy 
  
-===== Complex Loops ===== 
  
-==== Looping over Nested Lists ====+===== Сложные циклы =====
  
-=== Product Filter ​===+=== Перебор вложенных списков ====
  
-you can use the ''​**product**''​ filter for creating a **Cartesian Product** of the given lists, which means every item of the first list is paired with every item of the second list. This can be useful in scenarios where you need to perform a task with every possible combination of items from multiple lists. Here's an example using the ''​product''​ filter.+=== Фильтр продукта ===
  
-<​code>​+вы можете использовать фильтр '​**продукт **' для создания ** декартова произведения ** данных списков,​ что означает,​ что каждый элемент первого списка сопряжен с каждым элементом второго списка. Это может быть полезно в сценариях,​ когда вам нужно выполнить задачу со всеми возможными комбинациями элементов из нескольких списков. Вот пример использования фильтра '​продукт'​. 
 + 
 +<​code ​yaml>
 --- ---
 - name: Install packages on servers - name: Install packages on servers
Строка 150: Строка 148:
 </​code>​ </​code>​
  
-Copy 
  
-<​code>​ + 
- ​ansible_local ansible-playbook nested_loop_product.yml+<​code ​bash
 +➜  ​ansible_local ansible-playbook nested_loop_product.yml
  
 PLAY [Install packages on servers] **************************************************************************************************** PLAY [Install packages on servers] ****************************************************************************************************
Строка 177: Строка 175:
 </​code>​ </​code>​
  
-Copy 
  
-??+=== Подэлементы ===
  
-If you're anything like me, you might'​ve seen the term '**Cartesian Product**' and immediately thought'Wow, what's that?' - When we talk about the Cartesian product in the context of programming,​ we usually refer to combining each item of one list (or set) with each item of another list (or set).+В Ansible вы также можете перебирать вложенные списки с помощью фильтра ​**subelements**. Это полезнокогда вы хотите выполнить задачу для каждой комбинации элементов во внешнем и внутреннем списках. Вот базовая структура использования фильтра **subelements**.
  
-=== Subelements === +<​code ​yaml>
- +
-In Ansible, you can also loop over nested lists using the ''​**subelements**''​ filter. This is useful when you want to perform a task for each combination of elements in the outer and inner lists. Here's a basic structure of how to use the ''​subelements''​ filter. +
- +
-<​code>​+
 --- ---
 - name: Install packages on servers - name: Install packages on servers
Строка 209: Строка 202:
 </​code>​ </​code>​
  
-Copy+* '​серверы'​ - это список словарей. У каждого словаря есть ключ **name ** для имени сервера и ключ ** packages ** для списка пакетов. 
 +* Мы используем фильтр %%subelements('​пакеты'​)%% для циклического просмотра как серверов,​ так и их пакетов. 
 +* '​ansible.builtin.debug'​ - это модуль,​ который выводит сообщения на консоль. Мы используем его для распечатки каждой комбинации сервер-пакет. 
 +* '​сообщение:​ '​Установка %%{{ item.1 }}%% на %%{{ item.0.name }}%%''​ - это место, где мы указываем Ansible, что печатать. Он берет имя каждого сервера и каждого пакета и печатает их в удобочитаемом формате.
  
-  * ''​servers''​ is a list of dictionaries. Each dictionary has a '​**name**'​ key for the server name and a '​**packages**'​ key for the list of packages. +<​code ​bash
-  * We're using the ''​subelements%%('​%%packages'​)''​ filter to loop over both the servers and their packages. +➜  ​ansible_local ansible-playbook nested_list_loop.yml ​  
-  * ''​ansible.builtin.debug''​ is a module that prints messages to the console. We're using it to print out each server-package combination. +
-  * ''​msg:​ "​Installing %%{{%% item.1 }} on %%{{%% item.0.name }}"''​ is where we tell Ansible what to print. It takes each server name and each package and prints them in a readable format. +
- +
-<​code>​ +
- ​ansible_local ansible-playbook nested_list_loop.yml ​  +
  
 PLAY [Install packages on servers] **************************************************************************************************** PLAY [Install packages on servers] ****************************************************************************************************
Строка 235: Строка 226:
 </​code>​ </​code>​
  
-Copy 
  
-===== Pausing within a Loop =====+===== Приостановка в цикле ​=====
  
-Sometimes, when performing actions in a loop, we might need to pause between iterationsThis could be because we're waiting for a server to restartfor a file to become availableor for any number of reasonsYou can''​loop_control'​' with ''​pause'​' to add a delay between each loop iteration.+Иногда при выполнении действий в цикле нам может потребоваться сделать паузу между итерациямиЭто может быть связано с темчто мы ожидаем перезапуска серверапоявления файла или по ряду других причинВы можете использовать ​'​loop_control' ​с '​pause'​, чтобы добавить задержку между каждой итерацией цикла.
  
-<​code>​+<​code ​yaml>
 --- ---
 - name: Pausing within a loop using loop_control - name: Pausing within a loop using loop_control
Строка 255: Строка 245:
 </​code>​ </​code>​
  
-Copy +  * **loop: [1, 2, 3]** указывает,​ что мы хотим выполнить цикл по числам ​1, 2 и 3. 
- +  * модуль **ansible.builtin.debug** выводит текущий номер
-  ​''​loop: [1, 2, 3]''​ specifies that we want to loop over the numbers ​1, 2, and 3. +  * **loop_control:​ pause: 3** приостанавливается на секунды после каждой задачи в цикле.
-  * ''​ansible.builtin.debug''​ module prints the current number+
-  * ''​loop_control:​ pause: 3''​ pauses for seconds after each task in the loop. +
- +
-When you run this playbook, Ansible will print each number, pause for 3 seconds, and then proceed to the next iteration of the loop. +
- +
-===== Closing Thoughts ===== +
- +
-So, there you have it. We've learned that Ansible loops are a handy tool that helps us automate repetitive tasks. Please let me know in the comments if you have any questions or feedbackВ +
  
-===== References =====+Когда вы запускаете этот сборник задач, Ansible печатает каждое число, делает паузу на 3 секунды,​ а затем переходит к следующей итерации цикла.
  
-https://​docs.ansible.com/​ansible/​latest/​playbook_guide/​playbooks_loops.html 
  
-{{https://​img.buymeacoffee.com/​button-api/?​text=Buy me a coffee&​amp;​emoji=&​amp;​slug=packetswitch&​amp;​button_colour=FFDD00&​amp;​font_colour=000000&​amp;​font_family=Cookie&​amp;​outline_colour=000000&​amp;​coffee_colour=ffffff}} 
linux/ansible/loops.1703791646.txt.gz · Последние изменения: 2023/12/28 22:27 — werwolf