一、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