【Absible學習】Ansible常用模塊---系統類模塊
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 ~]#
刪除主機中存在的組,刪除成功的前提是不能有用戶把被刪除的組當成主組。
【Absible學習】Ansible常用模塊---系統類模塊