一、user模块

该模块主要是用来管理用户账号

`comment`        # 用户的描述信息
`createhome`    # 是否创建家目录
`group`             # 指定基本组
`groups`                 # 指定用户的附加组,新加时会覆盖原有的附加组,默认append=no
`append`                # 配合groups使用,在原有附加组的基础上追加组,append=yes
`home`              # 指定用户家目录
`move_home`      # 如果设置为home=时, 试图将用户主目录移动到指定的目录
`name`              # 指定用户名
`non_unique`    # 该选项允许改变非唯一的用户ID值
`password`        # 指定用户密码
`remove`           # 删除用户时,默认是不删除家目录,remove=no;remove=yes表示删除用户家目录
`shell`                   # 指定默认shell   
`state`                # 设置帐号状态,不指定为创建,指定值为absent表示删除
`system`               # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
`uid`                   # 指定用户的uid
`expires`                # 指定用户的的过期时间,相当于设置/etc/shadow文件中的第8列

举例:

创建tom用户,若已存在,不进行任何操作:
# ansible web1 -m user -a 'name=tom'

删除tom用户,但不删除此用户的家目录:
# ansible web1 -m user -a 'name=tom state=absent'

删除tom用户,且删除此用户的家目录:
# ansible web1 -m user -a 'name=test state=absent remove=yes'

指定所有服务器中tom用户的基本组为admin(需提前存在),不指定时默认与用户名一样:
# ansible web1 -m user -a 'name=tom group=admin'

指定所有服务器中tom用户的附加组为wsl和admin:
# ansible web1 -m user -a 'name=tom groups=wsl,admin append=yes'

指定所有服务器中tom用户过期时间是2020-05-20:
# date -d 2024-07-07 +%s #获取对应日期的unix时间戳
1720281600
# ansible web1 -m user -a 'name=tom expires=1720281600'

修改所有服务器中tom用户的密码为'123456'    (但此方法依旧会暴露密码):
# python3
>>> import crypt
>>> crypt.crypt('123456')
'$6$ICvmykGtq/aumibg$htcP4cgSkbSeaAb/xtrIibW/UBuSAq2bDx72ld/B2oBIajrMXwl.t2UfZJ/HhGvgTmLCnPN9wObe/4pdngXIp1'
>>> exit()
# ansible all -m user -a 'name=test password="$6$ICvmykGtq/aumibg$htcP4cgSkbSeaAb/xtrIibW/UBuSAq2bDx72ld/B2oBIajrMXwl.t2UfZJ/HhGvgTmLCnPN9wObe/4pdngXIp1"'

扩展:

1、raw模块可以直接设置密码:
# ansible web1 -m raw -a 'echo "2000" | passwd --stdin www'

2、用python脚本加密的方式:
安装加密函数库-passlib
# pip3 install passlib

# python3 -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password: 
$6$G4T5vgTMh1ok9m40$PXIeO46y3OTE9dN50Bn5QvM1m5eR3TztrA7OXyZPemo/YEiZsYukZpDfO3in0eZBDkkGvXdvz9TnpCdImJQ3U/                      //获取加密密码

为用户设置密码
ansible web1 -m user -a "name=tom password=\$6\$G4T5vgTMh1ok9m40\$PXIeO46y3OTE9dN50Bn5QvM1m5eR3TztrA7OXyZPemo/YEiZsYukZpDfO3in0eZBDkkGvXdvz9TnpCdImJQ3U/"

注意:$需要转义成\$,才可以正常设置和登录

3、编写剧本调用密码文件
# vim /tmp/user.yaml
---
 - hosts: web1
   remote_user: root
   vars_files:
   - /tmp/local.yaml
   tasks:
   - name: add users
     user:
       name: w1
       password: "{{ pw_user1 | password_hash('sha512') }}"

# cat /tmp/local.yaml 
---
pw_user1: "123456"

# ansible-playbook /tmp/user.yaml

4、创建用户相关的默认设置
# vim /etc/login.defs

单独修改用户设置有效期可以使用命令chage

二、group模块

该模块主要用于添加或删除组

`gid=`      #设置组的GID号
`name=`  #指定组的名称
`state=`   #指定组的状态,默认为创建,设置值为`absent`为删除
`system=`  #设置值为`yes`,表示创建为系统组

举例:

创建普通组:
# ansible web1 -m group -a 'name=jerry gid=1222'
创建系统组:
# ansible web1 -m group -a 'name=zhangsan system=yes'

三、script模块

该模块用于将本机的脚本在被管理端的机器上运行
该模块直接指定脚本的路径即可,我们通过例子来看一看到底如何使用的:

首先,我们写一个脚本,并给其加上执行权限:
# vim /tmp/a.sh
#! /bin/bash
 date > /tmp/a.txt
df -Th >> /tmp/a.txt
echo "================================" >> /tmp/a.txt

# chmod +x /tmp/a.txt

举例:

# ansible web1 -m script -a '/tmp/a.sh'

四、setup 模块

该模块主要用于收集信息,是通过调用facts组件来实现的

facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。

filter     #过滤关键字
--tree   #将所有主机的输出信息保存到/tmp/目录下

举例:

列出被控端所有信息:
# ansible all -m setup

列出内存信息并存储到/tmp/setup目录下:
# ansible all -m setup -a 'filter=ansible_memory_mb' --tree /tmp/setup

支持正则表达式:
ansible all -m setup -a 'filter=*mem*'

常用关键字:
ansible_all_ipv4_addresses             #所有机器的ipv4地址
ansible_all_ipv6_addresses             #所有机器的ipv6地址#系统时间
ansible_ens160['ipv4']['address']    #仅显示ipv4的信息 ---> ens160 的ip地址
ansible_date_time                          #系统时间                                   
ansible_kernel                                #内核版本
ansible_default_ipv4                      #默认ipv4地址 
ansible_default_ipv6                      #默认ipv6地址
ansible_hostname                          #主机名
ansible_pkg_mgr                            #包管理器
ansible_devices                              #仅显示磁盘设备信息
ansible_distribution                       #显示是什么系统,例:centos,suse等
ansible_distribution_version          #仅显示系统版本
ansible_machine                            #显示系统类型,例:32位,还是64位
ansible_eth0                                  #仅显示eth0的信息
ansible_fqdn                                  #完全域名解析
ansible_kernel                               #仅显示内核版本
ansible_lvm                                   # 显示lvm相关信息
ansible_memtotal_mb                  #显示系统总内存
ansible_memfree_mb                   #显示可用系统内存
ansible_memory_mb                    #详细显示内存情况
ansible_swaptotal_mb                  #显示总的swap内存
ansible_swapfree_mb                   #显示swap内存的可用内存
ansible_mounts                            #显示系统磁盘挂载情况
ansible_processor                         #显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus              #显示cpu个数(只显示总的个数)
ansible_python_version                #显示python版本cd /tmp

可以利用被控端的信息作为变量:
# vim /tmp/test.j2
hostname:{{ ansible_hostname }}
IP: {{ ansible_ens160['ipv4']['address'] }}

# vim /tmp/test.yaml
---
 - hosts: all
   remote_user: root
   tasks:
   - name: test
     template: src=/tmp/test.j2 dest=/tmp/test

# ansible-playbook test.yaml

五、get_url模块

下载包使用
用于将文件或软件从http、https或ftp下载到本地节点上

dest                       #指定将文件下载的绝对路径---必须
url                         #文件的下载地址(网址)---必须
url_username        #用于http基本认证的用户名
url_password        #用于http基本认证的密码
validate_certs        #如果否,SSL证书将不会验证。这只应在使用自签名证书的个人控制站点上使用
owner                   #指定属主
group                   #指定属组
mode                   #指定权限

举例:

# ansible web1 -m get_url -a "url=https://mirrors.aliyun.com/epel/8/Everything/x86_64/Packages/h/htop-3.2.1-1.el8.x86_64.rpm dest=/usr/local/src"

六、stat模块

用途:检查文件或文件系统的状态

path:文件/对象的完整路径(必须)

常用的返回值判断:
exists: 判断是否存在
------------
register:file_result                 # 关键字可以将某个 task 任务结果存储至变量中,最后使用 debug模块 输出变量内容
connection: local                     # 该命令或者该task在主控端执行

举例:

# vim /tmp/a.yaml
---
- hosts: web1
   remote_user: root
   tasks:
    - name: stat test
      stat: path=/tmp/a.sh
      connection: local
      register: file_result

    - name: get stat test
      debug: msg={{ file_result.stat.exists }}

# ansible-playbook /tmp/a.yaml

 

扩展:

单个文件:
# vim /tmp/when5.yaml

---
 - hosts: web1
   tasks:
    - name: 查看文件是否存在
      stat:
        path: /opt/when.txt
      register: aa_file

#  connection: local 写上这个代表检查主控端
    - name: 输出结果
      debug:
        msg: "/opt/when.txt文件存在"
      when: aa_file.stat.exists
    - name: 输出结果
      debug:
        msg: "/opt/when.txt文件不存在"
      when: not aa_file.stat.exists


检查多个文件是否存在:
# vim /tmp/when.yaml
---
 - hosts: web1
   vars:
     path:
       - /opt/a.txt
       - /opt/b.txt
       - /opt/ssss.txt
   tasks:
   - name: 检查文件是否存在
     stat:
       path: "{{ item }}"
     loop: "{{ path }}"
     register: file_status
   - debug:
       msg: "{{ item.item }}文件存在"
     loop: "{{ file_status.results }}"
     when: item.stat.exists