Ansible和crontabs

时间:2014-02-14 19:18:33

标签: ansible

我是ansible的新手。我一直在写一些剧本,很棒,很棒。但是我遇到了一个非常简单的管理任务,每个管理员都必须学习如何管理。场景很常见,很多服务器:ubuntu,centos,不同客户的服务器等等

我的问题是我必须如何组织我的ansible结构来管理不同服务器的crontabs?

我已经编写了可以应用于大多数服务器的playbooks,其中包含一些管理任务:apt-get udpate,安装ntp服务器和同步,但我找不到正确的方法来制作文件的ansible结构( main.yml,host_vars,files,templates,roles等)来管理每个服务器的每个cron。

你有任何例子或建议吗?

感谢!!!

4 个答案:

答案 0 :(得分:8)

我知道我不是专家但是如果一些安慰新手和我有同样的问题,也许这会有所帮助。

正如我几天前写的,你正在学习ansible,你有很多服务器,你甚至可以在几分钟内在一个非常新的ubuntu / centos框中安装nginx,php-fpm,mysql等。我在说什么?不是一个,而是同时服务器,梦想。但是哦,现在你必须在lemp服务器1和lemp服务器2中安装不同的cron任务。

然后,你必须使用ansible变量。当你是ansible世界的新手时,变量可能有点棘手。

我并不是说这是更好的方法,但至少,您不必为每台服务器维护单独的cron文件。

首先,我检查lemp服务器1的ansible_hostname

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

如您所见,ansible返回的主机名是ns227962。然后我有一个像:

的ansible结构

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

有效! :)

在其他情况下,当您使用相同的文件配置但有些部分使用模板稍有不同时会有所帮助。

现在对我来说还可以,现在我只能用一个角色集中管理crons服务器。

由于

答案 1 :(得分:2)

可能有几种方法可以给这只猫上皮。首先想到的是您可以将所有服务器分配给一个或多个角色,并将crons与您的角色相关联。

答案 2 :(得分:2)

我认为ansible不是完成此任务的正确工具。你想要的是一个工作计划管理员,而不是一个配置管理员。

Chronos可能是更适合该任务的工具。

答案 3 :(得分:1)

一种解决方案是将应用程序代码本身特定于应用程序的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您正在运行的应用程序的实例数)。对此的解决方案可能是包括检查hostname / ip,以便安装crontab的任务仅在一个实例上运行。