Вопрос или проблема
Довольно часто для обслуживания мне приходится запускать огромный плейбук, который содержит около 750 задач на инвентаре из примерно 15 серверов или более. Обычно выполнение занимает около 1.5 до 2.5 часов в зависимости от количества серверов в списке инвентаризации. Я пытался придумать, как можно ускорить процесс, чтобы не ждать так долго выполнения плейбука и быстрее вернуть серверы для дальнейших задач по обслуживанию?
Одна из идей, которую я придумал, заключалась в том, чтобы уменьшить “nice” плейбука, однако если я уменьшить его при выполнении плейбука ansible, это не даст эффекта, потому что это повлияет только на сервер, на котором я выполняю плейбук, а не на все настоящие “тяжелые” операции, которые происходят на целевых серверах. Затем я начал искать в интернете, как я могу изменить nice на серверах, указанных в списке инвентаризации, и нашел не так много информации. Кто-нибудь знает, возможно ли это?
Ответ или решение
Да, модифицировать уровень "niceness" команды на целевых серверах во время выполнения большого плейбука в Ansible возможно. Прежде чем мы обсудим, как это сделать, давайте кратко рассмотрим, что такое "niceness" и как он влияет на производительность.
Что такое "niceness"?
"Niceness" — это приоритет, который назначается процессам в операционной системе на Unix-подобных системах, таких как Linux. Чем ниже значение "niceness" (от -20 до 19, где -20 – самый высокий приоритет, а 19 – самый низкий), тем больше ресурсов CPU процесс может использовать. Уменьшая значение "niceness", вы можете увеличить приоритет выполнения задач на целевых серверах, что может помочь ускорить операции в рамках вашего плейбука.
Как изменить "niceness" на целевых серверах
Для изменения "niceness" на целевых серверах во время выполнения плейбука Ansible, вы можете воспользоваться встроенным модулем ansible.builtin.command
или ansible.builtin.shell
в вашем плейбуке. Вам необходимо будет использовать команду nice
для запуска процессов с определённым уровнем "niceness".
Пример плейбука
Вот пример того, как вы можете настроить уровень "niceness" для выполнения задач:
---
- hosts: all
tasks:
- name: Установить высокий приоритет для всех задач
shell: "nice -n -10 /path/to/your/command"
async: 300 # Позволяет задаче выполняться в фоновом режиме
poll: 0 # Не дожидается завершения задачи
register: my_task
- name: Ожидание завершения фоновой задачи
async_status:
jid: "{{ my_task.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: 5
delay: 10
Пояснение к коду
-
Изменение уровня niceness: В первой задаче мы используем команду
nice -n -10 /path/to/your/command
, где-10
– это уровень "niceness", который вы хотите установить (вы можете настроить его в зависимости от ваших требований). -
Асинхронное выполнение: Указывая
async: 300
, мы разрешаем задаче выполняться в фоновом режиме до 5 минут. -
Ожидание завершения: В следующей задаче мы используем
async_status
для проверки состояния выполнения фоновой задачи.
Оптимизация плейбука
-
Рассмотрите возможность параллельного выполнения задач, используя параметр
forks
в ваших инвентарных файлах или при запуске плейбука. Увеличив значениеforks
, вы сможете запускать больше задач одновременно. -
Также посмотрите на возможность разбивания плейбука на несколько более мелких плейбуков, которые могут выполняться параллельно.
-
Убедитесь, что на целевых серверах нет других процессов, потребляющих большую часть ресурсов, так как это может влиять на производительность вашего плейбука.
Заключение
Изменение уровня "niceness" процессов на целевых серверах может быть эффективным способом увеличения производительности при выполнении больших плейбуков Ansible. Используя команды nice
и ansible.builtin.shell
, вы можете динамически управлять приоритетом задач, помогая ускорить выполнение вашего плейбука и минимизировать время ожидания.