一、概述
cron 子產品可以幫助我們管理遠端主機中的計劃任務,功能相當于 crontab 指令。
在了解cron子產品的參數之前,先寫出一些計劃任務的示例:
# 示例1,每天的1點5分輸出 test 字元
5 1 * * * echo test
# 示例2,每3天執行一次計劃任務,于當天的1點1分執行,具體任務為輸出 test 字元
1 1 */3 * * echo test
# 示例3,每次系統啟動後需要執行一次計劃任務,具體任務為輸出 test 字元
@reboot echo test
# 示例4,每小時執行一次計劃任務,具體任務為輸出 test 字元
@hourly echo test
根據上述示例,下面可以更好的了解 cron 子產品的參數。
二、常用參數
minute參數:此參數用于設定計劃任務中分鐘設定位的值,比如,上述示例1中分鐘設定位的值為5,即 minute=5,當不使用此參數時,分鐘設定位的值預設為”*”。
hour參數:此參數用于設定計劃任務中小時設定位的值,比如,上述示例1中小時設定位的值為1,即 hour=1,當不使用此參數時,小時設定位的值預設為”*”。
day參數:此參數用于設定計劃任務中日設定位的值,當不使用此參數時,日設定位的值預設為”*”。
month參數:此參數用于設定計劃任務中月設定位的值,當不使用此參數時,月設定位的值預設為”*”。
weekday參數:此參數用于設定計劃任務中周幾設定位的值,當不使用此參數時,周幾設定位的值預設為”*”。
special_time參數:在上述示例3與示例4中,計劃任務的時間設定格式為 @reboot 或者@hourly。@reboot 表示重新開機時執行,@hourly 表示每小時執行一次,相當于設定成”0 0 *” ,這種@開頭的時間設定格式則需要使用 special_time 參數進行設定,special_time 參數的可用值有 reboot(重新開機後)、yearly(每年)、annually(每年,與yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每時)。
注意:當上述時間機關設定參數都未指定時,計劃任務的時間設定預設會被設定為” *”,這樣表示每秒都會執行一次計劃任務,是以,在使用cron子產品時,我們應該确定對應的時間參數設定正确。
user參數:此參數用于設定目前計劃任務屬于哪個使用者,當不使用此參數時,預設為管理者使用者。
job參數:此參數用于指定計劃的任務中需要實際執行的指令或者腳本,比如上例中的 “echo test” 指令。
name參數:此參數用于設定計劃任務的名稱,計劃任務的名稱會在注釋中顯示,當不指定計劃任務的名稱時,ansible 會預設為計劃任務加入注釋,注釋的内容為 #Ansible: None,假設指定計劃任務的名稱為 test,那麼注釋的内容為#Ansible: test,在一台機器中,計劃任務的名稱應該具有唯一性,友善我們以後根據名稱修改或删除計劃任務。
state參數:當計劃任務有名稱時,我們可以根據名稱修改或删除對應的任務,當删除計劃任務時,需要将 state 的值設定為 absent。
disabled參數:當計劃任務有名稱時,我們可以根據名稱使對應的任務”失效”(注釋掉對應的任務)。注意,使用此參數時,除了需要指定任務的名稱,還需要同時指定任務的job 以及任務的時間設定,而且任務的時間設定必須和對應任務完全相同,否則在注釋任務的同時,任務的時間設定會被修改,除非你确定這樣做。
backup參數:如果此參數的值設定為 yes,那麼當修改或者删除對應的計劃任務時,會先對計劃任務進行備份,然後再對計劃任務進行修改或者删除,cron 子產品會在遠端主機的 /tmp 目錄下建立備份檔案,以 crontab 開頭并且随機加入一些字元,具體的備份檔案名稱會在傳回資訊的 backup_file 字段中看到,推薦将此此參數設定為 yes。
三、示例
1.在 ansible-demo3 主機上建立計劃任務,任務名稱為”crontab test”,任務于每天1點5分執行,任務内容為輸出test字元。
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='crontab test' minute=5 hour=1 job='echo test' "
ansible-demo3 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"crontab test"
]
}
執行上述指令後,在 ansible-demo3 主機中 root 使用者下會有如下計劃任務被建立:
[root@ansible-demo3 ~]# crontab -u root -l
#Ansible: crontab test
5 1 * * * echo test
2.在 ansible-demo3 主機上建立計劃任務,任務名稱為”crontab day test”,任務每3天執行一次,于執行當天的1點1分開始執行,任務内容為輸出 test 字元。
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' "
ansible-demo3 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"crontab test",
"crontab day test"
]
}
[root@ansible-demo3 ~]# crontab -u root -l
#Ansible: crontab test
5 1 * * * echo test
#Ansible: crontab day test
1 1 */3 * * echo test
3.在 ansible-demo3 主機上建立計劃任務,任務名稱為”special time test”,任務将在重新開機時執行,任務内容為輸出 test 字元。
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='special time test' special_time=reboot job='echo test' "
ansible-demo3 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"crontab test",
"crontab day test",
"special time test"
]
}
[root@ansible-demo3 ~]# crontab -u root -l
#Ansible: crontab test
5 1 * * * echo test
#Ansible: crontab day test
1 1 */3 * * echo test
#Ansible: special time test
@reboot echo test
4.由于”special time test”已經存在,是以,當我們再次操作同名的任務時,ansible 将會認為是修改原來的任務。執行如下指令,原計劃任務會被修改,因為啟用了 backup,是以任務在修改前會被備份。
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='special time test' special_time=hourly job='echo test' backup=yes "
ansible-demo3 | SUCCESS => {
"backup_file": "/tmp/crontabX6CMO1",
"changed": true,
"envs": [],
"jobs": [
"crontab test",
"crontab day test",
"special time test"
]
}
執行上述指令後,從傳回資訊的 backup_file 字段中可以看到備份檔案的遠端主機中的位置,内容如下:
[root@ansible-demo3 ~]# cat /tmp/crontabX6CMO1
#Ansible: crontab test
5 1 * * * echo test
#Ansible: crontab day test
1 1 */3 * * echo test
#Ansible: special time test
@reboot echo test
原來的”special time test”任務會變成如下設定:
#Ansible: special time test
@hourly echo test
5.任務”special time test”已經存在于 ansible-demo3 主機中,如果我們想要删除這個計劃任務,可以執行如下指令,删除任務的同時可以進行備份。
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='special time test' state=absent backup=yes "
ansible-demo3 | SUCCESS => {
"backup_file": "/tmp/crontabiaObgL",
"changed": true,
"envs": [],
"jobs": [
"crontab test",
"crontab day test"
]
}
指令執行後,從傳回資訊的 backup_file 字段中可以看到備份檔案的遠端主機中的位置。
6.預設操作的是 root 使用者的計劃任務,如果想要操作遠端主機中其他使用者的計劃任務,可以指定要操作的使用者。
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a "user=ding name='special time test' special_time=hourly job='echo test' "
ansible-demo3 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"special time test"
]
}
上述指令執行後,可以在遠端主機中使用 crontab -u ding -l 檢視對應的計劃任務。
[root@ansible-demo3 ~]# crontab -u ding -l
#Ansible: special time test
@hourly echo test
7.上文已經建立了名稱為 “crontab test” 的計劃任務,如果我們想要暫時注釋這個計劃任務,可以使用如下指令。但是需要注意,在注釋任務時,所有設定需要跟原設定保持一緻,否則計劃任務的設定将會發生改變,示例如下:
比如,我們想要将 crontab day test 這個任務注釋掉,則需要使用如下指令。注意,最好與 backup 參數同時使用。
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' disabled=yes backup=yes"
ansible-demo3 | SUCCESS => {
"backup_file": "/tmp/crontabx0pB5J",
"changed": true,
"envs": [],
"jobs": [
"crontab test",
"crontab day test"
]
}
執行上述指令後,對應的計劃任務将會被注釋:
[root@ansible-demo3 ~]# crontab -u root -l
#Ansible: crontab test
5 1 * * * echo test
#Ansible: crontab day test
#1 1 */3 * * echo test
如果在使用 disabled 參數時,設定了錯誤的時間,那麼對應任務被注釋的同時,時間設定也會發生改變。比如,如果執行了如下指令:
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='crontab day test' minute=55 job='echo test' disabled=yes backup=yes"
ansible-demo3 | SUCCESS => {
"backup_file": "/tmp/crontab1IuX2g",
"changed": true,
"envs": [],
"jobs": [
"crontab test",
"crontab day test"
]
}
那麼對應任務被注釋的同時,還會進行如下設定:
[root@ansible-demo3 ~]# crontab -u root -l
#Ansible: crontab test
5 1 * * * echo test
#Ansible: crontab day test
#55 * * * * echo test
如果忘記了任何時間設定,那麼在任務被注釋時,還會被設定為預設的時間設定,也就是 “ *”。
是以,在使用 disabled 參數時,最好結合 backup 參數一起使用,萬一一時大意,還有回旋的餘地。