我想写一本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
我将不胜感激如何实现这一目标的任何想法!
答案 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 ...