* 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 ~]#
删除主机中存在的组,删除成功的前提是不能有用户把被删除的组当成主组。
* debug模块
调试模块,用于在调试中输出信息.
- 常用参数:
参数 | 说明 |
---|---|
msg | 调试输出的消息 |
var | 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出 |
verbosity | debug的级别(默认是0级,全部显示),ansible 2.1版本之后加入的一个参数,该变量对应的值当大于等于3时,将显示详细信息 |
[root@Super test]# cat register_result.yml
---
- hosts: 10.15.43.17
remote_user: ywbz
become: yes
become_method: su
become_user: root
tasks:
- name: create a register
shell: date
register: date_result
ignore_errors: True
- name: show debug info
debug: var=date_result verbosity=0
[root@Super test]# ansible-playbook register_result.yml
PLAY [10.15.43.17] *****************************************************************************************************************************************
TASK [create a register] ***********************************************************************************************************************************
changed: [10.15.43.17]
TASK [show debug info] *************************************************************************************************************************************
ok: [10.15.43.17] => {
"date_result": {
"changed": true,
"cmd": "date",
"delta": "0:00:00.037153",
"end": "2018-09-20 08:13:36.903123",
"failed": false,
"rc": 0,
"start": "2018-09-20 08:13:36.865970",
"stderr": "",
"stderr_lines": [],
"stdout": "Thu Sep 20 08:13:36 CST 2018",
"stdout_lines": [
"Thu Sep 20 08:13:36 CST 2018"
]
}
}
PLAY RECAP *************************************************************************************************************************************************
10.15.43.17 : ok=2 changed=1 unreachable=0 failed=0
[root@Super test]#
debug不光输出了date命令结果,还返回了很多相关调试信息,只需要date返回值,可以使用变量属性过滤 ,命令结果变量名+点.+debug返回的结果项名就可过滤。如:date_result.stdout 就是命令的返回值,date_result.rc就是命令的返回状态码。
[root@Super test]# cat register_result.yml
---
- hosts: 10.15.43.17
remote_user: ywbz
become: yes
become_method: su
become_user: root
tasks:
- name: create a register
shell: date
register: date_result
ignore_errors: True
- name: show debug info
debug: var=date_result.stdout verbosity=0
[root@Super test]# ansible-playbook register_result.yml
PLAY [10.15.43.17] *****************************************************************************************************************************************
TASK [create a register] ***********************************************************************************************************************************
changed: [10.15.43.17]
TASK [show debug info] *************************************************************************************************************************************
ok: [10.15.43.17] => {
"date_result.stdout": "Thu Sep 20 08:15:32 CST 2018"
}
PLAY RECAP *************************************************************************************************************************************************
10.15.43.17 : ok=2 changed=1 unreachable=0 failed=0
[root@Super test]#