Здесь показаны различия между двумя версиями данной страницы.
| Следующая версия | Предыдущая версия | ||
|
linux:ansible:loops [2023/12/28 22:24] werwolf создано |
linux:ansible:loops [2023/12/28 22:38] (текущий) werwolf |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ===== Как использовать loops в Ansible =====+ | + | ===== Как использовать loops в Ansible ===== |
| Строка 58: | Строка 58: | ||
| * 'ansible_module' относится к модулю, который вы используете для выполнения задачи. В Ansible есть множество модулей для различных задач, таких как 'apt' для управления пакетами, 'file' для управления файлами и т.д. | * 'ansible_module' относится к модулю, который вы используете для выполнения задачи. В Ansible есть множество модулей для различных задач, таких как 'apt' для управления пакетами, 'file' для управления файлами и т.д. | ||
| - | * %%'ключ: '{{item }}''%% - это место, где мы указываем Ansible, что нужно изменить в каждом цикле. '%%{{%%% item }}' - это заполнитель, который Ansible заменяет каждым элементом в списке циклов. | + | * %%'ключ: '{{item }}''%% - это место, где мы указываем Ansible, что нужно изменить в каждом цикле. '%%{{ item }}%%' - это заполнитель, который Ansible заменяет каждым элементом в списке циклов. |
| * 'цикл' - это ключевое слово, которое запускает цикл, за которым следует список элементов для повторения цикла. | * 'цикл' - это ключевое слово, которое запускает цикл, за которым следует список элементов для повторения цикла. | ||
| Возвращаясь к предыдущему примеру установки пакета, без цикла нам нужно было бы написать отдельную задачу для каждого пакета. С помощью цикла мы можем установить все пакеты с помощью одной задачи. | Возвращаясь к предыдущему примеру установки пакета, без цикла нам нужно было бы написать отдельную задачу для каждого пакета. С помощью цикла мы можем установить все пакеты с помощью одной задачи. | ||
| - | <code> | + | <code yaml> |
| --- | --- | ||
| - name: Install packages using Ansible | - name: Install packages using Ansible | ||
| Строка 78: | Строка 78: | ||
| </code> | </code> | ||
| - | Copy | ||
| - | * We're using the ''apt'' module, which manages packages on Debian-based systems. | + | * Мы используем модуль 'apt', который управляет пакетами в системах на базе Debian. |
| - | * The line ''pkg: "%%{{%% item }}"'' tells Ansible what to install in each loop iteration. Ansible replaces ''%%{{%% item }}'' with each package name from the list. | + | * Строка pkg: %%{{ item }}%% сообщает Ansible, что устанавливать на каждой итерации цикла. Ansible заменяет '%% {{ item }}%%' на каждое имя пакета из списка. |
| - | * The ''loop'' keyword starts the loop, followed by a list of packages we want to install. | + | * Ключевое слово 'loop' запускает цикл, за которым следует список пакетов, которые мы хотим установить. |
| - | When you run this playbook, Ansible will install the 'nginx', 'mysql', and 'php' packages one by one. If you need to install more packages, you simply add them to the list. This is why loops are so powerful in Ansible: they let us manage multiple items with a single task, no matter how many items we have. | + | Когда вы запустите этот сборник задач, Ansible установит пакеты 'nginx', 'mysql' и 'php' один за другим. Если вам нужно установить больше пакетов, вы просто добавляете их в список. Вот почему циклы настолько мощны в Ansible: они позволяют нам управлять несколькими элементами в рамках одной задачи, независимо от того, сколько элементов у нас есть. |
| - | ==== Looping over a Dictionary ==== | ||
| - | To loop over this dictionary, you can use the ''dict2items'' filter, which converts the dictionary into a list of items. Each item in this list is another dictionary with a 'key' and a 'value'. | + | ==== Перебор словаря ==== |
| - | <code> | + | Чтобы перебрать этот словарь, вы можете использовать фильтр 'dict2items', который преобразует словарь в список элементов. Каждый элемент в этом списке представляет собой еще один словарь с 'ключом' и 'значением'. |
| + | <code yaml> | ||
| --- | --- | ||
| - name: Assign roles to servers | - name: Assign roles to servers | ||
| Строка 106: | Строка 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] ******************************************************************************************************** | ||
| Строка 129: | Строка 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 | ||
| Строка 151: | Строка 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] **************************************************************************************************** | ||
| Строка 178: | Строка 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 | ||
| Строка 210: | Строка 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] **************************************************************************************************** | ||
| Строка 236: | Строка 226: | ||
| </code> | </code> | ||
| - | Copy | ||
| - | ===== Pausing within a Loop ===== | + | ===== Приостановка в цикле ===== |
| - | Sometimes, when performing actions in a loop, we might need to pause between iterations. This could be because we're waiting for a server to restart, for a file to become available, or for any number of reasons. You 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 | ||
| Строка 256: | Строка 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** приостанавливается на 3 секунды после каждой задачи в цикле. |
| - | * ''ansible.builtin.debug'' module prints the current number. | + | |
| - | * ''loop_control: pause: 3'' pauses for 3 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&emoji=&slug=packetswitch&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff}} | ||