ansible笔记(6):常用模块之系统模块
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
ansible笔记(6):常用模块之系统模块的更多相关文章
- Python—day17时间模块、系统模块、递推遍历、序列化
一.time'''时间戳(timestamp):time.time()延迟线程的运行:time.sleep(secs)(指定时间戳下的)当前时区时间:time.localtime([secs])(指定 ...
- python sys模块导入和模块的使用
sys故名思意,就是系统模块,系统模块内置很多方法,怎么样去调用方法呢 1,argv 参数 sys.argv() 2,exit() 退出程序 sys.exit() 3,version 获取版本信息 ...
- ansible笔记(7):常用模块之系统类模块
ansible笔记():常用模块之系统类模块 cron模块 cron模块可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令. 在了解cron模块的参数之前,先写出一些计划任务的示例,示 ...
- ansible笔记(8):常用模块之系统类模块(二)
ansible笔记():常用模块之系统类模块(二) user模块 user模块可以帮助我们管理远程主机上的用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 此处我们介绍一些user模块 ...
- ansible笔记(9):常用模块之包管理模块
ansible笔记():常用模块之包管理模块 yum_repository模块 yum_repository模块可以帮助我们管理远程主机上的yum仓库. 此处我们介绍一些yum_repository模 ...
- ansible笔记(6):常用模块之命令类模块
ansible笔记():常用模块之命令类模块 command模块 command模块可以帮助我们在远程主机上执行命令 注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处 ...
- ansible笔记(5):常用模块之文件操作(二)
ansible笔记():常用模块之文件操作(二) 文件操作类模块 find模块 find模块可以帮助我们在远程主机中查找符合条件的文件,就像find命令一样. 此处我们介绍一些find模块的常用参数, ...
- ansible笔记(4):常用模块之文件操作
前文中,我们已经介绍了怎样使用模块,而且我们知道,ansible有很多模块,每个模块都有自己的功能,"模块"涉及到的方向比较多,所以对于个人来说,并没有必要了解所有的模块,我们只需 ...
- python学习笔记之常用模块(第五天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
随机推荐
- string类型的应用场景 —— Redis实战经验
string类型是实战中应用最多的数据类型,Redis的一些特性决定了string类型的应用场景. 1. Redis的数据是共享的 如果将用户信息存储在web服务的本地缓存,则每个web服务都会缓存一 ...
- UTF-8与GBK的区别
中文解码提示UnicodeDecodeError,UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: inv ...
- jdk1.8的HashMap和ConcurrentHashMap
原文地址:https://my.oschina.net/pingpangkuangmo/blog/817973 本文针对jdk1.8的ConcurrentHashMap 1 1.8的HashMap设计 ...
- 洛谷 P3796 【模板】AC自动机(加强版)(AC自动机)
题目链接:https://www.luogu.com.cn/problem/P3796 AC自动机:复杂度$O( (N+M)\times L )$,N为模式串个数,L为平均长度,M为文章长度. ins ...
- webpack之 plugin(插件)
plugin plugin是插件的意思,通常用来对某个现有的架构就行拓展 webpack中的插件,就是对webpack现有功能的各种扩展,比如打包优化,文件压缩等 loader和plugin区别 lo ...
- VJ数论专题AC代码临时保存
//A #include<bits/stdc++.h> using namespace std; bool vis[1000010]; void Get_Prime() { int n = ...
- 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()
前言 我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? ...
- 马走日的解法(dfs)
马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...
- AcWing 278. 数字组合 求方案数目
//M看成背包容量,把每个数看成一个物品,Ai看成是体积 //目标:求总体积恰好为M的方案数目 #include <iostream> using namespace std; ; int ...
- 其他 - YAML 入门
概述 简单介绍 YAML 语言 背景 很多地方, 都在使用 YAML k8s spring 其他 准备 验证工具 YAML.YML在线格式化校验工具 一个 YAML 转换 JSON 的工具 通常来说, ...