Модуль Ansible Cron

AnsibleAnsibleBeginner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Добро пожаловать в лабораторную работу по модулю Ansible Cron! В этой лабораторной работе вы научитесь автоматизировать планирование задач с использованием модуля Ansible Cron. Система cron представляет собой планировщик задач на основе времени в операционных системах типа Unix, который позволяет пользователям запланировать автоматическое выполнение команд или скриптов в определенные моменты времени или с заданными интервалами.

В рамках этой лабораторной работы вы научитесь создавать, управлять и удалять задачи cron с помощью Ansible. Упражнения постепенно переходят от простых к более сложным конфигурациям, что позволяет вам постепенно развивать свои навыки работы с модулем Ansible Cron. По завершении этой лабораторной работы у вас будет практический опыт планирования задач в последовательном и автоматизированном режиме с использованием Ansible.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("Ansible")) -.-> ansible/PlaybookEssentialsGroup(["Playbook Essentials"]) ansible(("Ansible")) -.-> ansible/ModuleOperationsGroup(["Module Operations"]) ansible/ModuleOperationsGroup -.-> ansible/cron("Schedule Tasks") ansible/ModuleOperationsGroup -.-> ansible/shell("Execute Shell Commands") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("Execute Playbook") subgraph Lab Skills ansible/cron -.-> lab-290157{{"Модуль Ansible Cron"}} ansible/shell -.-> lab-290157{{"Модуль Ansible Cron"}} ansible/playbook -.-> lab-290157{{"Модуль Ansible Cron"}} end

Создание простой задачи cron

На этом этапе вы создадите свою первую задачу cron с использованием модуля Ansible Cron. Задача cron будет выполнять простой сценарий оболочки с регулярным интервалом.

Понимание работы cron

Прежде чем приступить, давайте разберемся, что такое cron. Cron представляет собой планировщик задач на основе времени в операционных системах типа Unix, который позволяет пользователям запланировать автоматическое выполнение команд или скриптов в определенные моменты времени или с заданными интервалами. Задачи cron полезны для автоматизации задач по обслуживанию системы, резервного копирования или любых периодических задач.

Создание Ansible-плейбука

Сначала вам нужно создать Ansible-плейбук, который настроит задачу cron. В WebIDE создайте новый файл по пути /home/labex/project/cron_module_playbook.yaml, нажав кнопку "New File" в панели проводника файлов.

New File

Введите в файл следующее содержимое:

- hosts: localhost
  tasks:
    - name: Create a simple cron job
      cron:
        name: my_cron_job
        minute: "*/5"
        job: /home/labex/project/script.sh

Рассмотрим каждую часть этого плейбука:

  • hosts: localhost - Это указывает, что плейбук будет выполняться на локальной машине.
  • tasks - В этом разделе содержится список задач, которые должны быть выполнены.
  • cron - Это модуль Ansible, используемый для управления задачами cron.
  • name: my_cron_job - Это задает описательное имя для задачи cron, что упрощает ее идентификацию в таблице cron.
  • minute: "*/5" - Это запланирует выполнение задачи каждые 5 минут. Синтаксис */5 означает "каждая минута, делящаяся на 5" (0, 5, 10, 15 и т.д.).
  • job: /home/labex/project/script.sh - Это указывает команду или скрипт, который будет выполнен задачей cron.

Создание сценария оболочки

Теперь вам нужно создать сценарий оболочки, который будет выполняться задачей cron. Создайте новый файл по пути /home/labex/project/script.sh в WebIDE.

Введите в файл сценария следующее содержимое:

#!/bin/bash
echo "This is a simple script." >> /home/labex/project/cron_output.log
date >> /home/labex/project/cron_output.log

Этот простой скрипт будет добавлять сообщение и текущую дату в файл журнала каждый раз при выполнении.

Сделать скрипт исполняемым

Перед запуском плейбука вам нужно сделать скрипт исполняемым. Откройте терминал в WebIDE и выполните следующую команду:

chmod +x /home/labex/project/script.sh

Запуск Ansible-плейбука

Теперь запустите Ansible-плейбук для создания задачи cron. В терминале выполните следующую команду:

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

Вы должны увидеть вывод, похожий на следующий:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a simple cron job] ************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Строка changed: [localhost] указывает, что задача cron была успешно создана.

Проверка задачи cron

Чтобы убедиться, что задача cron была создана, проверьте таблицу cron на системе с помощью следующей команды:

crontab -l

Вы должны увидеть вывод, похожий на следующий:

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh

Строка #Ansible: my_cron_job - это комментарий, добавленный Ansible для идентификации задачи cron. Часть */5 * * * * представляет расписание (каждые 5 минут), а /home/labex/project/script.sh - команда, которая будет выполнена.

Поздравляем! Вы успешно создали задачу cron с использованием модуля Ansible Cron. Задача будет выполнять скрипт каждые 5 минут.

Планирование задачи на определенное время

На этом этапе вы научитесь планировать задачу cron на выполнение в определенное время, а не с регулярным интервалом. Это полезно для задач, которые должны выполняться в определенные моменты дня, например, резервного копирования, обработки данных или генерации отчетов.

Понимание формата времени cron

Формат времени cron состоит из пяти полей, которые представляют:

  1. Минуты (0 - 59)
  2. Часы (0 - 23)
  3. День месяца (1 - 31)
  4. Месяц (1 - 12)
  5. День недели (0 - 7, где 0 и 7 обозначают воскресенье)

Когда вы указываете значение для каждого поля, задача cron будет выполняться, когда все условия совпадут. Например, 0 9 * * * означает "выполнять в 9:00 утра каждый день" (0 минута 9-го часа, любой день месяца, любой месяц, любой день недели).

Изменение Ansible-плейбука

Теперь изменим существующий плейбук, чтобы создать новую задачу cron, которая будет выполняться в определенное время. Откройте файл /home/labex/project/cron_module_playbook.yaml в WebIDE и замените его содержимое следующим:

- hosts: localhost
  tasks:
    - name: Schedule a task with custom time
      cron:
        name: custom_cron_job
        minute: "0"
        hour: "9"
        job: /home/labex/project/script.sh

Изменения в этом плейбуке включают:

  • name: custom_cron_job - Мы создаем новую задачу cron с другим именем.
  • minute: "0" - Это устанавливает выполнение задачи в 0 минут (в начале часа).
  • hour: "9" - Это устанавливает выполнение задачи в 9 утра.

Остальные поля (день месяца, месяц, день недели) не указаны, что означает, что они принимают значение по умолчанию * (любое значение). Таким образом, эта задача будет выполняться в 9:00 утра каждый день.

Запуск измененного плейбука

Теперь запустите измененный Ansible-плейбук, чтобы создать новую задачу cron. В терминале выполните следующую команду:

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

Вы должны увидеть вывод, похожий на следующий:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Schedule a task with custom time] ****************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Проверка новой задачи cron

Чтобы убедиться, что новая задача cron была создана, проверьте таблицу cron на системе:

crontab -l

Теперь в выводе вы должны увидеть две задачи cron:

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh
#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

Первая задача - это та, которую вы создали на первом этапе, которая выполняется каждые 5 минут. Вторая задача - это новая, которую вы только что создали, которая выполняется в 9:00 утра каждый день.

Дополнительные примеры планирования с использованием cron

Вот несколько дополнительных примеров планирования с использованием cron, чтобы помочь вам лучше понять формат времени:

  • 0 * * * * - Выполнять в начале каждого часа
  • 0 0 * * * - Выполнять в полночь каждый день
  • 0 0 1 * * - Выполнять в полночь первого числа каждого месяца
  • 0 0 * * 0 - Выполнять в полночь каждую воскресенье
  • 0 12 * * 1 - 5 - Выполнять в полдень в будние дни (с понедельника по пятницу)

Понимание этих шаблонов поможет вам более эффективно планировать свои задачи с использованием модуля Ansible Cron.

Поздравляем! Вы успешно запланировали задачу cron на выполнение в определенное время с использованием модуля Ansible Cron.

Гарантирование выполнения задачи cron от имени определенного пользователя

На этом этапе вы научитесь указывать, от имени какого пользователя должна выполняться задача cron. Это важный аспект системного администрирования и безопасности, так как позволяет контролировать разрешения и окружение, в котором выполняются запланированные задачи.

Понимание контекста пользователя для задач cron

В операционных системах типа Unix задачи cron наследуют разрешения и окружение пользователя, которому они принадлежат. Это означает:

  1. Задача может доступаться только к тем файлам и ресурсам, к которым у пользователя есть разрешение.
  2. Задача выполняется с переменными окружения и настройками пользователя.
  3. Все файлы, созданные задачей, будут принадлежать пользователю.

По умолчанию, когда вы используете модуль Ansible Cron без указания пользователя, задача cron создается для пользователя, выполняющего Ansible-плейбук. Однако вы можете явно указать другого пользователя с помощью параметра user.

Изменение Ansible-плейбука

Давайте изменим наш плейбук, чтобы указать, что задача cron должна выполняться от имени пользователя labex. Откройте файл /home/labex/project/cron_module_playbook.yaml в WebIDE и замените его содержимое следующим:

- hosts: localhost
  tasks:
    - name: Schedule a task with custom time for specific user
      cron:
        name: custom_cron_job
        minute: "0"
        hour: "9"
        job: /home/labex/project/script.sh
        user: labex

Основное добавление здесь:

  • user: labex - Этот параметр указывает, что задача cron должна быть создана для пользователя labex.

Даже если мы уже выполняем действия от имени пользователя labex в этом окружении, явное указание этого является хорошей практикой для ясности и переносимости ваших плейбуков в другие окружения.

Запуск измененного плейбука

Теперь запустите измененный Ansible-плейбук, чтобы обновить задачу cron. В терминале выполните следующую команду:

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

Вы должны увидеть вывод, похожий на следующий:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Schedule a task with custom time for specific user] **********************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Обратите внимание, что в выводе показано ok, а не changed. Это потому, что задача cron уже существует, и единственное изменение - это параметр пользователя, который в данном случае уже правильный (так как мы с самого начала выполняем действия от имени пользователя labex).

Проверка задачи cron

Чтобы убедиться, что задача cron по-прежнему правильно настроена, проверьте таблицу cron:

crontab -l

Вы должны увидеть вывод, похожий на следующий:

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh
#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

Просмотр задач cron для определенного пользователя

Если вы хотите посмотреть задачи cron для определенного пользователя, вы можете использовать опцию -u с командой crontab:

sudo crontab -u labex -l

Эта команда показывает все задачи cron, запланированные для пользователя labex. В производственной среде у вас могут быть разные задачи cron, выполняющиеся от имени разных пользователей, в зависимости от уровней доступа и разрешений, необходимых для каждой задачи.

Секретные соображения

При планировании задач cron для разных пользователей учитывайте следующие практики безопасности:

  1. Используйте принцип минимальных привилегий - назначайте задачи cron пользователям только с теми разрешениями, которые они необходимы для выполнения своих задач.
  2. Избегайте планирования задач от имени пользователя root, если это не абсолютно необходимо.
  3. Убедитесь, что скрипты, выполняемые задачами cron, имеют соответствующие разрешения и обработку ошибок.
  4. Рассмотрите возможность использования инструментов управления конфигурацией, таких как Ansible, для поддержания согласованных настроек задач cron в своей инфраструктуре.

Поздравляем! Вы успешно настроили задачу cron на выполнение от имени определенного пользователя с использованием модуля Ansible Cron. Этот навык поможет вам более безопасно и эффективно управлять системными задачами.

Удаление задачи cron

На этом этапе вы научитесь удалять ненужные задачи cron с использованием модуля Ansible Cron. Управление полным жизненным циклом задач cron является важным навыком для системных администраторов и инженеров DevOps.

Причины удаления задач cron

Существует несколько причин, по которым вам может понадобиться удалить задачи cron:

  1. Запланированная задача больше не нужна.
  2. Вы хотите заменить существующую задачу новой конфигурацией.
  3. Вам нужно очистить систему для улучшения ее поддерживаемости.
  4. Задачу нужно временно отключить.

Ansible позволяет легко удалять задачи cron систематически и повторно в рамках всей вашей инфраструктуры.

Понимание параметра state

Модуль Ansible Cron использует параметр state для управления тем, должна ли задача cron существовать или быть удалена:

  • state: present - Это значение по умолчанию. Оно гарантирует, что задача cron существует с указанной конфигурацией.
  • state: absent - Это гарантирует, что задача cron не существует, удаляя ее, если она была создана ранее.

Изменение Ansible-плейбука

Давайте изменим наш плейбук, чтобы удалить первую задачу cron, которую мы создали (с именем my_cron_job). Откройте файл /home/labex/project/cron_module_playbook.yaml в WebIDE и замените его содержимое следующим:

- hosts: localhost
  tasks:
    - name: Remove the cron job
      cron:
        name: my_cron_job
        state: absent

Основные элементы этого плейбука:

  • name: my_cron_job - Это идентифицирует задачу cron, которую нужно удалить, по ее имени.
  • state: absent - Это сообщает Ansible, что задача cron не должна существовать.

Обратите внимание, что нам нужно только указать имя задачи cron для ее идентификации при удалении. Другие параметры (например, минута, час, задача и т.д.) не нужны.

Запуск измененного плейбука

Теперь запустите измененный Ansible-плейбук, чтобы удалить задачу cron. В терминале выполните следующую команду:

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

Вы должны увидеть вывод, похожий на следующий:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Remove the cron job] *****************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Строка changed: [localhost] указывает, что задача cron была успешно удалена.

Проверка удаления задачи cron

Чтобы убедиться, что задача cron была удалена, проверьте таблицу cron на системе:

crontab -l

Теперь в выводе вы должны увидеть только вторую задачу cron:

#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

Запись my_cron_job была удалена, как указано в нашем плейбуке.

Идемпотентность в Ansible

Одной из ключевых особенностей Ansible является идемпотентность - свойство, при котором повторное применение одной и той же операции дает тот же результат, что и применение ее один раз. Это особенно полезно для задач, таких как удаление задач cron.

Давайте запустим плейбук еще раз, чтобы продемонстрировать это:

ansible-playbook cron_module_playbook.yaml

Вы должны увидеть вывод, похожий на следующий:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Remove the cron job] *****************************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Обратите внимание, что во второй раз в выводе для задачи удаления показано ok, а не changed. Это потому, что задача cron уже была удалена, поэтому никаких изменений не было необходимо.

Управление несколькими задачами cron

В реальных сценариях вам может понадобиться управлять несколькими задачами cron в одном плейбуке. Вы можете включить несколько задач cron, каждая с своей собственной конфигурацией:

- hosts: localhost
  tasks:
    - name: Remove first cron job
      cron:
        name: job1
        state: absent

    - name: Create second cron job
      cron:
        name: job2
        minute: "0"
        hour: "12"
        job: /path/to/script.sh

    - name: Update third cron job
      cron:
        name: job3
        minute: "*/10"
        job: /path/to/another/script.sh

Этот подход позволяет управлять полным жизненным циклом всех ваших задач cron в одном, контролируемом версиями плейбуке.

Поздравляем! Вы успешно научились удалять задачи cron с использованием модуля Ansible Cron. Это завершает базовое управление жизненным циклом задач cron: создание, изменение и удаление.

Итог

Поздравляем вас с успешным завершением лабораторной работы по модулю Ansible Cron! В рамках этой лабораторной работы вы приобрели практический опыт в нескольких ключевых аспектах управления запланированными задачами с использованием Ansible:

  1. Создание простых задач cron, которые выполняются с регулярным интервалом.
  2. Планирование выполнения задач в определенные моменты времени с использованием настраиваемых выражений времени cron.
  3. Гарантирование выполнения задач cron от имени определенных пользователей для правильного управления безопасностью и разрешениями.
  4. Удаление задач cron, которые больше не нужны.

Эти навыки являются обязательными для автоматизации задач системного администрирования, операций по обслуживанию и периодических процессов в любой Linux-окружении. Используя Ansible для управления задачами cron, вы получаете следующие преимущества:

-一致的配置 across multiple systems

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

По мере дальнейшей работы с Ansible рекомендуется изучить более продвинутые функции модуля Cron, такие как:

  • Установка переменных окружения для задач cron.
  • Использование специальных спецификаций времени, таких как @daily или @reboot.
  • Комбинирование управления задачами cron с другими модулями Ansible для создания комплексных автоматизированных решений.

Возможность эффективно управлять запланированными задачами - ценный навык, который пригодится вам в системном администрировании, DevOps и других IT-ролях.