Как я могу убедиться, что с помощью host_vars существует более одного конкретного задания cron? - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу написать ANSIBLE Playbook (я довольно новичок в ANSIBLE - так что будьте добры со мной), который проверяет, существуют ли различные пользовательские cronjobs в пользовательском crontab.Задания должны просто выполнять различные сценарии.Задания одинаковы для всех хостов, кроме имени скрипта.Строка в crontab выглядит следующим образом:

30 5 * * * /path/to/script/monitoringScript_serviceX > /path/to/script/monitoringScript_serviceX.out 2>&1

В зависимости от того, на каком хосте я работаю, определяются разные службы, что приводит к различным именам сценариев.Я определил сервисы как список YAML в host_vars в одном файле на хост (инвентарь / host_vars / host1 / services)

Один файл сервисов выглядит примерно так:

services:
    - service1
    - service2

Некоторые изхосты имеют только один определенный сервис.

Моя книга воспроизведения выглядит следующим образом:

  - hosts: hostgroupX
    gather_facts: False
    tasks:
      - name: Ensure monitoring cron jobs are present
        cron:
            name: "check: monitoring data jobs"
            hour: "5"
            minute: "30"
            user: "user"
            job: "/path/to/script/monitoringScript_{{ item }} > /path/to/script/monitoringScript_{{ item }}.out 2>&1"
        loop: "{{ services }}"

Если я разрешу запуск воспроизведения на одном хосте, на котором в файле определена только одна служба, все работает хорошо.

Но если определено более одной службы, в crontab записывается только последняя служба в списке.Результат с приведенным выше примером файла служб будет выглядеть так:

#Ansible: check: monitoring data jobs 
30 5 * * * /path/to/script/monitoringScript_service2 > /path/to/script/monitoringScript_service2.out 2>&1

, хотя я хочу, чтобы он выглядел так:

#Ansible: check: monitoring data jobs 
30 5 * * * /path/to/script/monitoringScript_service1 > /path/to/script/monitoringScript_service1.out 2>&1
30 5 * * * /path/to/script/monitoringScript_service2 > /path/to/script/monitoringScript_service2.out 2>&1

Буду признателен за любые идеи, как этого добитьсяэто, заранее спасибо!

1 Ответ

1 голос
/ 26 апреля 2019

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

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

- name: Ensure monitoring cron jobs are present
  cron:
      name: "check: monitoring data for service {{ item }}"
      hour: "5"
      minute: "30"
      user: "user"
      job: "/path/to/script/monitoringScript_{{ item }} > /path/to/script/monitoringScript_{{ item }}.out 2>&1"
  loop: "{{ services }}"

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

#Ansible: check: monitoring data for service service1
30 5 * * * /path/to/script/monitoringScript_service1 ...
#Ansible: check: monitoring data for service service2
30 5 * * * /path/to/script/monitoringScript_service2 ...
#Ansible: check: monitoring data for service service3
30 5 * * * /path/to/script/monitoringScript_service3 ...
...