我想写一个ansible playbook(我对ansible很新 - 所以对我很好),检查用户crontab中是否存在各种cronjobs。作业应该只执行各种脚本。除脚本名称外,所有主机的作业都相同。 crontab中的一行如下所示:
30 5 * * * /path/to/script/monitoringScript_serviceX > /path/to/script/monitoringScript_serviceX.out 2>&1
根据我所在的主机,定义了不同的服务,从而产生不同的脚本名称。我在每个主机的一个文件中将服务定义为host_vars中的YAML列表(inventory / 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
我很感激任何想法如何实现这一点,提前谢谢!
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 ...