Ansible и crontabs

Я очень новичок с ansible. Я пишу несколько сборников пьес, и это здорово. Однако я застрял с очень простой задачей администратора, которой каждый администратор должен научиться управлять. Сценарий очень распространен, много серверов: ubuntu, centos, серверы разных клиентов и т.д.

Мой вопрос в том, как я должен организовать свою независимую структуру для управления crontabs разных серверов?

Я написал плейбуки, которые можно применить к большинству серверов с некоторыми административными задачами: apt-get udpate, установка ntp-серверов и синхронизация, но я не нахожу правильного способа сделать гибкую структуру файлов (main.yml , host_vars, файлы, шаблоны, роли и т. д.) для управления каждым cron каждого сервера.

У вас есть пример или совет?

Спасибо!!!


person Rubendob    schedule 14.02.2014    source источник


Ответы (4)


Я знаю, что я не эксперт, но если у какого-нибудь новичка такая же проблема, как у меня, возможно, это может помочь.

Как я писал несколько дней назад, вы изучаете ansible, у вас много серверов, вы даже можете установить nginx, php-fpm, mysql и т. д. в очень новую коробку ubuntu/centos за несколько минут. Что я говорю? Не один, а серверы одновременно, мечта. Но о, о, теперь вам нужно установить разные задачи cron на lemp server 1 и lemp server 2.

Затем вам нужно поиграть с переменными ansible. Когда вы новичок в мире ansible, переменные могут быть немного сложными.

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

Во-первых, я проверяю ansible_hostname сервера 1 lemp.

$ ansible lempserver1 -m setup|grep host
"ansible_hostname": "ns227962",

как видите, имя хоста, возвращаемое ansible, — ns227962. Тогда у меня есть независимая структура, например:

-- main.yml |_ роли |_cron |_tasks |_main.yml

в главной роли cron у меня есть

---
- name: add line to crontab's root - backup
  cron: name="backup openvz vps" hour="5" minute="1" weekday="7"  job="/root/scripts/openvz_backup_vps > /dev/null"
  when: "ansible_hostname == 'ns227962'"

Обратите внимание, что оператор when и ansible_hostname сделают свое дело.

Затем я применяю main.yml и все

TASK: [cron | add line to crontab's root - backup] ***********
skipping: [lempserver2]
changed: [lempserver1]

Это сработало! :)

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

Теперь для меня все в порядке, теперь я могу централизовать управление серверами cron только с одной ролью.

Спасибо

person Rubendob    schedule 17.02.2014
comment
Мне совсем не нравится такой подход, так как вам понадобится новая строка в вашем списке задач для каждого нового сервера, который вы добавляете, но также, если сервер изменит свое имя хоста (например, вы замените его), вы можете остаться без задания cron. на этом сервере. Задания Cron не должны быть централизованными, и, если подумать, это не так. Задания Cron привязаны к конкретной серверной функции, что делает естественным определение cron либо в ролях, либо в плейбуках, которые настраивают конкретную серверную функцию. - person Strahinja Kustudic; 14.07.2014
comment
Вы размещаете все задания cron в одном месте? Примите во внимание размер этой пьесы и путаницу, которую она может создать. - person Alexander Jardim; 15.10.2014

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

person user2956626    schedule 17.02.2014
comment
Привет, изначально я думал о той же идее, что и вы, но кажется, что это не элегантное решение :( - person Rubendob; 17.02.2014

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

Chronos может быть более подходящим инструментом для этой задачи.

person Alexander Jardim    schedule 14.10.2014

Одним из решений является сохранение заданий cron, специфичных для приложения, с самим кодом приложения в файле с именем «crontab.txt». Это необязательно, но если он существует, Ansible автоматически скопирует его в crontab.

- name: Check if cron file exists
  stat: path=/path/to/config/cron.txt
  register: cron_file

- name: Copy crontab if exists
  shell: crontab /path/to/config/cron.txt
  when: cron_file.stat.exists is defined and cron_file.stat.exists

Это создаст новый файл crontab.

ВОЗМОЖНАЯ ПРОБЛЕМА. Если у вас есть несколько экземпляров одного и того же приложения, то в зависимости от задач Crontab, которые могут взаимодействовать с центральной базой данных, вы рискуете дублировать задачи (выполняя одно и то же задание Cron x количество запущенных экземпляров приложения). Решением этой проблемы может быть проверка имени хоста/ip, чтобы задача по установке crontab выполнялась только на одном экземпляре.

person Carson Cole    schedule 01.05.2016