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 ~]#
删除主机中存在的组, 删除成功的前提是不能有用户把被删除的组当成主组.
来源: http://blog.51cto.com/ityunwei2017/2133927