天天看點

15-Ansible常用子產品-cron子產品

一、概述

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 參數一起使用,萬一一時大意,還有回旋的餘地。

繼續閱讀