Ansible--常用模块使用(2)

时间:2020-12-25 14:42:32

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
}