Ansible常用模块
cron 模块
用途:cron模块⽤于设置定时任务,也⽤于管理定时任务中的环境变量
使用方法:
[root@ansible ~]# ansible-doc -s cron - name: Manage cron.d and crontab entries cron: backup: # (yes/on)如果设置了,则会在修改远程cron_file前备份这些文件 cron_file: # 自定义cron_file的文件名,使用相对路径则表示在/etc/cron.d/中,必选同时制定user选项 minute: # 分(0-59,*,/N),不写时默认为* hour: # 时(0-23,*,/N),不写时默认为* day: # 日(1-31,*,/N),不写时默认为* month: # 月(1-12,*,/N),不写时默认为* weekday: # 周(0-6 for Sunday-Saturday,*),不写时默认为* disabled: # 禁用crontab中的某个任务,要求state=present env: # (yes/on)设置一个环境变量,将添加在crontab的顶端,使用name=value定义变量名和值. job: # 需要执行的命令,如果设置了env,则表示环境变量的值,此时job="xxxx"等价于value="xxxx" name: # 描述crontab的字符串,但如果设置的是env,则name为环境变量的名称,要求state=absent,注意,若没有设置name,且state=present,则总会创建一条新的job条目,即使cron_file中已经存在同样的条目. reboot: # 如果任务应该在重新启动时运行。不赞成使用此选项。用户应该使用special_time. special_time: # 定时任务的别称,用于定义何时运行job条目.有效值有reboot/hourly/daily/weekly/monthly/yearly/annually state: # job或者env的状态是present(默认)还是absent,present用于创建,absent用于删除 user: # 指定那个用户的crontab任务将要被修改,默认root.
示例:
1)每分钟执行一次同步阿里云的时间 [root@ansible ~]# ansible all -m cron -a "name='ntpdate aly' minute=*/1 job='/usr/sbin/ntpdate ntp1.aliyun.com'" 192.168.192.129 | CHANGED => { "changed": true, "envs": [], "jobs": [ "ntpdate aly" ] } 查看结果(已经创建一条同步时间的计划任务) [root@ansible ~]# ansible all -m shell -a "crontab -l" 192.168.192.129 | CHANGED | rc=0 >> #Ansible: ntpdate aly */1 * * * * /usr/sbin/ntpdate ntp1.aliyun.com 2)backup参数(备份cron文件) [root@ansible ~]# ansible all -m cron -a "name='ntpdate aly' minute=0 hour=0 day=* month=* weekday=* backup=yes job='/usr/sbin/ntpdate ntp1.aliyun.com'" 192.168.192.129 | CHANGED => { "backup_file": "/tmp/crontabJOrXXY", "changed": true, "envs": [], "jobs": [ "ntpdate aly" ] } 上面返回的结果中包含一个backup_file,备份的文件在被控制端的/tmp下面 查看结果(可以看到计划任务改变,和被控制端的备份文件) [root@ansible ~]# ansible all -m shell -a "crontab -l && ls -l /tmp | grep crontab" 192.168.192.129 | CHANGED | rc=0 >> #Ansible: ntpdate aly 0 0 * * * /usr/sbin/ntpdate ntp1.aliyun.com -rw------- 1 root root 68 Dec 27 10:47 crontabJOrXXY 3)env参数(设置环境变量) [root@ansible ~]# ansible all -m cron -a "env=yes name='TEST' backup=yes job='echo test'" 192.168.192.129 | CHANGED => { "backup_file": "/tmp/crontabFgNUhH", "changed": true, "envs": [ "TEST" ], "jobs": [ "ntpdate aly" ] } 查看结果(发现在开头多了个TEST="echo test",也就是说明env=yes的时候name='TEST'就是变量名job='echo test'就是变量的值) [root@ansible ~]# ansible all -m shell -a "crontab -l" 192.168.192.129 | CHANGED | rc=0 >> TEST="echo test" #Ansible: ntpdate aly 0 0 * * * /usr/sbin/ntpdate ntp1.aliyun.com 4)special_time参数 重启时执行任务 [root@ansible ~]# ansible all -m cron -a "name='special time reboot' special_time=reboot job='echo test'" 192.168.192.129 | CHANGED => { "changed": true, "envs": [ "TEST" ], "jobs": [ "ntpdate aly", "special time reboot" ] } 查看结果 [root@ansible ~]# ansible all -m shell -a "crontab -l" 192.168.192.129 | CHANGED | rc=0 >> TEST="echo test" #Ansible: ntpdate aly 0 0 * * * /usr/sbin/ntpdate ntp.aliyun.com #Ansible: special time reboot @reboot echo test 每小时执行一次计划任务 [root@ansible ~]# ansible all -m cron -a "name='special time reboot' special_time=hourly job='echo test'" 192.168.192.129 | CHANGED => { "changed": true, "envs": [ "TEST" ], "jobs": [ "ntpdate aly", "special time reboot" ] } 查看结果 [root@ansible ~]# ansible all -m shell -a "crontab -l" 192.168.192.129 | CHANGED | rc=0 >> TEST="echo test" #Ansible: ntpdate aly 0 0 * * * /usr/sbin/ntpdate ntp.aliyun.com #Ansible: special time reboot @hourly echo test 上面发现@reboot echo test换成了@hourly echo test原因是因为两次执行的name的名字是一样的所有直接就覆盖了 5)state=absent(删除计划任务) [root@ansible ~]# ansible all -m cron -a "name='special time reboot' backup=yes state=absent" 192.168.192.129 | CHANGED => { "backup_file": "/tmp/crontab02rAD6", "changed": true, "envs": [ "TEST" ], "jobs": [ "ntpdate aly" ] } 查看结果(发现special time reboot任务已经删除了) [root@ansible ~]# ansible all -m shell -a "crontab -l" 192.168.192.129 | CHANGED | rc=0 >> TEST="echo test" #Ansible: ntpdate aly 0 0 * * * /usr/sbin/ntpdate ntp.aliyun.com
service 模块
用途:service 模块可以帮助我们管理远程主机上的服务。比如,启动或停止远程主机中的 nginx 服务
使用方法:
[root@ansible ~]# ansible-doc -s service - name: Manage services service: arguments: # 服务命令行参数传递 enabled: # 设置服务为开机自启(yes/no),默认为no name: # (必选项)指定服务名. pattern: # 如果服务没有做出相应,可以通过这个参数指定使用ps或者其他方式查看服务的状态. runlevel: # 设置服务启动级别 sleep: # 如果服务正在"重新启动",那么在停止和开始命令之间设置休眠时间. state: # started和stoped分别是启动和停止服务,它们是幂等操作,多次启动或者停止服务都是一样的,也就是说对于运行中的服务不会再次启动操作,同理停止也是一样的; # restarted重启服务,restarted总是重读配置文件如果服务是未运⾏状态,则reloaded会启动服务(state和enabled两者⾄少要给⼀个)
示例:
以nginx服务为例做示例(这里面返回的打印的数据太多了就不放到博客了) 1)state=started(启动服务) [root@ansible ~]# ansible all -m service -a "name=nginx state=started" 2)state=stopped(停止服务) [root@ansible ~]# ansible all -m service -a "name=nginx state=stopped" 3)state=restarted(重启服务) [root@ansible ~]# ansible all -m service -a "name=nginx state=restarted" 4)state=reloaded(重载服务) [root@ansible ~]# ansible all -m service -a "name=nginx state=reloaded" 5)enabled(设置开机自启) [root@ansible ~]# ansible all -m service -a "name=nginx enabled=yes"
systemd 模块
用途:systemd 模块可以帮助我们使用systemd管理远程主机上的服务。比如,启动或停止远程主机中的 nginx 服务
使用方法:
[root@ansible ~]# ansible-doc -s systemd - name: Manage services systemd: daemon_reload: # 在执行任何其他操作之前运行守护进程重新加载,以确保systemd已经读取其他更改. enabled: # 设置服务为开机自启(yes/no),默认为no force: # 是否覆盖现有符号链接(yes/on). masked: # 是否将服务设置为masked状态(yes/no),被mask的服务是无法启动的 name: # 指定服务名称. no_block: # 不要同步等待操作请求完成(yes/no) state: # started和stoped分别是启动和停止服务,它们是幂等操作,多次启动或者停止服务都是一样的,也就是说对于运行中的服务不会再次启动操作,同理停止也是一样的;
示例:
以nginx服务为例做示例(这里面返回的打印的数据太多了就不放到博客了) 1)state=started(启动服务) [root@ansible ~]# ansible all -m systemd -a "name=nginx state=started" 2)state=stopped(停止服务) [root@ansible ~]# ansible all -m systemd -a "name=nginx state=stopped" 3)state=restarted(重启服务) [root@ansible ~]# ansible all -m systemd -a "name=nginx state=restarted" 4)state=reloaded(重载服务) [root@ansible ~]# ansible all -m systemd -a "name=nginx state=reloaded" 5)enabled(设置开机自启) [root@ansible ~]# ansible all -m systemd -a "name=nginx enabled=yes"
user 模块
用途:user 模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作
使用方法:
[root@ansible ~]# ansible-doc -s user - name: Manage user accounts user: append: # 如果用户原本就存在多个附加组,那么当使用 groups 参数设置附加组时,当前设置会覆盖原来的附加组设置 # 如果不想覆盖原来的附加组设置,需要结合 append 参数,将 append 设置为 yes,表示追加附加组到现有的附加组设置,append 默认值为 no. comment: # 设置用户的描述信息 create_home: # 创建家⽬录,或者已有的⽤户但家⽬录不存在也会创建。设置为no则不创建家⽬录 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 文件,对应用户的第8八列的值将变成17895(表示1970年1月1日到2018年12月31日的天数,unix 时间戳的值会自动转换为天数,我们不用手动的进行换算, # 目前此参数只支持在 Linux 和 FreeBSD 系统中使用。 force: # 强制删除用户、用户目录,只在state=absent中生效,相当于userdel --force命令 generate_ssh_key: # 是否为相关用户生成SSH密钥。这将“不会”覆盖现有SSH密钥. group: # 设置⽤户的primary group(主组). groups: # 将⽤户加⼊到辅助组列表中。如果设置"groups=",则会将此⽤户从所有辅助组中移除 home: # 指定要创建的家⽬录路径 move_home: # 如果设置为yes,则"home="则表⽰将家⽬录移动到此选项指定的路径下 name: # (必选项)要创建、修改、移除的⽤户名. non_unique: # 当与 -u 选项一起使用时,该选项允许将用户ID更改为非唯一值 password: # 设置⽤户密码。此处只能使⽤加密密码作为值. password_lock: # 锁定用户的密码(等价于usermod -L命令)这个选项并不总是意味着用户不能通过其他方法登录。这个选项没有禁用用户,只锁定密码. remove: # 配合'state=absent'时,等价于'userdel --remove',即删除家⽬录和邮件列表 seuser: # 在启用selinux的系统上设置seuser类型. shell: # 设置⽤户的shell ssh_key_bits: # 当 generate_ssh_key 参数的值为 yes 时,使用此参数指定要创建的SSH密钥中的位数. ssh_key_comment: # 当 generate_ssh_key 参数的值为 yes 时,在创建证书时,使用此参数设置公钥中的注释信息。但是如果同名的密钥对已经存在,则并不会修改原来的注释信息,即不做任何操作。 # 当不指定此参数时,默认的注释信息为”ansible-generated on 远程主机的主机名. ssh_key_file: # 当 generate_ssh_key 参数的值为 yes 时,使用此参数自定义生成 ssh 私钥的路径和名称,对应公钥会在同路径下生成,公钥名以私钥名开头,以”.pub”结尾. ssh_key_passphrase: # 当 generate_ssh_key 参数的值为 yes 时,在创建证书时,使用此参数设置私钥的密码。但是如果同名的密钥对已经存在,则并不会修改原来的密码,即不做任何操作. ssh_key_type: # 当 generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置密钥对的类型。默认密钥类型为 rsa,但是如果同名的密钥对已经存在,并不会对同名密钥做任何操作. state: # 创建⽤户(present)还是删除⽤户(absent)。默认为present. system: # 设置为yes表⽰创建⼀个系统⽤户,只能⽤于创建,不能⽤于修改已有⽤户为系统⽤户 uid: # 设置用户的UID update_password: # user是幂等模块,"always"将总是修改密码。"on_create"将只在创建⽤户时设置密码
示例:
1)name参数(创建用户) 创建名为brian的用户,如果用户已经存在,则不进行任何操作 [root@ansible ~]# ansible all -m user -a "name=brian" 192.168.192.129 | CHANGED => { "changed": true, "comment": "", "create_home": true, "group": 1000, "home": "/home/brian", "name": "brian", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1000 } 2)state=absent参数(删除用户但不删除目录) 删除名为brian的用户,但是不会删除 brian 用户的家目录 [root@ansible ~]# ansible all -m user -a "name=brian state=absent" 192.168.192.129 | CHANGED => { "changed": true, "force": false, "name": "brian", "remove": false, "state": "absent" } 3)state=absent remove=yes参数(删除用户并删除用户目录) 删除名为brian的用户,同时会删除brian用户的家目录等信息。如果已经不存在brian的用户,则不做任何操作 [root@ansible ~]# ansible all -m user -a "name=brian state=absent remove=yes" 192.168.192.129 | SUCCESS => { "changed": false, "name": "brian", "state": "absent" } 4)group参数(为用户指定组) 指定brian用户的主组为yunwei,yunwei组需要提前存在,当不使用group设置主组时,默认主组与用户名相同 创建yunwei组 [root@ansible ~]# ansible all -m shell -a "groupadd yunwei" [root@ansible ~]# ansible all -m user -a "name=brian group=yunwei" 192.168.192.129 | CHANGED => { "changed": true, "comment": "", "create_home": true, "group": 1000, "home": "/home/brian", "name": "brian", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1000 } 5)groups参数(为用户添加附加组)、append参数(设置yes可添加多个附加组) 指定brian用户的附加组为python,python组需要提前存在,当不使用groups设置附属组时,默认附加组与用户名相同。 注意,为了保险起见,在不知道用户原来的附加组设定的情况下,最好将append参数设置为yes我们也可以一次性设置多个附加组,附加组之间用逗号隔开 创建python组 [root@ansible ~]# ansible all -m shell -a "groupadd python" [root@ansible ~]# ansible all -m user -a "name=brian groups=python append=yes" 192.168.192.129 | CHANGED => { "append": true, "changed": true, "comment": "", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "shell": "/bin/bash", "state": "present", "uid": 1000 } 6)expires参数(设置用户的过期时间) 指定brian用户的过期时间为2018年12月31日。使用"date -d 2018-12-31 +%s"命令可以获取到对应日期的unix时间戳 获取unix时间戳 [root@ansible ~]# date -d 2018-12-31 +%s 1546185600 [root@ansible ~]# ansible all -m user -a "name=brian expires=1546185600" 192.168.192.129 | CHANGED => { "append": false, "changed": true, "comment": "", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "shell": "/bin/bash", "state": "present", "uid": 1000 } 7)comment参数(指定用户的注释信息) 指定brian用户的注释信息 [root@ansible ~]# ansible all -m user -a "name=brian comment='my name is zhujingzhi'" 192.168.192.129 | CHANGED => { "append": false, "changed": true, "comment": "my name is zhujingzhi", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "shell": "/bin/bash", "state": "present", "uid": 1000 } 8)password参数(为用户设置密码) 将brian用户的密码设置为hahahaha 给hahahaha加密 [root@ansible ~]# python Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import crypt >>> crypt.crypt('hahahaha') '$6$Zfj8DrWsbhwHSpCq$vuWpw.5FX97egYaWEUTavkP3ahi294yO5brO9qm3XDdvjM0hJKwaoXt7ue/9ZRIm8sYzgxsGZdKi8Qxdk3xDD.' [root@ansible ~]# ansible all -m user -a 'name=brian password="$6$Zfj8DrWsbhwHSpCq$vuWpw.5FX97egYaWEUTavkP3ahi294yO5brO9qm3XDdvjM0hJKwaoXt7ue/9ZRIm8sYzgxsGZdKi8Qxdk3xDD."' 192.168.192.129 | CHANGED => { "append": false, "changed": true, "comment": "my name is zhujingzhi", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "uid": 1000 } 9)generate_ssh_key参数(生成ssh密钥对) 为brian用户生成ssh密钥对。默认在用户家目录的./ssh 目录中生成名为 id_rsa 的私钥和名为 id_rsa.pub 的公钥,如果已经存在同名密钥,并不会覆盖原来的密钥,即不做任何操作 [root@ansible ~]# ansible all -m user -a "name=brian generate_ssh_key=yes" 192.168.192.129 | CHANGED => { "append": false, "changed": true, "comment": "my name is zhujingzhi", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "shell": "/bin/bash", "ssh_fingerprint": "2048 SHA256:67RLzlQYCjfOctm7K4cXrd+ctuTl6WEGW0oboP9/4Qc ansible-generated on ansible_node1 (RSA)", "ssh_key_file": "/home/brian/.ssh/id_rsa", "ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5OKH1DicFwXMVhJioQyYAt3I/C+axJ8qG4lynUMxXQNRa1NCGXPcnBXDUATAwfzG7O5itRrFOGZracMb63B9WrhkPzWPiJHjv9fRAibuydmro0al6GkUqU/Ma2UME1c+OWKR5HrhGHU/8KfD/EHcsaSmeI0G5qWsstNzzjsxpCTDL/cGWK841s1UE6n4dHs+fxp0r7NDqzB4HceTIKZKdB0ScetchMCHJzBpV+nu3uqacgZrTRp1T5EHIXjoS9D+NeH5/9YVevTrlMqBks8RdGjXeds8G3LyqQMdjR2X5WPW0+cS8oECtEPY1xERPdgbN7c643Xh2oXDoEBMZ/GfT ansible-generated on ansible_node1", "state": "present", "uid": 1000 } 10)ssh_key_file参数(指定密钥生成的路径) 为brian用户生成ssh密钥对,密钥对生成在/opt目录下,私钥名为 id_rsa_brian,公钥名为 id_rsa_brian.pub [root@ansible ~]# ansible all -m user -a "name=brian generate_ssh_key=yes ssh_key_file=/opt/id_rsa_brian" 192.168.192.129 | CHANGED => { "append": false, "changed": true, "comment": "my name is zhujingzhi", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "shell": "/bin/bash", "ssh_fingerprint": "2048 SHA256:/A0hgTZ4GA7qMKhikPe+QMJiAlKHmzk560IaMC5uRHI ansible-generated on ansible_node1 (RSA)", "ssh_key_file": "/opt/id_rsa_brian", "ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCSlNUc0TCduB6CqHr65zyC4MN/UI36DsdQB9JgBNT2MymoV9oCgcrg6m5TcuOcyv57BqZg1/l78LMHg9bCL0cn+EC3Pv7lNVgTGIRlRLFsXCnvVIbQ7nwygH1mqRR2VxNY5RsrxLSnvCADdTuc+AQ7Y7/5CMI3BLHAUju8VbfVSUfluUoR4V+ifT0zHPPbN9GWSTVBWgwPqsB6huw5odFJoY20AxTKzT5TZDLSFk1SVWV/T3knndBReHwM+OSYu7UTCCf5cI+3OImDDBscEr4GLEGfxSOXepUqI0EoYZrqhWUeuFWvSzvcJwX3Z+rz9UA1kv68wWtw/mPtaszX94Pp ansible-generated on ansible_node1", "state": "present", "uid": 1000 } 11)ssh_key_comment参数(指定公钥中的注释信息) 为brian用户生成ssh密钥对,同时指定公钥中的注释信息为"www.brian.com",此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥 [root@ansible ~]# ansible all -m user -a "name=brian generate_ssh_key=yes ssh_key_comment='brian ssh-rsa'" 192.168.192.129 | CHANGED => { "append": false, "changed": true, "comment": "my name is zhujingzhi", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "shell": "/bin/bash", "ssh_fingerprint": "2048 SHA256:jDU5RLudX3WcDKDM6C/4yUO2K0sGgVI/g/EkIPcUfB4 brian ssh-rsa (RSA)", "ssh_key_file": "/home/brian/.ssh/id_rsa", "ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD1/JVoM14IRpTWxAbiOrvnvgxfTQQyErC3w4lfbATdldeaz2cZt1Ancq5xycyFMf++1UFNevPAKmlfTH37aFclVR2cH3jL/LZZefpjDvIeXb3GPYW6lDautrB/AuMgYwkhgfT8fj6/Zx+/Uq/PWCSXmkGUqT8bkM3hjF1kKc0HtUMljK3dLgJgluSifFSHSl8NO7575HxzY+KVXTzGFJmXwwRssHkoJq38kRqua2DMzBWjBd9LcYRSa2wHwfXK12fJVEMx6xIUqPljLFslDfL++NiDeMtf9dP9Dp7+/3/o2XW3CWanjTcDLLT8cbzKC4j2MvmTTIXmXG6SiQ98deNp brian ssh-rsa", "state": "present", "uid": 1000 } 12)ssh_key_passphrase参数(指定私钥的密码) 为brian用户生成ssh密钥对,同时指定私钥的密码为123456,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥 [root@ansible ~]# ansible all -m user -a "name=brian generate_ssh_key=yes ssh_key_passphrase='123456'" 192.168.192.129 | CHANGED => { "append": false, "changed": true, "comment": "my name is zhujingzhi", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "shell": "/bin/bash", "ssh_fingerprint": "2048 SHA256:kv2+zW6bqC8YAPazS7YvVtK4gz5uFCglfqmm9AoAfi0 ansible-generated on ansible_node1 (RSA)", "ssh_key_file": "/home/brian/.ssh/id_rsa", "ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6RAfCIyGz9kLF2KGBSOk6cQZb7O+tkOxwqJmxGE7bqKwgAprX917C7mj6ugIADeFeRtnP3/0oU0TLl4m0mFepVDEzGfZTRIR7Op1M6QCvveOJM/eP92vUv9TIKPY83iAaog7+l6/ZItBVWqC3OKmKHpuiZeH06dayq805lrYA+3jUagCKZSmevejyFTuVMYQJEZ77afWnJqtnCgUE6Mc/H5eD8ffPZgey3FEs+OTPA96N85gfZ6j+wT5AqPNPhmE7+I/Z6tZUnnPMGbHUhp53/TSMcIV5MZIPEcCpJq0KIFYR6xp2uW6aFhkQ58DhDwkHvFE34IVpnJMCoA8fesvn ansible-generated on ansible_node1", "state": "present", "uid": 1000 } 13)ssh_key_type参数(指定加密类型) 为brian用户生成ssh密钥对,同时指定密钥对的类型为dsa,当不显式指定密钥类型时,默认类型为rsa,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥 [root@ansible ~]# ansible all -m user -a "name=brian generate_ssh_key=yes ssh_key_type=dsa" 192.168.192.129 | CHANGED => { "append": false, "changed": true, "comment": "my name is zhujingzhi", "group": 1001, "home": "/home/brian", "move_home": false, "name": "brian", "shell": "/bin/bash", "ssh_fingerprint": "1024 SHA256:R5H7/BUdOIku2uWdp6UVSmibTqbq3mXCQKkPWhHWsAQ ansible-generated on ansible_node1 (DSA)", "ssh_key_file": "/home/brian/.ssh/id_dsa", "ssh_public_key": "ssh-dss AAAAB3NzaC1kc3MAAACBAM9iCp0cVUWqutnrlLWgFMms4cGaxR8bPgCa/Sec+OPbA3LjO/UwoYhyxCDu7eCCjUNcNwhEzssl3jtQRaCEzGV4rjO4mJaPkfCLpnDnYbKuWd9zio6vz4TU/qGJoG6Z5gpRqyv0TPKRw+FB10eL283/9/RJ49ZGWnf/v+hnF/DJAAAAFQDhz74tTItuAowX8VtzLTFKJXjhjwAAAIA8X7MxjCBvK38qICDCvjfsSU+WA5uWP1doyf7CQ/PEF3j0aPXe+rd4u1WRpNqkYxTQiZVr+uVQ4NqPAdvszkWpQ86tIW36rTXecLX6dbr59Gd/0uEpvIFagbPK0RPB+F8Z/LudQvcz+qqwAO+JMUR3FGBOT7nL9ZlPeocXhetpkQAAAIBUbmWo/IDFp3mVx7cYkqJH94RG1YJ/HE77SUFF/doAZmpvRVK4IttBojGDeEnPNsN49cHXVY/pGKquGoLMMKI3qJBuYDsd2YUSxRGRIdbDyRWMAPQkC6W+/tSFFSrrHndpUtzPtI4rNZX5w/wbcxxEMsPDsxYcQB1VRhIf2+YiWQ== ansible-generated on ansible_node1", "state": "present", "uid": 1000 }
authorized_key 模块
用途:添加或删除SSH授权密钥
使用方法:
[root@ansible ~]# ansible-doc -s authorized_key - name: Adds or removes an SSH authorized key authorized_key: comment: # 更改公钥上的注释。重写注释在从GitHub或GitLab中提取注释等情况下非常有用。如果没有指定注释,则保留现有注释 exclusive: # 是否移除authorized_keys文件中其它非指定key. follow: # 是否遵循目的机器中的文件系统链接(可选值为:yes|on) key: # (必选项)公钥路径,可以是本地⽂件,可以是url地址 key_options: # 附加到key中的字符串 不加参数会删除上次带参数时添加的字符串 manage_dir: # 是否创建或修改⽬标authorized_keys所在⽬录的所有者和权限。默认为yes 使用自定义的目标路径时,必选设置为no或者false. path: # authorized_keys所在的⽬录,默认为家⽬录下的.ssh⽬录中 state: # present/absent,是否将密钥添加到⽬标authorized_keys⽂件中,state=present表示添加;state=absent表示删除 user: # (必选项)添加到远程哪个⽤户下的authorized_keys⽂件 validate_certs: # 这只适用于使用https url作为密钥源的情况。如果设置为“no”,则不会验证SSL证书.
示例:
正在更新中。。。。。请等待
debug 模块
用途:⽤于输出⾃定义的信息,类似于echo、print等输出命令。ansible中的debug主要⽤于输出变量值、表达式值,以及⽤于when条件判断时。使⽤⽅式⾮常简单
使用方法:
[root@ansible ~]# ansible-doc -s debug - name: Print statements during execution debug: msg: # 输出⾃定义信息。如果省略,则输出普通字符. var: # 指定待调试的变量。只能指定变量,不能指定⾃定义信息,且变量不能加{{}}包围,⽽是直接的变量名. verbosity: # 控制debug运⾏的调试级别,有效值为⼀个数值N
示例:
1) msg参数(输出⾃定义信息) [root@ansible ~]# ansible all -m debug -a "msg='i want to print this messages'" 192.168.192.129 | SUCCESS => { "msg": "i want to print this messages" } 2) var参数(指定待调试的变量) [root@ansible ~]# ansible all -m debug -a "var=ansible_eth0.ipv4.address" 192.168.192.129 | SUCCESS => { "ansible_eth0.ipv4.address": "VARIABLE IS NOT DEFINED!" } 3) verbosity(控制debug运⾏的调试级别) [root@ansible ~]# ansible all -m debug -a "verbosity=3" 192.168.192.129 | SKIPPED
archive 模块
用途:创建一个或多个文件或树的压缩存档
使用方法:
[root@ansible ~]# ansible-doc -s archive - name: Creates a compressed archive of one or more files or trees archive: dest: # ⽬标归档⽂件名。除⾮path指定要压缩的是单⽂件,否则需要dest选项. exclude_path: # 要从归档文件中排除的文件的远程绝对路径 format: # 指定压缩格式,默认为gz格式. group: # ⽂件/⽬录的所属组. mode: # 设置⽂件/⽬录的的权限,⽀持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式 owner: # ⽂件/⽬录的所属者 path: # (必选项) 要压缩的⽂件,可以是绝对路径,也可以是glob统配的路径,还可以是⽂件列表 remove: # 压缩后删除源⽂件 unsafe_writes: # 是否以不安全的方式进行,可能导致数据损坏(unsafe_writes=yes|on).
示例:
正在更新中。。。。。请等待
unarchive 模块
用途:复制归档压缩文件后解压
使用方法:
[root@ansible ~]# ansible-doc -s unarchive - name: Unpacks an archive after (optionally) copying it from the local machine. unarchive: creates: # 如果指定的⽂件存在则不执⾏该任务。可⽤于实现幂等性 decrypt: # 此选项使用vault控制源文件的自动解密 dest: # (必选项) 远程机器上需要被解包的归档⽂件,要求是绝对路径 exclude: # 列出解包过程中想要忽略的⽬录和⽂件 extra_opts: # 通过传入数组指定其他选项 group: # ⽂件/⽬录的所属组. keep_newer: # 在解包过程中,如果⽬标路径中和包中有同名⽂件,且⽐包中的⽂件更新,则保留新的⽂件 list_files: # 设置为true时,将返回归档⽂件中的⽂件列表 mode: # 设置⽂件/⽬录的的权限,⽀持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式 owner: # ⽂件/⽬录的所属者 remote_src: # 设置为yes表⽰远程主机上已有⽬标归档⽂件,即不再从本地复制归档⽂件到远端,直接在远端解包,默认no. src: # (必选项)如果remote_src=no,将复制本地归档⽂件到远端,可相对路径也可绝对路径.如果remote_src=yes, 将解包远程已存在的归档⽂件,如果remote_src=yes且src中包含了"://",将指挥远程主机从url中下载⽂件并解包 unsafe_writes: # 是否以不安全的方式进行,可能导致数据损坏(unsafe_writes=yes|on) validate_certs: # 这只适用于使用https url作为密钥源的情况。如果设置为“no”,则不会验证SSL证书
示例:
正在更新中。。。。。请等待
get_url 模块
用途:类似于wget和curl的功能,可以进行下载以及webapi交互等操作
使用方法:
[root@ansible ~]# ansible-doc -s get_url - name: Downloads files from HTTP, HTTPS, or FTP to node get_url: backup: # 下载⽂件时同时创建⼀个名称中包含时间戳的备份⽂件 dest: # (必选项)⽂件保存路径,必须为绝对路径。 # 如果dest是⼀个⽬录,则使⽤url的base name作为⽂件名 # 如果dest是⼀个⽬录,则'force'选项不⽣效 # 如果dest是⼀个⽬录,则总是会下载⽬标⽂件,但只在已存在的⽂件变化了才会替换旧⽂件 force: # 如果设置为yes,且dest不是⼀个⽬录时,则总是会下载⽂件,但只在已存在的⽂件变化了才会替换旧⽂件,如果设置为no(默认),则只会在⽬录路径下不存在该⽂件时才会进⾏下载 force_basic_auth: # 此选项在初始请求时强制基本身份验证标头. group: # ⽂件/⽬录的所属组. headers: # 以字典格式向请求添加自定义HTTP头(key=value格式) mode: # 设置⽂件/⽬录的的权限,⽀持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式. others: # 模块接受的所有参数 owner: # ⽂件/⽬录的所属者 sha256sum: # 如果将SHA-256校验和传递给该参数,则在下载后计算目标文件摘要,以确保其完整性并验证传输成功。这个选项不赞成使用。使用“校验和”代替. timeout: # 请求url时的超时时间,默认10秒钟. tmp_dest: # 下载时临时存放⽬录,在任务执⾏完成前会删除下载的临时⽂件 unsafe_writes: # 是否以不安全的方式进行,可能导致数据损坏(unsafe_writes=yes|on) url: # (required) 要下载的url路径,(http|https|ftp)://[user[:pass]]@host.domain[:port]/path # 还⽀持file格式的路径,实现复制功能。file:///path/to/file url_password: # 用于HTTP基本身份验证的密码。如果没有指定“url_username”参数,则不会使用“url_password”参数 url_username: # 用于HTTP基本身份验证的用户名。对于允许空密码的站点,可以在不使用“url_password”的情况下使用此参数 use_proxy: # 如果no,它将不使用代理,即使在目标主机上的环境变量中定义了代理. validate_certs: # 如果no,SSL证书将不被验证。这应该只在使用自签名证书的个人控制站点上使用
示例:
正在更新中。。。。。请等待
wait_for 模块
用途:⽤于判断任务在满⾜什么条件的情况下会继续。主要⽤来判断端⼝是否开启、⽂件是否存在、⽂件中是否存在某些字符串
使用方法:
[root@ansible ~]# ansible-doc -s wait_for - name: Waits for a condition before continuing wait_for: active_connection_states: # 被算作活动连接的TCP连接状态列表. connect_timeout: # 在关闭和重试之前等待连接发生的最大秒数. delay: # 在检查操作进⾏之前等待的秒数 exclude_hosts: # 在寻找处于“耗尽”状态的活动TCP连接时要忽略的主机或ip的列表 host: # 等待这个主机处于启动状态,默认为127.0.0.1. msg: # 这将覆盖来自无法满足所需条件的故障的正常错误消息. path: # 这个⽂件是否已经存在 port: # 等待这个端⼝已经开放. search_regex: # 在⽂件中进⾏正则匹配 sleep: # 两次检查之间sleep的秒数,默认1秒 state: # present/started/stopped/absent/drained.默认started # 当检查的是⼀个端⼝时: # started:保证端⼝是开放的 # stopped:保证端⼝是关闭的 # 当检查的是⼀个⽂件时: # present/started:在检查到⽂件存在才会继续 # absent:检查到⽂件被移除后才会继续 timeout: # 检查的等待超时时间(秒数,默认300).
示例:
正在更新中。。。。。请等待
group 模块
用途:添加或删除组
使用方法:
[root@ansible ~]# ansible-doc -s group - name: Add or remove groups group: gid: # 用于指定组的gid name: # (必选项) 用于指定要操作的组名称 state: # 用于指定组的状态,两个值可选,present,absent,默认为 present,设置为absent 表示删除组。 system: # 如果是yes,表示指定的组是系统组
示例:
1) name参数(创建组) 创建kaifa组 [root@ansible ~]# ansible all -m group -a "name=kaifa" 192.168.192.129 | CHANGED => { "changed": true, "gid": 1002, "name": "kaifa", "state": "present", "system": false } 2) state=absent参数(删除组) 删除成功的前提是不能有用户把被删除的组当成主组 [root@ansible ~]# ansible all -m group -a "name=kaifa state=absent" 192.168.192.129 | CHANGED => { "changed": true, "name": "kaifa", "state": "absent" } 3) gid参数(指定组的gid) [root@ansible ~]# ansible all -m group -a "name=kaifa gid=6666" 192.168.192.129 | CHANGED => { "changed": true, "gid": 6666, "name": "kaifa", "state": "present", "system": false } 4) system参数(将组设置成为系统组) [root@ansible ~]# ansible all -m group -a "name=admin system=yes" 192.168.192.129 | CHANGED => { "changed": true, "gid": 992, "name": "admin", "state": "present", "system": true }