一、user 模块

-
在
node1上创建一个名为webadmin的用户。
ansible node1 -m user -a "name=webadmin state=present"-
-m user: 使用user模块-m user: 使用 user 模块 -
-a: 指定模块参数 -
name=webadmin: 要创建的用户名 -
state=present: 确保用户存在(创建用户)
-
-
在
node2上创建一个名为monitor的系统用户 (system: yes)。
ansible node2 -m user -a "name=monitor system=yes state=present"system=yes: 创建系统用户(UID通常小于1000)
-
在
node1上删除用户testuser,并移除其家目录。
ansible node1 -m user -a "name=testuser state=absent remove=yes"-
state=absent: 确保用户不存在(删除用户) -
remove=yes: 删除用户时同时删除家目录和邮件池
-
-
在
node1上创建一个名为developers的组,并创建一个用户coder使其主要组为developers。
ansible node1 -m group -a "name=developers state=present"
ansible node1 -m user -a "name=coder group=developers state=present"-
第一个命令创建组
-
第二个命令创建用户并指定主要组
-
-
在
node3上将用户operator的登录 shell 改为/sbin/nologin。
ansible node3 -m user -a "name=operator shell=/sbin/nologin"shell: 设置用户的登录shell
-
在
node2上为用户admin添加一个附加组wheel,并保留其原有其他组。
ansible node2 -m user -a "name=admin groups=wheel append=yes"-
groups=wheel: 指定用户所属的附加组 -
append=yes: 将新组添加到用户现有组中,而不是替换
-
-
在
node3上创建一个用户appuser,并设置其 UID 为3000。
ansible node3 -m user -a "name=appuser uid=3000 state=present"uid=3000: 指定用户的UID
二、shell 和 command 模块
-
在
node1上使用command模块执行whoami命令。
ansible node1 -m command -a "whoami"-
-m command: 使用command模块(执行简单命令,不支持shell特性) -
-a "whoami": 执行的命令
-
-
在
node2上使用shell模块统计/etc/passwd文件的行数。
ansible node2 -m shell -a "wc -l /etc/passwd"-
-m shell: 使用shell模块(支持管道、重定向等shell特性) -
-a "wc -l /etc/passwd": 执行的shell命令
-
-
在
node3上使用shell模块在/tmp目录下创建一个名为my project的目录(注意空格)。
ansible node3 -m shell -a "mkdir '/tmp/my project'" -
使用引号确保包含空格的路径被正确解析在
node1上使用command模块执行cat /etc/redhat-release命令。
ansible node1 -m command -a "cat /etc/redhat-release"- command模块适合执行不需要shell特性的简单命令
-
在
node2上使用shell模块,如果文件/tmp/junk.txt存在则删除它,并确保命令失败也被忽略。
ansible node2 -m shell -a "rm -f /tmp/junk.txt"-f参数使rm命令在文件不存在时不报错
-
在
node3上使用shell模块将当前日期和时间输出到/tmp/date.txt文件中。
ansible node3 -m shell -a "date > /tmp/date.txt"- 使用重定向操作符将输出保存到文件
-
在
node1上使用raw模块执行uptime命令(模拟没有Python环境)。
ansible node1 -m raw -a "uptime"-m raw: 使用raw模块(直接在SSH连接上执行命令,不依赖Python)
三、copy 模块


-
将控制节点上的文件
/home/student/app.conf复制到node1的/etc/目录下。
ansible node1 -m copy -a "src=/home/student/app.conf dest=/etc/app.conf"-
-m copy: 使用copy模块-m copy: 使用 copy 模块 -
src: 源文件路径(在控制节点上) -
dest: 目标路径(在远程节点上)
-
-
在
node2上创建文件/tmp/greeting.txt,内容为Hello from Ansible。
ansible node2 -m copy -a "content='Hello from Ansible' dest=/tmp/greeting.txt"content: 直接指定文件内容(而不是从文件复制)
-
将控制节点
files/目录下的script.sh复制到node3的/usr/local/bin,并设置其权限为0755。
ansible node3 -m copy -a "src=files/script.sh dest=/usr/local/bin/script.sh mode=0755"mode=0755: 设置文件权限(八进制格式)
-
将文件
service.conf复制到node1的/etc/目录,并设置其所有者(owner)为root,所属组(group)为wheel。
ansible node1 -m copy -a "src=files/service.conf dest=/etc/service.conf owner=root group=wheel"-
owner: 设置文件所有者 -
group: 设置文件所属组
-
-
在将新文件
nginx.conf复制到node2的/etc/nginx/目录覆盖原文件之前,对原文件进行备份。
ansible node2 -m copy -a "src=files/nginx.conf dest=/etc/nginx/nginx.conf backup=yes"backup=yes: 在覆盖前创建备份文件(通常以原始文件名加时间戳)
-
使用
validate选项在复制sshd_config文件到node3的/etc/ssh/后,执行sshd -t验证配置是否正确。
ansible node3 -m copy -a "src=files/sshd_config dest=/etc/ssh/sshd_config validate='sshd -t -f %s'"validate: 复制后执行验证命令(%s会被替换为临时文件路径)
-
将本地目录
web_content递归地复制到node1的/var/www/html/目录下。
ansible node1 -m copy -a "src=web_content/ dest=/var/www/html/ directory_mode=yes"-
源路径以斜杠结尾表示复制目录内容
-
directory_mode=yes: 递归设置目录权限
-
四、file 模块

-
在
node1上创建目录/opt/myapp。
ansible node1 -m file -a "path=/opt/myapp state=directory"-
-m file: 使用file模块-m file: 使用 file 模块 -
path: 文件/目录路径 -
state=directory: 创建目录
-
-
在
node2上创建空文件/tmp/test.file。
ansible node2 -m file -a "path=/tmp/test.file state=touch"state=touch: 创建空文件(类似touch命令)
-
在
node3上删除文件/tmp/junk.txt。
ansible node3 -m file -a "path=/tmp/junk.txt state=absent"state=absent: 确保文件/目录不存在(删除)
-
在
node1上创建符号链接/etc/motd指向/etc/issue。
ansible node1 -m file -a "src=/etc/issue dest=/etc/motd state=link"-
state=link: 创建符号链接 -
src: 源文件路径 -
dest: 链接文件路径
-
-
在
node2上修改文件/etc/hosts的权限为 644。
ansible node2 -m file -a "path=/etc/hosts mode=0644"mode: 设置文件权限(八进制格式)
-
在
node3上修改目录/var/log/myapp的所有者为appuser,所属组为appgroup。
ansible node3 -m file -a "path=/var/log/myapp owner=appuser group=appgroup"-
owner: 设置所有者 -
group: 设置所属组
-
-
在
node1上递归修改目录/opt/data及其所有内容的权限为 755。
ansible node1 -m file -a "path=/opt/data mode=0755 recurse=yes"recurse=yes: 递归修改目录及其内容
-
在
node2上创建硬链接/usr/bin/python3-link指向/usr/bin/python3。
ansible node2 -m file -a "src=/usr/bin/python3 dest=/usr/bin/python3-link state=hard"state=hard: 创建硬链接
-
在
node3上设置文件/etc/crontab的 SELinux 上下文为system_u:object_r:system_cron_spool_t:s0。
ansible node3 -m file -a "path=/etc/crontab setype=system_cron_spool_t"setype: 设置SELinux类型(需要安装libselinux-python)
setype: 设置 SELinux 类型(需要安装 libselinux-python)
-
在
node1上修改目录/srv/www及其所有子目录的权限,但只修改目录不修改文件。
ansible node1 -m file -a "path=/srv/www mode=0755 recurse=yes directory_mode=yes"directory_mode=yes: 仅递归修改目录权限(不修改文件)
五,yum模块

[student@master ansible]$ ansible all -m yum_repository -a 'file=server name=BASE description="software base" baseurl=http://ansible.example.com/rhel9/BaseOS enabled=yes gpgcheck=yes gpgkey=http://ansible.example.com/rhel9/RPM-GPG-KEY-redhat-release'
[student@master ansible]$ ansible all -m yum_repository -a 'file=server name=STREAM description="software stream" baseurl=http://ansible.example.com/rhel9/AppStream enabled=yes gpgcheck=yes gpgkey=http://ansible.example.com/rhel9/RPM-GPG-KEY-redhat-release'
-
在
node1上安装nginx软件包。
ansible node1 -m yum -a "name=nginx state=present"-
-m yum: 使用yum模块-m yum: 使用 yum 模块 -
name: 软件包名称 -
state=present: 确保软件包已安装
-
-
在
node2上安装多个软件包:vim,wget,curl。
ansible node2 -m yum -a "name=vim,wget,curl state=present"- 可以指定多个软件包,用逗号分隔
-
在
node3上卸载httpd软件包。
ansible node3 -m yum -a "name=httpd state=absent"state=absent: 确保软件包未安装(卸载)
-
在
node1上更新所有已安装的软件包到最新版本。
ansible node1 -m yum -a "name=* state=latest"-
state=latest: 确保软件包是最新版本 -
name=*: 所有软件包
-
-
在
node2上安装特定版本的nginx软件包(例如:1.14.1)。
ansible node2 -m yum -a "name=nginx-1.14.1 state=present"- 指定完整包名和版本
-
在
node3上从本地文件安装 RPM 包/tmp/mypackage.rpm。
ansible node3 -m yum -a "name=/tmp/mypackage.rpm state=present"- 使用本地文件路径作为包名
-
在
node1上安装@development软件包组。
ansible node1 -m yum -a "name=@development state=present"- 使用@前缀指定软件包组
-
在
node2上禁用 GPG 检查安装一个软件包。
ansible node2 -m yum -a "name=mypackage state=present disable_gpg_check=yes"disable_gpg_check=yes: 禁用GPG检查
-
在
node3上仅下载nginx软件包而不安装。
ansible node3 -m yum -a "name=nginx state=present download_only=yes"download_only=yes: 仅下载不安装
七、service 模块
-
在
node1上启动nginx服务。
ansible node1 -m service -a "name=nginx state=started"-
-m service: 使用service模块 -
name: 服务名称 -
state=started: 确保服务正在运行
-
-
在
node2上停止httpd服务。
ansible node2 -m service -a "name=httpd state=stopped"state=stopped: 确保服务已停止
-
在
node3上重启sshd服务。
ansible node3 -m service -a "name=sshd state=restarted"state=restarted: 重启服务
-
在
node1上重新加载nginx服务的配置(不中断服务)。
ansible node1 -m service -a "name=nginx state=reloaded"state=reloaded: 重新加载服务配置
-
在
node2上启用httpd服务开机自启动。
ansible node2 -m service -a "name=httpd enabled=yes"enabled=yes: 启用服务开机自启动
-
在
node3上禁用firewalld服务开机自启动。
ansible node3 -m service -a "name=firewalld enabled=no"enabled=no: 禁用服务开机自启动
-
在
node1上检查nginx服务的当前状态。
ansible node1 -m service -a "name=nginx"- 不指定state参数,只检查状态
八、fetch 模块
-
将
node1上的/etc/fstab文件拉取到控制节点的/tmp目录,并保持主机目录结构。
ansible node1 -m fetch -a "src=/etc/fstab dest=/tmp"-
-m fetch: 使用fetch模块-m fetch: 使用 fetch 模块 -
src: 远程节点上的源文件路径 -
dest: 控制节点上存储的目录,会自动创建以主机名命名的子目录
-
-
将
node2上的/etc/hosts文件拉取到控制节点的/tmp目录,并保持主机目录结构。
ansible node2 -m fetch -a "src=/etc/hosts dest=/tmp"
-
将
node1上的/etc/fstab文件拉取到控制节点的/tmp目录,并扁平化存储(不创建主机目录结构),保存为/tmp/fstab-node1。
ansible node1 -m fetch -a "src=/etc/fstab dest=/tmp/fstab-node1 flat=yes"flat=yes: 不创建主机目录结构,直接存储到dest指定的路径(如果多个主机,会覆盖,所以一般用于单台主机)
-
将
node2上的/etc/yum.conf文件拉取到控制节点的/tmp目录,并扁平化存储,保存为/tmp/yum.conf-node2。
ansible node2 -m fetch -a "src=/etc/yum.conf dest=/tmp/yum.conf-node2 flat=yes"
-
将
node1上的/etc/ssh/sshd_config文件拉取到控制节点的/tmp目录,并验证文件MD5值。
ansible node1 -m fetch -a "src=/etc/ssh/sshd_config dest=/tmp validate_checksum=yes"validate_checksum=yes: 拉取后验证源文件和目标文件的MD5校验和
-
将
node2上的/boot/grub2/grub.cfg文件拉取到控制节点的/tmp目录,并保持文件权限。
ansible node2 -m fetch -a "src=/boot/grub2/grub.cfg dest=/tmp"-
默认情况下,fetch模块会尝试保持原始权限
-
将
node1上的/etc/resolv.conf文件拉取到控制节点的/tmp目录,如果目标文件已存在则覆盖。
ansible node1 -m fetch -a "src=/etc/resolv.conf dest=/tmp force=yes"force=yes: 覆盖已存在的文件(默认是no,即如果文件已存在则跳过)
-
九、firewalld 模块
-
在
node1上永久开放 HTTP 服务(80端口)。
ansible node1 -m firewalld -a "service=http permanent=yes state=enabled"-
-m firewalld: 使用firewalld模块-m firewalld: 使用 firewalld 模块 -
service: 服务名称(预定义的,如http、https等) -
permanent=yes: 永久生效(重启后仍有效) -
state=enabled: 启用规则
-
-
在
node2上永久开放 HTTPS 服务(443端口)。
ansible node2 -m firewalld -a "service=https permanent=yes state=enabled" -
在
node3上永久开放 8080/tcp 端口。
ansible node3 -m firewalld -a "port=8080/tcp permanent=yes state=enabled"port: 直接指定端口和协议
-
在
node1上永久移除 HTTP 服务(80端口)的放行规则。
ansible node1 -m firewalld -a "service=http permanent=yes state=disabled" -
在
node2上临时开放 22/tcp 端口(重启firewalld后失效)。
ansible node2 -m firewalld -a "port=22/tcp state=enabled"- 不设置
permanent或设置为no,则临时生效
- 不设置
-
在
node3上将源IP 192.168.1.0/24 加入永久信任区域(zone)。
ansible node3 -m firewalld -a "source=192.168.1.0/24 zone=trusted permanent=yes state=enabled"-
source: 指定源IP或网段 -
zone: 指定区域(如trusted、public等)
zone: 指定区域(如可信、公共等)
-
-
在
node1上设置默认区域为 dmz。
ansible node1 -m firewalld -a "zone=dmz state=present permanent=yes default_zone=yes"default_zone=yes: 设置为默认区域
-
在
node2上查询 public 区域当前设置。
ansible node2 -m firewalld -a "zone=public state=info"state=info: 查询信息
-
在
node3上永久添加一个富规则,允许来自 10.0.0.1 的所有流量。
ansible node3 -m firewalld -a "rich_rule='rule family=ipv4 source address=10.0.0.1 accept' permanent=yes state=enabled"rich_rule: 富规则字符串
-
在
node1上重新加载防火墙规则(不中断现有连接)。
ansible node1 -m firewalld -a "state=reloaded"state=reloaded: 重新加载防火墙规则
十、replace 模块
-
-m replace: 使用replace模块-m replace: 使用 replace 模块 -
path: 文件路径 -
regexp: 正则表达式匹配要替换的文本 -
replace: 替换后的文本
-
在
node2上的/etc/nginx/nginx.conf中,将worker_processes 1;替换为worker_processes 2;。
ansible node2 -m replace -a "path=/etc/nginx/nginx.conf regexp='worker_processes 1;' replace='worker_processes 2;'" -
在
node3上的/etc/sysconfig/selinux中,将SELINUX=enforcing替换为SELINUX=disabled。
ansible node3 -m replace -a "path=/etc/sysconfig/selinux regexp='SELINUX=enforcing' replace='SELINUX=disabled'"
十一、parted 模块
-
在
node1的/dev/sdb磁盘上创建一个新的 GPT 分区表。
ansible node1 -m parted -a "device=/dev/sdb label=gpt"-
-m parted: 使用parted模块-m parted: 使用 parted 模块 -
device: 磁盘设备 -
label: 分区表类型(如gpt、msdos)
-
-
在
node2的/dev/sdc磁盘上创建一个大小为 2GB 的主分区。
ansible node2 -m parted -a "device=/dev/sdc number=1 part_type=primary size=2GB"-
number: 分区编号 -
part_type: 分区类型(primary、extended、logical)
part_type: 分区类型(主分区、扩展分区、逻辑分区) -
size: 分区大小
-
-
在
node3的/dev/sdd磁盘上创建一个占据所有剩余空间的分区。
ansible node3 -m parted -a "device=/dev/sdd number=1 part_type=primary state=present"- 不指定size则使用所有剩余空间
-
在
node1的/dev/sdb磁盘上删除第 1 个分区。
ansible node1 -m parted -a "device=/dev/sdb number=1 state=absent"state=absent: 删除分区
-
在
node2的/dev/sdc磁盘上创建一个大小为 1GB 的交换分区(文件系统类型为linux-swap)。
ansible node2 -m parted -a "device=/dev/sdc number=2 part_type=primary size=1GB fs_type=linux-swap"fs_type: 设置文件系统类型(在parted中设置标志)
-
在
node3的/dev/sdd磁盘上将分区表从 MBR 改为 GPT。
ansible node3 -m parted -a "device=/dev/sdd label=gpt"- 注意:这会破坏现有分区表
-
在
node1的/dev/sdb磁盘上创建一个起始于 1GB,结束于 3GB 的分区。
ansible node1 -m parted -a "device=/dev/sdb number=1 part_type=primary start=1GB end=3GB"-
start: 分区起始位置 -
end: 分区结束位置
-
-
在
node2的/dev/sdc磁盘上调整第 1 个分区的大小,将其扩大到 3GB。
ansible node2 -m parted -a "device=/dev/sdc number=1 part_end=3GB"part_end: 调整分区的结束位置(扩大分区)
-
在
node3的/dev/sdd磁盘上设置第 1 个分区的标志为boot。
ansible node3 -m parted -a "device=/dev/sdd number=1 flags=[boot]"flags: 设置分区标志
-
在
node1的/dev/sdb磁盘上列出所有分区的信息。
ansible node1 -m parted -a "device=/dev/sdb unit=MB print"-
print: 打印分区信息 -
unit: 显示单位(如MB、GB)
-
十二、mount 模块
-
在
node1上挂载/dev/sdb1到/mnt/data。
ansible node1 -m mount -a "path=/mnt/data src=/dev/sdb1 fstype=ext4 state=present"-
-m mount: 使用mount模块-m mount: 使用 mount 模块 -
path: 挂载点路径 -
src: 要挂载的设备或文件系统 -
fstype: 文件系统类型 -
state=present: 确保挂载点存在(并挂载)
-
-
在
node2上卸载/mnt/temp挂载点。
ansible node2 -m mount -a "path=/mnt/temp state=absent"state=absent: 卸载并删除挂载点
-
在
node3上永久挂载/dev/sdc1到/opt/app,文件系统类型为 xfs。
ansible node3 -m mount -a "path=/opt/app src=/dev/sdc1 fstype=xfs state=mounted"state=mounted: 立即挂载并写入fstab
-
在
node1上永久挂载 NFS 共享192.168.1.100:/share到/mnt/nfs。
ansible node1 -m mount -a "path=/mnt/nfs src=192.168.1.100:/share fstype=nfs opts=defaults state=mounted"opts: 挂载选项
-
在
node2上重新挂载/mnt/data为只读。
ansible node2 -m mount -a "path=/mnt/data opts=ro state=remounted"state=remounted: 重新挂载
-
在
node3上确保/mnt/backup在 fstab 中有配置但当前未挂载。
ansible node3 -m mount -a "path=/mnt/backup src=/dev/sdd1 fstype=ext4 state=unmounted"state=unmounted: 确保未挂载,但fstab中有配置
-
在
node1上从 fstab 中移除/mnt/old的配置,并确保未挂载。
ansible node1 -m mount -a "path=/mnt/old state=absent"