【Absible學習】Ansible常用模塊---系統類模塊

* cron模塊

cron模塊可以管理遠程主機中的計劃任務,功能相當於crontab命令。

模塊參數

參數 說明
minute 設置計劃任務中的分鐘,比如,minute=5,當不使用此參數時,分鐘的值默認爲"*",表示所有的分鐘
hour 設置計劃任務中的小時,比如,hour=1,當不使用此參數時,小時的值默認爲"*",表示所有小時
day 設置計劃任務中一個月的第幾天,當不使用此參數時,日的值默認爲"*",表示一個月中的每天
month 設置計劃任務中一年的幾月,當不使用此參數時,月的值默認爲"*" ,表示每個月
weekday 設置計劃任務的周幾,當不使用此參數時,設定位的值默認爲"*",表示一週的每天
special_time 計劃任務的時間設定格式爲@reboot或者@hourly,@reboot表示重啓時執行,@hourly表示每小時執行一次,這種@開頭的時間設定格式則需要使用special_time參數進行設置,special_time參數的可用值有reboot(重啓後)、yearly(每年)、annually(每年,與yearly相同)、monthly(每月)、weekly(每週)、daily(每天)、hourly(每時)。
user 設置當前計劃任務屬於哪個用戶,當不使用此參數時,默認操作root用戶的計劃任務
job 指定計劃的任務中需要實際執行的命令或者腳本,比如上例中的"echo test"命令。
name 設置計劃任務的名稱,計劃任務的名稱會在註釋中顯示,當不指定計劃任務的名稱時,ansible會默認爲計劃任務加入註釋,註釋的內容爲#Ansible: None,假設指定計劃任務的名稱爲test,那麼註釋的內容爲#Ansible: test,在一臺機器中,計劃任務的名稱應該具有唯一性,方便以後根據名稱修改或刪除計劃任務。
state 當計劃任務有名稱時,我們可以根據名稱修改或刪除對應的任務,當刪除計劃任務時,需要將state的值設置爲absent
disabled 當計劃任務有名稱時,我們可以根據名稱使對應的任務"失效"(註釋掉對應的任務),使用此參數時,除了需要指定任務的名稱,還需要同時指定任務的job以及任務的時間設定,而且任務的時間設定必須和對應任務完全相同,否則在註釋任務的同時,任務的時間設定會被修改。
backup 設置爲yes,當修改或者刪除對應的計劃任務時,會先對計劃任務進行備份,然後再對計劃任務進行修改或者刪除,cron模塊會在遠程主機的/tmp目錄下創建備份文件,以crontab開頭並且隨機加入一些字符,具體的備份文件名稱會在返回信息的backup_file字段中看到,推薦將此此參數設置爲yes。

時間單位設定參數都未指定時,計劃任務的時間設定默認會被設定爲" *",這樣表示每秒都會執行一次計劃任務。

[root@Super ~]# ansible 10.15.43.15 -S -R root -m cron -a 'name="ansible cron test" minute=3 hour=1 day=*/3 month=*/2 weekday=6  user=ywbz job="systemctl restart snmpd" backup=yes'
10.15.43.15 | SUCCESS => {
    "backup_file": "/tmp/crontabPPsVEF", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "ansible cron test"
    ]
}
[root@Super ~]#
[root@localhost ~]# crontab -u ywbz -l
#Ansible: ansible cron test
3 1 */3 */2 6 systemctl restart snmpd
[root@localhost ~]#

ywbz用戶下,每2月個的每3天的1點3分執行重啓snmp服務,任務名稱是ansible cron test,創建計劃任務前先備份現有計劃任務。

[root@Super ~]# ansible 10.15.43.15 -S -R root -m cron -a 'name="ansible cron test" special_time=reboot job="systemctl restart snmpd" backup=yes'
10.15.43.15 | SUCCESS => {
    "backup_file": "/tmp/crontabLYGkRi", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "ansible cron test"
    ]
}
[root@Super ~]# 
[root@localhost ~]# crontab -l
30 6 * * * /usr/bin/systemctl restart snmpd||/sbin/service snmpd restart
*/3 * * * * /usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w
#Ansible: ansible cron test
@reboot systemctl restart snmpd
[root@localhost ~]# 

在root下創建計劃任務,在重啓後執行重啓snmpd服務

[root@Super ~]# ansible 10.15.43.15 -S -R root -m cron -a 'name="ansible cron test" special_time=hourly job="systemctl restart snmpd" backup=yes'
10.15.43.15 | SUCCESS => {
    "backup_file": "/tmp/crontabqnFcjg", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "ansible cron test"
    ]
}
[root@Super ~]# 
[root@localhost ~]# crontab -l
30 6 * * * /usr/bin/systemctl restart snmpd||/sbin/service snmpd restart
*/3 * * * * /usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w
#Ansible: ansible cron test
@hourly systemctl restart snmpd
[root@localhost ~]#

由於"ansible cron test"已經存在,所以,當再次操作同名的任務時,ansible將會認爲是修改原來的任務

[root@Super ~]# ansible 10.15.43.15 -S -R root -m cron -a 'name="ansible cron test" state=absent backup=yes'
10.15.43.15 | SUCCESS => {
    "backup_file": "/tmp/crontabxJz7ec", 
    "changed": true, 
    "envs": [], 
    "jobs": []
}
[root@Super ~]#
[root@localhost ~]# crontab -l
30 6 * * * /usr/bin/systemctl restart snmpd||/sbin/service snmpd restart
*/3 * * * * /usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w
[root@localhost ~]#

通過state參數刪除計劃任務名爲ansible cron test的計劃任務。

[root@Super ~]# ansible 10.15.43.15 -S -R root -m cron -a 'name="ansible cron test" special_time=hourly job="systemctl restart snmpd" backup=yes'
10.15.43.15 | SUCCESS => {
    "backup_file": "/tmp/crontabOnMjnB", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "ansible cron test"
    ]
}
[root@Super ~]# ansible 10.15.43.15 -S -R root -m cron -a 'name="ansible cron test" special_time=hourly job="systemctl restart snmpd" disabled=yes backup=yes'
10.15.43.15 | SUCCESS => {
    "backup_file": "/tmp/crontabuRQ7Hi", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "ansible cron test"
    ]
}
[root@Super ~]# 
[root@localhost ~]# crontab -l
30 6 * * * /usr/bin/systemctl restart snmpd||/sbin/service snmpd restart
*/3 * * * * /usr/sbin/ntpdate ntp1.nl.net||/usr/sbin/ntpdate cn.pool.ntp.org && /sbin/clock -w
#Ansible: ansible cron test
#@hourly systemctl restart snmpd
[root@localhost ~]#

使用disabled參數可以註釋掉某個計劃任務,此時,所有設定需要跟原設定保持一致,否則計劃任務的設置將會發生改變,如果設置了錯誤的時間,那麼對應任務被註釋的同時,時間設定也會發生改變,如果忘記了任何時間設定,那麼在任務被註釋時,還會被設置爲默認的時間設定,也就是 " *"

* service模塊

service模塊可以管理遠程主機上的服務,比如,啓動或停止遠程主機中的snmp服務。這個服務必須能被 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一種所管理,否則service模塊也無法管理遠程主機的對應服務,centos6中默認通過sysv管理服務,centos7中默認通過systemd管理服務。

模塊參數

參數 說明
name 指定需要操作的服務名稱,比如nginx
state 指定服務的狀態,可用值有started、stopped、restarted、reloaded。
enabled 是否將服務設置爲開機啓動項,設置爲yes表示將對應服務設置爲開機啓動,設置爲no表示不會開機啓動。
[root@Super ~]# ansible 10.15.43.15 -S -R root -m service -a 'name=snmpd state=stopped enabled=yes'

停止snmp服務,並設置開機啓動。

* user模塊

user模塊可以管理遠程主機上的用戶,比如創建用戶、修改用戶、刪除用戶、爲用戶創建密鑰對等操作。

模塊參數

參數 說明
name 必須參數,指定要操作的用戶名稱,可以使用別名user。
group 指定用戶所在的基本組
gourps 指定用戶所在的附加組,注意,如果說用戶已經存在並且已經擁有多個附加組,那麼如果想要繼續添加新的附加組,需要結合append參數使用,否則在默認情況下,當再次使用groups參數設置附加組時,用戶原來的附加組會被覆蓋。
append 如果用戶原本就存在多個附加組,那麼當使用groups參數設置附加組時,當前設置會覆蓋原來的附加組設置,如果不想覆蓋原來的附加組設置,需要結合append參數,將append設置爲yes,表示追加附加組到現有的附加組設置,append默認值爲no。
shell 指定用戶的默認shell
uid 指定用戶的uid號
expires 指定用戶的過期時間,如設置用戶的過期日期爲2018年12月31日,那麼你首先要獲取到2018年12月31日的unix時間戳,使用命令"date -d 2018-12-31 +%s"獲取到的時間戳爲1546185600,當設置expires=1546185600時,表示用戶的過期時間爲2018年12月31日0點0分,設置成功後,查看遠程主機的/etc/shadow文件,對應用戶的第八列的值將變成17895(表示1970年1月1日到2018年12月31日的天數,unix時間戳的值會自動轉換爲天數,不用手動的進行換算),目前此參數只支持在Linux和FreeBSD系統中使用。
comment 指定用戶的註釋信息
state 指定用戶是否存在於遠程主機中,可選值有present、absent,默認值爲present,表示用戶需要存在,當設置爲absent時表示刪除用戶。
remove 當state的值設置爲absent時,表示要刪除遠程主機中的用戶,但是在刪除用戶時,不會刪除用戶的家目錄等信息,這是因爲remoove參數的默認值爲no,如果設置爲yes,在刪除用戶的同時,會刪除用戶的家目錄,當state=absent並且remove=yes時,相當於執行"userdel --remove"命令
password 指定用戶的密碼,但是這個密碼不能是明文的密碼,而是一個對明文密碼"加密後"的字符串,相當於/etc/shadow文件中的密碼字段,是一個對明文密碼進行哈希後的字符串,你可以在python的命令提示符下輸入如下命令,生成明文密碼對應的加密字符串。import crypt; crypt.crypt('666666'),輸入上述命令後,即可得到明文密碼666666對應的加密字符串。
update_password 當此參數的值設置爲always時表示,如果password參數設置的值與用戶當前的加密過的密碼字符串不一致,則直接更新用戶的密碼,默認值即爲always,但是當此參數設置爲on_create時,如果password參數設置的值與用戶當前的加密過的密碼字符串不一致,則不會更新用戶的密碼字符串,保持之前的密碼設定,如果是新創建的用戶,即使此參數設置爲on_create,也會將用戶的密碼設置爲password參數對應的值。
generate_ssh_key 默認值爲no,如果設置爲yes,表示爲對應的用戶生成ssh密鑰對,默認在用戶家目錄的./ssh目錄中生成名爲id_rsa的私鑰和名爲id_rsa.pub的公鑰,如果同名的密鑰已經存在與對應的目錄中,原同名密鑰並不會被覆蓋(不做任何操作)
ssh_key_file 當generate_ssh_key參數的值爲yes時,使用此參數自定義生成ssh私鑰的路徑和名稱,對應公鑰會在同路徑下生成,公鑰名以私鑰名開頭,以".pub"結尾。
ssh_key_comment 當generate_ssh_key參數的值爲yes時,在創建證書時,使用此參數設置公鑰中的註釋信息,但是如果同名的密鑰對已經存在,則並不會修改原來的註釋信息,即不做任何操作,當不指定此參數時,默認的註釋信息爲"ansible-generated on 遠程主機的主機名"
ssh_key_passphrase 當generate_ssh_key參數的值爲yes時,在創建證書時,使用此參數設置私鑰的密碼,但是如果同名的密鑰對已經存在,則並不會修改原來的密碼,即不做任何操作
ssh_key_type 當generate_ssh_key參數的值爲yes時,在創建證書時,使用此參數設置密鑰對的類型,默認密鑰類型爲rsa,但是如果同名的密鑰對已經存在,並不會對同名密鑰做任何操作
[root@localhost soft]# date -d 2019-12-31 +%s
1577721600
[root@localhost soft]# python;
Python 2.7.5 (default, Nov  6 2016, 00:28:07) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import crypt;crypt.crypt('51cto')
'$6$PIOLAFycrigJwqXu$guRC.awwzv8OwDL1awiPyTyjaQgQMzTN2wfJJpR/edwvrwHij4nmnzR23urxoOLLD6cTt8RvE7mnZtNDeojNv.'
>>> quit()
[root@localhost soft]# 
[root@Super ~]# ansible 10.15.43.15 -S -R root -m user -a 'name=justin groups=ywbz append=yes shell=/bin/csh uid=509 password="$6$PIOLAFycrigJwqXu$guRC.awwzv8OwDL1awiPyTyjaQgQMzTN2wfJJpR/edwvrwHij4nmnzR23urxoOLLD6cTt8RvE7mnZtNDeojNv." expires=1577721600 comment="ansible useradd test"'
10.15.43.15 | SUCCESS => {

使用"date -d 2018-12-31 +%s"命令可以獲取到對應日期的unix時間戳,如果用戶已經存在,當前密碼的加密字符串與命令中設置的加密字符串不一致,則不進行密碼更新的操作。

* group模塊

group模塊可以管理遠程主機上的組。

參數 說明
name 必須參數,用於指定要操作的組名稱。
state 用於指定組的狀態,兩個值可選,present,absent,默認爲present,設置爲absent表示刪除組。
gid 用於指定組的gid
[root@Super ~]# ansible 10.15.43.15 -S -R root -m group -a 'name=justin state=absent'
10.15.43.15 | FAILED! => {
    "changed": false, 
    "msg": "groupdel: cannot remove the primary group of user 'justin'\n", 
    "name": "justin"
}
[root@Super ~]#

刪除主機中存在的組,刪除成功的前提是不能有用戶把被刪除的組當成主組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章