1.cron模块
cron命令是计划任务功能,与crontab功能类似。
示例:时间格式--->>>分 时 日 月 星期
10 12 27 * * tar -cvzf log.tar.gz /var/log #每个月的27号的12时10分将log文件夹打包
@hourly tar -cvzf log.tar.gz /var/log #每小时进行一次打包
cron模块参数解析:
minute:此参数用于设置计划任务中分钟设定位的值,比如,上述示例1中分钟设定位的值为5,即minute=5,当不使用此参数时,分钟设定位的值默认为 *
hour:此参数用于设置计划任务中小时设定位的值,比如,上述示例1中小时设定位的值为1,即hour=1,当不使用此参数时,小时设定位的值默认为 *
day:此参数用于设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为 *
month:此参数用于设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为 *
weekday:此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为 *
special_time:在上述示例3与示例4中,计划任务的时间设定格式为@reboot或者@hourly,@reboot表示重启时执行,@hourly表示每小时执行一次,相当于设置成“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)在远程主机创建计划任务,任务名称为test crontab,任务内容为,每天12:10执行,任务内容为输出 this is a test for crontab
[root@ansible-control ~]# ansible 192.168.10.6 -m cron -a "name='test crontab' minute=10 hour=12 job='echo this is test for crontab' "
在远程主机上查询计划任务,可以查询到刚刚在ansible主机添加的计划任务,如下所示:
(2)在远程主机上创建计划任务,任务名称为crontab day test,任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出test字符
[root@ansible-control ~]# ansible 192.168.10.6 -m cron -a "name='crontab day test' minute=1 hour=1 day=*/3 job='echo test'"
(3)在远程主机上创建计划任务,任务名称为test special time,任务将在重启时执行,任务内容为输出test字符
[root@ansible-control ~]# ansible 192.168.10.6 -m cron -a "name='test special time' special_time=reboot job='echo test' "
重复执行相同的命令,系统会默认为修改该条计划任务。
(4)在test special time已经存在的情况下,执行如下命令,原计划任务会被修改,因为启用了backup,所以任务在修改前会被备份。
[root@ansible-control ~]# ansible 192.168.10.6 -m cron -a "name='test special time' special_time=hourly job='echo test' backup=yes "
(5)删除计划任务操作时先进行备份。
[root@ansible-control ~]# ansible 192.168.10.6 -m cron -a "name='test special time' state=absent backup=yes "
(6)指定远程主机中计划任务的操作人员,比如指定用用户wenhewen
[root@ansible-control ~]# ansible 192.168.10.6 -m cron -a "user=wenhewen name='test special time' special_time=hourly job='ehco test' "
操作完成后可在远程主机中使用crontab -lu wenhewen查看该用户的计划任务
(7)注释计划任务操作,注意输入命令要与刚开始输入的命令一致
[root@ansible-control ~]# ansible 192.168.10.6 -m cron -a "user=wenhewen name='test special time' special_time=hourly disabled=yes job='ehco test' "
如果你在使用disabled参数时,设置了错误的时间,那么对应任务被注释的同时,时间设定也会发生改变,比如,如果你执行了如下命令:
[root@ansible-control ~]# ansible 192.168.10.6 -m cron -a "user=wenhewen name='test special time' special_time=weekly disabled=yes job='ehco test' "
【重点】如果你忘记了任何时间设定,那么在任务被注释时,还会被设置为默认的时间设定,也就是“ * * * * * ”,所以,在使用disabled参数时,最好结合backup参数一起使用,万一一时大意,还有回旋的余地。
2.service模块
service模块可以帮助我们管理远程主机上的服务,比如,启动或停止远程主机中的nginx服务。
注意:假如你想要管理远程主机中的某个服务,那么这个服务必须能被BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,否则service模块也无法管理远程主机的对应服务,这样说可能不容易理解,那么我们换个方式来解释,假设你在使用centos6,那么你的centos6中的nginx则必须能够通过service nginx start启动,如果你的nginx无法通过service nginx start进行启动,那么它将同样无法通过ansible的service模块启动,假设你在使用centos7,那么你的centos7中的nginx则必须能够通过systemctl start nginx启动,如果它无法通过systemctl start nginx进行启动,那么它将同样无法通过ansible的service模块进行启动,centos6中默认通过sysv管理服务,centos7中默认通过systemd管理服务,如果你的服务无法通过BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,那么它也无法被ansible的service模块管理。
参数解析:
name:此参数用于指定需要操作的服务名称,比如nginx
state:此参数用于指定服务的状态,比如,我们想要启动远程主机中的nginx,则可以将state的值设置为started,如果想要停止远程主机中的服务,则可以将state的值设置为stopped,此参数的可用值有started、stopped、restarted、reloaded。
enabled:此参数用于指定是否将服务设置为开机 启动项,设置为yes表示将对应服务设置为开机启动,设置为no表示不会开机启动。
(1)将远程主机的nginx服务设置为启动状态
[root@ansible-control ~]# ansible 192.168.10.6 -m service -a "name=nginx state=started"
(2)将远程主机的nginx服务设置为停止状态
[root@ansible-control ~]# ansible 192.168.10.6 -m service -a "name=nginx state=stopped"
(3)将远程主机的nginx服务设置为开机自启动项
[root@ansible-control ~]# ansible 192.168.10.6 -m service -a "name=nginx enabled=yes"
3.user模块
user模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
参数解析:
name:必须参数,用于指定要操作的用户名称,可以使用别名user。
group:此参数用于指定用户所在的基本组 。
gourps:此参数用于指定用户所在的附加组,注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合append参数使用,否则在默认情况下,当再次使用groups参数设置附加组时,用户原来的附加组会被覆盖。
append:如果用户原本就存在多个附加组,那么当使用groups参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合append参数,将append设置为yes,表示追加附加组到现有的附加组设置,append默认值为no。
shell:此参数用于指定用户的默认shell
uid:此参数用于指定用户的uid号
expires:此参数用于指定用户的过期时间,相当于设置/etc/shadow文件中的的第8列,比如,你想要设置用户的过期日期为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和on_create,当此参数的值设置为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,但是如果同名的密钥对已经存在,并不会对同名密钥做任何操作
(1)在ansible主机上对远程主机上新建用户,如果该用户已经存在,则不进行任何操作:
[root@ansible-control .ssh]# ansible 192.168.10.2 -m user -a "name=jack"
(2)删除远程主机上的jack用户,但是不会删除其家目录:
[root@ansible-control .ssh]# ansible 192.168.10.2 -m user -a "name=jack state=absent"
(3)删除远程主机上的用户,同时删除其家目录,使用remove=yes参数:
[root@ansible-control .ssh]# ansible 192.168.10.2 -m user -a "name=jack state=absent remove=yes"
(4)在远程主机上新建用户jack,同时给其设置一个组,前提是该组必须事先存在:
[root@ansible-control .ssh]# ansible 192.168.10.2 -m user -a "name=jack group=wenhewen"
(5)指定远程主机上的jack用户的附加组为whwnew,whwnew组需要提前存在,当不使用groups设置附属组时,默认附加组与用户名相同,注意,为了保险起见,在不知道用户原来的附加组设定的情况下,最好将append参数设置为yes,我们也可以一次性设置多个附加组,附加组之间用逗号隔开,比如groups=wenhewen,whwnew,root示例命令如下:
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a "name=jack groups=wenhewen,whwnew append=yes"
【注意】在我们不适用append参数的情况下,添加了第一个附加组后,在添加第二个附加组就会覆盖之前的附加组;当使用append参数时附加组会一直叠加。
(6)指定远程主机上的用户使用指定的shell:使用shell参数
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a "name=jack shell=/bin/csh"
(7)指定远程主机上的用户的UID:使用uid参数
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a "name=jack uid=2222"
(8)指定远程主机上的用户的过期时间,假设给用户jack设置过期时间为:2019-12-31,使用命令date -d 2019-12-31 +%s获取该时间的unix时间戳:
[root@ansible-control ~]# date -d 2019-12-31 +%s #获取时间戳
1577721600
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a "name=jack expires=1577721600"
(9)指定远程主机上用户的注释信息,使用comment参数:
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a "name=jack comment='this test for comment' "
(10)给远程主机上的用户设置密码,这里密码设置为123456:
第一步:在远程主机上使用python生成87654321的加密字符串:
第二步:在ansible主机使用生成的密码字符串给远程主机的用户设置密码:
ansible 192.168.10.2 -m user -a 'name=alex password="$6$wckCDUX6sSHFMWlv$oWB4L290gvudKX5dik.aTIDvTc.mxACspycshXvRIl5FmyKA2Js9pZ4Uh0I7jjoQ/vHkObI2FvQFszr8mqeKp0" '
第三步:在远程主机上登陆alex用户,使用密码87654321
第四步:查看alex用户的shadow文件,发现其加密密钥和python生成的一致
(11)如下命令表示设置远程主机上的alex用户的密码,但是如果用户当前的加密字符串与命令中设置的加密字符串不一致,则不进行密码更新的操作:使用update_password=on_create参数
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a 'name=alex password="$6$wckCDUX6sSHFMWlv$oWB4L290gvudKX5dik.aTIDvTc.mxACspycshXvRIl5FmyKA2Js9pZ4Uh0I7jjoQ/vHkObI2FvQFszr8mqeKp0" update_password=on_create'
(12)为远程主机上的alex用户生成ssh密钥对,默认在用户家目录的./ssh目录中生成名为id_rsa的私钥和名为id_rsa.pub的公钥,如果已经存在同名密钥,并不会覆盖原来的密钥,即不做任何操作。alex生成的密钥对保存在home/alex/.ssh目录中。
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a 'name=alex generate_ssh_key=yes'
(13)为远程主机上的alex用户生成ssh密钥对,密钥对生成在/opt目录下,私钥名为id_rsa_alex,公钥名为id_rsa_alex.pub
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a 'name=alex generate_ssh_key=yes ssh_key_file=/opt/id_rsa_alex'
(14)为远程主机上的bob用户生成ssh密钥对,在创建密钥对时设置私钥的密码为123456,如果密钥对已经存在则不会修改原来的密码,不做任何操作。密钥对生成在/opt目录下,私钥名为id_rsa_bob,公钥名为id_rsa_bob.pub
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a 'name=bob generate_ssh_key=yes ssh_key_passphrase="123456" ssh_key_file=/opt/id_rsa_bob'
(15)为远程主机上的cindy用户生成ssh密钥对,同时指定密钥对的类型为dsa,当不显式指定密钥类型时,默认类型为rsa,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥。
[root@ansible-control ~]# ansible 192.168.10.2 -m user -a 'name=cindy generate_ssh_key=yes ssh_key_type=dsa'
4.group模块
用来管理远程主机上的组。
参数解析:
name:必须参数,用于指定要操作的组名称。
state:用于指定组的状态,两个值可选,present,absent,默认为present,设置为absent表示删除组。
gid:用于指定组的gid。
(1)指定远程主机中要操作的组,如果远程主机不存在该组,就会默认新建该组:
[root@ansible-control ~]# ansible 192.168.10.2 -m group -a 'name=lucy'
(2)指定删除远程主机中存在的组,但是如果要删除的组中已经存在所属的用户,则不能成功删除该组,示例如下:
第一次测试:lucy组中没有所属用户
[root@ansible-control ~]# ansible 192.168.10.2 -m group -a 'name=lucy state=absent'
第二次测试:lucy组中存在bob用户,再次执行删除命令
[root@ansible-control ~]# ansible 192.168.10.2 -m group -a 'name=lucy state=absent'
(3)gid参数的用法:
情况1:远程主机中存在lucy组,则修改其id值为5555。
[root@ansible-control ~]# ansible 192.168.10.2 -m group -a 'name=lucy gid=5555'
情况2:远程主机不存在lucy2组,这时会先创建lucy2组,并给其设置gid为6666.
[root@ansible-control ~]# ansible 192.168.10.2 -m group -a 'name=lucy2 gid=6666'
感谢大佬:http://www.zsythink.net/archives/2580