我如何设置一个 Vagrant box 以始终有一个 cron 作业?

How do I set up a Vagrant box to always have a cron job?

如何配置我的 Vagrant 配置,以便在我配置机器时自动配置其 crontab? (vagrant 是根据 Chef(?) 文件提供的)

例如,我想设置以下 cron:

5 * * * * curl http://www.google.com

无需 Chef/Puppet/Ansible 而使用 shell.

即可轻松完成此类基本配置

Vagrant docs 很好地涵盖了这个基本配置,他们的例子是让盒子从 boostrap.sh 下载 Apache。

同样,您可以按照相同的步骤编辑 Vagrantfile,以便在配置时调用 bootstrap.sh 文件:

Vagrant.configure("2") do |config|
  ...
  config.vm.provision :shell, path: "bootstrap.sh"
  ...
end

然后您可以在与 Vagrantfile 相同的目录中创建一个 bootstrap.sh 文件,其中包含如下内容:

#!/bin/bash
# Adds a crontab entry to curl google.com every hour on the 5th minute

# Cron expression
cron="5 * * * * curl http://www.google.com"
    # │ │ │ │ │
    # │ │ │ │ │
    # │ │ │ │ └───── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
    # │ │ │ └────────── month (1 - 12)
    # │ │ └─────────────── day of month (1 - 31)
    # │ └──────────────────── hour (0 - 23)
    # └───────────────────────── min (0 - 59)

# Escape all the asterisks so we can grep for it
cron_escaped=$(echo "$cron" | sed s/\*/\\*/g)

# Check if cron job already in crontab
crontab -l | grep "${cron_escaped}"
if [[ $? -eq 0 ]] ;
  then
    echo "Crontab already exists. Exiting..."
    exit
  else
    # Write out current crontab into temp file
    crontab -l > mycron
    # Append new cron into cron file
    echo "$cron" >> mycron
    # Install new cron file
    crontab mycron
    # Remove temp file
    rm mycron
fi

默认情况下 Vagrant provisioners 运行 为 root,所以这将附加一个 cron 作业到 root 用户的 crontab 假设它不存在。如果你想将它添加到 vagrant 用户的 crontab,那么你需要 运行 将 privileged 标志设置为 false:

config.vm.provision :shell, path: "bootstrap.sh", privileged: false