如何使用host_vars确保存在多个特定的cron作业?

时间:2019-04-26 11:49:49

标签: loops cron ansible

我想写一本ansible剧本(我对ansible相当陌生-请对我好一点),检查用户crontab中是否存在各种cronjob。作业应该只执行各种脚本。除脚本名称外,所有主机的作业均相同。 crontab中的一行如下所示:

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

根据我所在的主机,定义了不同的服务,从而导致了不同的脚本名称。我将服务定义为host_vars中每个主机一个文件(清单/ host_vars / host1 /服务)中的YAML列表

一个服务文件看起来像这样:

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 个答案:

答案 0 :(得分:1)

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 ...