一、Ansible介绍
Ansible 是一个开源的 IT 自动化工具,主要用于配置管理、应用部署、任务编排和基础设施自动化。它由 Red Hat 维护,采用 无代理(Agentless)架构,通过 SSH(Linux/Unix)或 WinRM(Windows)连接受管主机执行任务。
核心特点
- 无代理:受管节点无需安装 Ansible 客户端,只需 SSH/WinRM 和 Python 等基础环境。
- YAML 描述:使用易读的 YAML 编写 Playbook。
- 幂等性:大多数模块可重复执行,结果一致,避免重复操作导致状态漂移。
- Push 模式:控制节点主动推送任务到目标主机。
- 模块化:通过大量内置模块和 Collection 扩展能力。
- 声明式与过程式结合:Playbook 描述目标状态,也可按任务顺序编排。
二、Ansible安装
📦 一、 标准在线安装流程(适用于有公网环境)
如果你在阿里云、腾讯云或者能连外网的虚拟机里,按以下步骤操作:
- 安装 EPEL 扩展源
Ansible 不在系统的默认基础源里,必须先装 EPEL(Extra Packages for Enterprise Linux)。
sudo dnf install epel-release -y
- (可选)替换国内镜像源加速 这就是你之前遇到下载卡在 6KB/s 的解决方式。如果不换源,下载速度可能极慢。
sudo sed -i 's|^metalink=|#metalink=|g' /etc/yum.repos.d/epel.repo
sudo sed -i 's|^#baseurl=https://download.example/pub/epel/|baseurl=https://mirrors.aliyun.com/epel/|g' /etc/yum.repos.d/epel.reposudo
dnf clean all && sudo dnf makecache
- 安装 Ansible 核心包
# 安装完整版(包含大量社区模块)
sudo dnf install ansible -y
# 或者只安装核心版(如果你只需基础功能,体积更小)sudo dnf install ansible-core -y
- 验证安装
ansible --version
🏢 二、 离线安装流程(适用于蜂巢等纯内网环境)
这是面试高频考点:如果客户现场完全断网,怎么办?
- 制作离线源(在外网机器上操作)
下载 ansible 及其所有依赖到本地目录
sudo dnf download --resolve
ansible -y --downloaddir=/tmp/ansible-rpms/
- 将 RPM 包传入内网 通过 U 盘或堡垒机,将
/tmp/ansible-rpms/目录下的所有.rpm文件拷贝到内网服务器。 - 内网安装
cd /root/ansible-rpms/
# 使用 localinstall 自动解决依赖
sudo dnf localinstall *.rpm -y
🛠️ 三、 装完后的“必做”三件事(核心配置)
- 配置 SSH 免密登录(Ansible 的生命线)
如果控制机连不上被控机,Ansible 无法工作。
生成密钥(一路回车)
ssh-keygen -t rsa -b 2048
# 下发公钥到目标机器
ssh-copy-id root@192.168.1.100
- 配置主机清单(Inventory) 编辑
/etc/ansible/hosts,把你要管理的机器分组写进去。
[edge_nodes]
192.168.1.100 ansible_host=192.168.1.100
192.168.1.101 ansible_host=192.168.1.101
补充:下载安装python3-libselinux(如果未安装)
sudo dnf install -y python3-libselinux
在 Ansible 运维中,它到底管什么?
当你的被控端开启了 SELinux 时,Ansible 在执行以下任务都需要调用这个包:
- 管文件(file/copy/template模块):Ansible 把文件拷贝过去后,可能需要调用这个包去修改文件的 SELinux 安全上下文(Context,比如之前代码里的
setype=samba_share_t)。 - 管用户(user模块):创建用户时,可能需要调用它确保用户的 SELinux 角色正确。
- 管服务/端口(firewalld模块):修改防火墙规则时,可能需要同步修改 SELinux 的放行策略。
- 管策略(sefcontext模块):直接用它来配置 SELinux 规则。
三、 Ad-hoc 模式(临时批量执行,最常用)
格式:ansible [主机组/IP] -m [模块] -a [参数]
- 连通性测试(最基础)
ansible all -m ping(面试话术:新机器上架后,第一件事就是全量 ping 一下,确认 SSH 免密和 Python 环境都正常。) - 批量执行 Shell 命令(最高频)
ansible edge_nodes -m shell -a "df -h" ansible edge_nodes -m shell -a "systemctl status nginx"(面试话术:每天早上用这个批量拉取 40 台工控机的磁盘水位和关键服务状态。) - 批量分发文件
ansible edge_nodes -m copy -a "src=/tmp/agent.rpm dest=/root/agent.rpm mode=0755"(面试话术:升级监控组件时,先用 copy 模块把新的 rpm 包或二进制文件推到所有机器上。) - 批量修改主机名(你刚实操过的)
ansible 192.168.1.100 -m hostname -a "name=ts-bl-01" - 批量收集系统信息(面试装逼用) 🛠️ 方法一:导入到文本文件中(注意,不是json文件)
ansible all -m setup > all_facts.json(面试话术:这个命令能收集所有机器的 ansible_facts,比如 CPU 型号、内存大小、操作系统版本,用来做 CMDB 资产盘点极其好用。)
🛠️ 方法二:使用 filter 过滤参数(最常用的 SRE 技巧)
如果你只想看某几个特定的指标(比如只看操作系统版本、或者只看内存大小),加上 -a 参数配合 filter 过滤,极其清爽:
只查所有机器的操作系统类型和版本
ansible all -m setup -a "filter=ansible_distribution*"
# 只查所有机器的总内存大小
ansible all -m setup -a "filter=ansible_memtotal_mb"
# 只查所有机器的 CPU 核心数
ansible all -m setup -a "filter=ansible_processor_vcpus"
🛠️ 方法三:配合 jq 命令(高阶玩家装逼用)
如果你把数据存成了 JSON 文件,建议配合 Linux 下的 JSON 处理神器 jq,直接把非结构化文本变成好看的数据:
ansible all -m setup | jq '.ansible_facts.ansible_hostname'
它会自动帮你把每台机器的名字单独提取出来,排版极佳。
🛠️ 方法四:生成 CMDB 可视化报表(终极降维打击)(需要先安装下方工具)
在真实的乙方运维里,纯看文本太 low 了。有一个开源工具叫 ansible-cmdb。你可以把 setup 的输出导出来,一键生成极其漂亮的 HTML 网页资产报表:
1. 导出数据
ansible -m setup --tree /tmp/facts all
# 2. 生成网页
ansible-cmdb /tmp/facts > /tmp/cmdb.html
(面试话术:只要把这个 HTML 报表发给甲方老板,他立马就能看到全厂几百台机器的 CPU、内存、系统版本。)
第一阶段:安装必备工具(填坑)
因为你之前的系统里没有 Python 的包管理器,所以必须先装 pip。
- 安装 pip3:
yum install -y python3-pip
(如果是 CentOS 8/Rocky 等系统,把 yum 换成 dnf)
- 使用国内镜像源安装
ansible-cmdb:
pip3 install ansible-cmdb -i https://pypi.tuna.tsinghua.edu.cn/simple
第二阶段:生成报表数据
这里分为“收集数据”和“生成网页”两步。这两步一定要分开执行,因为 Ansible 的终端输出带有杂乱的提示符,直接用管道传给 cmdb 会报错。
- 收集所有主机的信息(导出为文件):
ansible all -m setup --tree /tmp/facts -f 50
-m setup:收集机器底层的硬件、系统信息。--tree /tmp/facts:把收集到的纯 JSON 数据存入本地的/tmp/facts/目录中。-f 50:开启并发,一次处理 50 台,加快收集速度(机器少可以不加)。
- 读取数据,生成 HTML 报表:
ansible-cmdb /tmp/facts > /tmp/cmdb.html
- 这条命令极快,它读取上一步生成的文件夹,输出一个静态网页文件,保存为
cmdb.html。
第三阶段:如何查看生成的 HTML 页面
网页生成在服务器的 /tmp/cmdb.html,千万不要用 cat 或 vim 去看,你会看到满屏的代码。你需要把它放进浏览器里。
方法 A:下载到本地(最简单)
- 如果你用 Xshell / MobaXterm / FinalShell 等 SSH 工具,直接用它们自带的文件管理窗口,进入
/tmp/目录,把cmdb.html下载到你的 Windows 电脑上,双击打开。 - 或者在本地电脑的 CMD/PowerShell 里执行:
scp root@你的服务器IP:/tmp/cmdb.html D:/
方法 B:在服务器上开个临时网页(不用下载)
在服务器上执行:
cd /tmppython3 -m http.server 8000
然后打开你电脑的浏览器,访问 http://你的服务器IP:8000/cmdb.html,看完后回终端按 Ctrl+C 结束。
四、Playbook 模式(正式自动化发布)
- 运行剧本(最常用)
ansible-playbook init_system.yml我为你编写了一份生产级的高并发系统初始化 Ansible 剧本(init_system.yml)。它涵盖了安全、时间同步、内核调优等核心配置,这也是你面试时证明你“懂底层”的硬核素材。--- - name: 高并发服务器系统底层初始化调优 (OS Level Init) hosts: all become: yes gather_facts: yes vars: ntp_server: "ntp.aliyun.com" max_file_descriptors: 1048576 # 单进程最大文件句柄,为 15 万长连接预留冗余 tasks: # ================= 1. 基础环境与安全加固 ================= - name: 关闭防火墙 (内网环境,或由物理防火墙统一接管) systemd: name: firewalld state: stopped enabled: no ignore_errors: yes - name: 关闭 SELinux selinux: state: disabled ignore_errors: yes - name: 关闭 Swap 交换分区 (K8s/中间件 节点严禁使用 Swap,防 OOM 机制失效) command: swapoff -a when: ansible_swaptotal_mb > 0 - name: 注释 /etc/fstab 中的 swap 挂载 (防重启失效) replace: path: /etc/fstab regexp: '^([^#].*?\sswap\s+sw\s+.*)$' replace: '# \1' - name: 配置时间同步 (安装 Chrony) yum: name: chrony state: present when: ansible_os_family == "RedHat" # 👇 就是这里,把 template 换成了 copy 模块,直接把配置写死在剧本里 - name: 写入 Chrony 配置并启动 (Inline 方式) copy: dest: /etc/chrony.conf content: | # 使用阿里云 NTP 服务器 server {{ ntp_server }} iburst driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync logdir /var/log/chrony notify: Restart Chrony # ================= 2. 系统级资源限制 (突破长连接瓶颈) ================= - name: 配置系统全局文件句柄限制 (sysctl) sysctl: name: fs.file-max value: "{{ max_file_descriptors }}" sysctl_set: yes state: present reload: yes - name: 配置 limits.conf 用户级限制 blockinfile: path: /etc/security/limits.conf block: | * soft nofile {{ max_file_descriptors }} * hard nofile {{ max_file_descriptors }} * soft nproc 65535 * hard nproc 65535 # ================= 3. 高并发 TCP 内核参数调优 (核心绝杀点) ================= - name: 调优 TCP 协议栈及网络内核参数 (针对 15 万长连接与高并发 QPS) sysctl: name: "{{ item.name }}" value: "{{ item.value }}" sysctl_file: /etc/sysctl.d/99-high-concurrency.conf sysctl_set: yes state: present reload: yes loop: # 1. 增大半连接队列 (防 SYN Flood 与高并发建连) - { name: 'net.core.somaxconn', value: '65535' } - { name: 'net.ipv4.tcp_max_syn_backlog', value: '65535' } - { name: 'net.ipv4.tcp_syncookies', value: '1' } # 2. 加快 TIME_WAIT 状态回收 (针对短连接高频建连断开) - { name: 'net.ipv4.tcp_tw_reuse', value: '1' } - { name: 'net.ipv4.tcp_max_tw_buckets', value: '65535' } - { name: 'net.ipv4.tcp_fin_timeout', value: '30' } # 3. 增大连接跟踪表 (防止 Calico/kube-proxy 的 conntrack 表打满) - { name: 'net.netfilter.nf_conntrack_max', value: '1048576' } # 4. 开启 TCP Keepalive 探测 (防假死连接占用资源) - { name: 'net.ipv4.tcp_keepalive_time', value: '600' } - { name: 'net.ipv4.tcp_keepalive_intvl', value: '30' } - { name: 'net.ipv4.tcp_keepalive_probes', value: '3' } # ================= 4. 安装运维基础依赖工具 ================= - name: 安装常用排障与监控工具 yum: name: - wget - curl - vim - net-tools - tcpdump - sysstat - telnet state: present when: ansible_os_family == "RedHat" # ================= Handlers 定义 ================= handlers: - name: Restart Chrony systemd: name: chronyd state: restarted enabled: yes
- 语法检查(上线前必做)
ansible-playbook init_system.yml --syntax-check(面试话术:写错一个缩进,Playbook 就会报错。上线前我都会先跑 syntax-check 防止尴尬。) - “干跑”模式(Dry Run,极度安全)
ansible-playbook init_system.yml --check(面试话术:如果不确定剧本执行后会发生什么,加上--check,它会告诉你“将要发生什么改变”,但绝对不会真正去操作,防止把生产环境搞崩。) - 指定主机清单执行
ansible-playbook -i hosts_prod init_system.ymlhosts_prod在这里就是一个文件的名字(通常里面记录的是生产环境的服务器IP和分组信息),它也就是 Ansible 里的 Inventory(主机清单)。
- 恢复方式:使用“回滚专用” Playbook(推荐)
你可以新建一个文件叫 rollback_init.yml,把以下内容复制进去,然后运行它:
---
- name: 回滚高并发内核与系统调优 (保留 SELinux 和防火墙关闭)
hosts: edge_nodes
become: yes
tasks:
# 1. 恢复 Swap (取消注释 fstab 并开启 swap)
- name: 恢复 /etc/fstab 中的 swap 挂载配置
replace:
path: /etc/fstab
regexp: '^# (.*?\sswap\s+sw\s+.*)$'
replace: '\1'
- name: 开启 Swap 交换分区
command: swapon -a
ignore_errors: yes # 如果本来就没配 swap,忽略报错
# 2. 移除全局文件句柄限制的优化配置
- name: 移除 limits.conf 中的自定义限制配置块
blockinfile:
path: /etc/security/limits.conf
block: |
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65535
* hard nproc 65535
state: absent # 清除这个配置块
# 3. 删除 TCP 内核调优文件并重新加载系统默认配置
- name: 删除自定义的高并发 sysctl 配置文件
file:
path: /etc/sysctl.d/99-high-concurrency.conf
state: absent
- name: 重新加载系统默认的 sysctl 配置
command: sysctl --system
恢复SElinux与防火墙之外的配置
ansible-playbook rollback_init.yml
五、 进阶与排障(展现高级 SRE 素养)
- 查看主机清单(排查为什么连不上某些机器)
ansible-inventory --list # 或者看更直观的树状图 ansible-inventory --graph· - 控制并发速度(应对几十台机器的网络瓶颈)
ansible all -m ping -f 10(面试话术:-f参数控制并发数,默认是 5。如果在车间网络不好时批量推大文件,我会把并发调大,或者为了安全调小。) - 后台异步执行(应对耗时极长的任务)
ansible all -B 3600 -P 0 -m shell -a "yum update -y"(面试话术:比如要批量给 40 台机器打内核补丁,耗时超过 SSH 默认超时时间(10秒)。我会用-B 3600(放到后台跑 1 小时),用-P 0让其静默跑,防止 SSH 断连。)
🎤 面试终极绝杀话术(结合上面的命令讲业务):
面试官如果问:“*你平时怎么用 Ansible 管理边缘节点?*”
“我的日常运维极度依赖 Ansible。
新机器进来,我第一件事是用
ansible -m ping测连通性,然后跑一个初始化 Playbook。每天早上,我会用
ansible -m shell配合df -h和free -m批量巡检磁盘和内存。如果遇到发版或更新组件,我会先写好 YAML,用
ansible-playbook --syntax-check检查语法,用--check跑一遍 Dry Run 看看风险,确认没问题了再大批量推下去。遇到网络极差的情况,我会调整
-f并发参数或者用-B放到后台异步执行。利用 Ansible 的幂等性,即使我每天频繁跑这些命令,也绝对不会把生产环境跑乱。”
Ansible 常用模块完全指南
一、 基础概念与命令参数
1. 什么是 Ansible 模块?
模块就是 Ansible 的“命令”,无论是命令行还是脚本中都需要调用。常用的有 yum、copy、template 等。
2. 语法格式
ansible <pattern_goes_here> -m <module_name> -a <arguments>
# 也就是:
ansible 匹配模式 -m 模块 -a '需要执行的内容'
注:默认模块为 command,执行常规的 shell 命令。
3. 命令行参数大全
| 参数 | 说明 |
-v, --verbose | 输出更详细的执行过程信息,-vvv 可得到所有信息 |
-i PATH, --inventory=PATH | 指定 inventory(清单)信息,默认 /etc/ansible/hosts |
-f NUM, --forks=NUM | 并发线程数,默认 5 个线程 |
--private-key=FILE | 指定密钥文件 |
-m NAME, --module-name=NAME | 指定执行使用的模块 |
-M DIR, --module-path=DIR | 指定模块存放路径,默认 /usr/share/ansible |
-a 'ARGUMENTS', --args | 模块参数 |
-k, --ask-pass | SSH 认证密码 |
-K, --ask-sudo-pass | sudo 用户的密码(–sudo 时使用) |
-o, --one-line | 标准输出至一行 |
-s, --sudo | 相当于 Linux 系统下的 sudo 命令 |
-t DIR, --tree=DIR | 输出信息至 DIR 目录下,结果文件以远程主机命名 |
-T SECONDS, --timeout | 指定连接远程主机的最大超时,单位是秒 |
-B NUM, --background | 后台执行命令,超 NUM 秒后中止正在执行的任务 |
-P NUM, --poll | 定期返回后台任务进度 |
-u USERNAME, --user | 指定远程主机以 USERNAME 运行命令 |
-U SUDO_USERNAME | 使用 sudo,相当于 Linux 下的 sudo 命令 |
-c CONNECTION, --connection | 指定连接方式(paramiko、ssh、local,local 常用于 crontab) |
-l SUBSET, --limit | 指定运行主机 |
-l ~REGEX, --limit=~REGEX | 指定运行主机(正则) |
--list-hosts | 列出符合条件的主机列表,不执行任何命令 |
4. 执行的状态返回信息(颜色)
- 🟢 绿色:执行成功并且不需要做改变的动作
- 🟡 黄色:执行成功并且对目标主机做变更
- 🔴 红色:执行失败
二、 模块分类概览
| 分类 | 包含模块 | 说明 |
| 文件模块 | copy, file, lineinfile, synchronize | 复制文件、创建/删除目录、替换内容、rsync同步 |
| 软件包模块 | package, yum, apt, dnf, pip | 系统包管理器及 Python 包管理 |
| 系统模块 | firewalld, reboot, service, user | 防火墙、重启、服务管理、用户管理 |
| Net Tools | get_url, nmcli, uri | 下载文件、管理网络、与 WEB 服务交互 |
三、 21 个常用模块详解
1. user 模块
| 参数 | 解释 |
name | 要创建、修改、移除的用户名 |
password | 设置用户密码。此处只能使用加密密码作为值 |
system | 设置为 yes 表示创建一个系统用户,只能用于创建不能用于修改已有用户为系统用户 |
state | 创建用户(present)还是删除用户(absent)。默认为 present |
createhome | 创建家目录,或者已有的用户但家目录不存在也会创建。设置为 no 则不创建家目录 |
home | 指定要创建的家目录路径 |
move_home | 如果设置为 yes, 则 “home=” 则表示将家目录移动到此选项指定的路径下 |
uid | 设置用户的 uid |
group | 设置用户的 primary group |
groups | 将用户加入到辅助组列表中。如果设置 “groups=”, 则会将此用户从所有辅助组中移除 |
shell | 设置用户的 shell |
force | 配合 state=absent 时,等价于 userdel --force,即强制删除用户、家目录和邮件列表 |
remove | 配合 state=absent 时,等价于 userdel --remove,即删除家目录和邮件列表 |
update_password | user 是幂等模块,”always” 将总是修改密码。”on_create” 将只在创建用户时设置密码 |
代码示例:
# 临时命令使用 user 模块来确保 newbie 用户存在于 node1 上,并且其 UID 为 4000
[student@ansible ~/ansible]$ ansible node1 -m user -a 'name=newbie uid=4000 state=present'
[root@node1 ~]# id newbie
uid=4000(newbie) gid=4000(newbie) 组=4000(newbie)
# 设置 newbie 用户密码
[student@ansible ~/ansible]$ ansible node1 -m user -a 'name=newbie password=$1$x5dsadpB$PqzHJZD//CqCaxOZoZcj71'
# 创建无家目录,不能登录的用户
[student@ansible ~/ansible]$ ansible node1 -m user -a 'name=zhao create_home=no shell=/sbin/nologin state=present'
2. shell 模块
在远程主机上执行复杂的命令。
语法:ansible 主机清单 -m shell -a '执行命令'
代码示例:
# 临时命令使用 shell 模块来删除 node1 节点中的用户 newbie
[student@ansible ~/ansible]$ ansible node1 -m shell -a 'userdel -r newbie'
node1 | CHANGED | rc=0 >>
3. copy 模块
| 参数 | 解释 |
backup=[yes|no] | 拷贝的同时也创建一个包含时间戳信息的备份文件,默认为 no |
dest | 目标路径,只能是绝对路径,如果拷贝的文件是目录,则目标路径必须也是目录 |
content | 直接以 content 给定的字符串或变量值作为文件内容保存到远程主机上,它会替代 src 选项 |
directory_mode | 当对目录做递归拷贝时,设置了 directory_mode 将会使得只拷贝新建文件 |
follow=[yes|no] | 是否追踪到链接的源文件 |
force=[yes|no] | 设置为 yes(默认)时,将覆盖远程同名文件。设置为 no 时,忽略同名文件的拷贝 |
group | 设置远程文件的所属组 |
owner | 设置远程文件的所有者 |
mode | 设置远程文件的权限。使用数值表示时不能省略第一位,如 0644。也可以使用 ‘u+rwx’ 或 ‘u=rw,g=r,o=r’ 等方式设置 |
src | 拷贝本地源文件到远程,可使用绝对路径或相对路径。如果路径是目录,且目录后加了斜杠 “/”, 则只会拷贝目录中的内容到远程,如果目录后不加斜杠,则拷贝目录本身和目录内的内容到远程。 |
代码示例:
# 将源文件,copy 到被控端
[student@ansible ~/ansible]$ ansible node1 -m copy -a 'src=/etc/fstab dest=/var/tmp/fstab'
4. template 模块
| 参数 | 解释 |
backup | 拷贝的同时也创建一个包含时间戳信息的备份文件,默认为 no |
dest | 目标路径 |
force | 设置为 yes (默认)时,将覆盖远程同名文件。设置为 no 时,忽略同名文件的拷贝 |
group | 设置远程文件的所属组 |
owner | 设置远程文件的所有者 |
mode | 设置远程文件的权限。使用数值表示时不能省略第一位,如 0644。 |
src | ansible 控制器上 Jinja2 格式的模板所在位置,可以是相对或绝对路径 |
validate | 在复制到目标主机后但放到目标位置之前,执行此选项指定的命令。一般用于检查配置文件语法,正确则保存到目标位置。如果要引用目标文件名,则使用 %s。 |
代码示例:
[student@ansible ~/ansible]$ ansible node1 -m template -a 'src=/usr/share/doc/httpd/httpd-vhosts.conf dest=/etc/httpd/conf.d/httpd-vhosts.conf group=root owner=root mode=0644'
5. file 模块
| 参数 | 解释 |
group | 设置文件的所属组 |
owner | 设置文件的所有组 |
mode | 修改权限 |
path | 指定代操作的文件 |
recurse | 递归修改文件属性,要求 state=directory |
src | 原文件名 |
state | directory: 如果目录不存在则递归创建 <br> file: 文件不存在时,不会被创建(默认值) <br> touch: 创建新文件 <br> link: 修改或创建软链接 <br> hard: 修改或创建硬链接 <br> absent: 目录和其中的文件会被递归删除,文件或链接将取消链接状态 |
代码示例:
# 修改文件的权限属性和 context 值
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/var/tmp/fstab mode=g+w mode=o+w group=galaxy owner=galaxy setype=samba_share_t'
# 新建文件
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/var/tmp/bbb state=touch'
# 新建目录
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/var/tmp/cc state=directory'
# 删除文件或者目录
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/var/tmp/cc state=absent'
# 创建软链接
[student@ansible ~/ansible]$ ansible node1 -m file -a 'dest=/var/tmp/chenyu src=/var/tmp/bbb state=link'
# 创建硬链接
[student@ansible ~/ansible]$ ansible node1 -m file -a 'dest=/var/tmp/chenyu1 src=/var/tmp/aaa state=hard'
6. lineinfile 模块
| 参数 | 解释 |
path | 必须参数,指定要操作的文件路径 |
line | 必须参数,指定要替换的文本内容 |
regexp | 匹配正则语句,与要过滤的关键字 |
state | 状态语句:state=absent 则是删除,state=present 默认 |
backrefs | 表示是否开启反向引用,默认 no |
create | 当文件不存在时,是否创建对应的文件 |
backup | 是否在修改文件之前对文件进行备份 |
insertafter | 借助 insertafter 参数可以将文本插入到”指定的行”之后 |
insertbefore | 借助 insertbefore 参数可以将文本插入到”指定的行”之前 |
代码示例:
# 通过正则匹配查找 /etc/selinux/config 文本中开头是 SELINUX= 的行,并替换成 SELINUX=disabled
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled"'
# 通过正则匹配查找 /etc/selinux/config 文本,并在文本末尾插入一行 www.alone.com
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="EOF" line="www.alone.com"'
# 通过正则匹配查找 /etc/selinux/config 文本,并在文本行首插入一行 www.alone.com
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="BOF" line="www.alone.com"'
# 通过正则匹配查找 /etc/selinux/config 文本,删除所有的 www.alone.com 字段.
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="^www.alone.com" state=absent'
# 通过正则匹配查找 /etc/selinux/config 文本中在开头是 SELINUX=disabled 行的行后插入一段话 www.alone.com
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config insertafter="^SELINUX=" line="www.alone.com"'
# 通过正则匹配查找 /etc/selinux/config 文本中在开头是 SELINUX=disabled 行的行前插入一段话 www.alone.com
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config insertbefore="^SELINUX=" line="www.alone.com"'
7. yum_repository 模块
| 参数 | 解释 |
baseurl | 地址 |
mirrorlist | 设置 mirrorlist 地址 |
description | 描述信息 |
enabled | 是否启用该仓库 |
file | 保存此仓库的文件,不设置该项的话则默认以 name 选项中的名称命名 |
gpgcheck | 是否要进行 gpgcheck |
name | 仓库的名称 |
reposdir | 保存 .repo 文件的目录 |
state | repo 文件的状态,present/absent |
代码示例:
# 配置 yum 仓库
[student@ansible ~/ansible]$ ansible node1 -m yum_repository -a 'file=server name=BaseOS description=BaseOS baseurl=file:///mnt/BaseOS enabled=yes gpgcheck=no'
[student@ansible ~/ansible]$ ansible node1 -m yum_repository -a 'file=server name=AppStream description=AppStream baseurl=file:///mnt/AppStream enabled=yes gpgcheck=no'
8. yum 模块
| 参数 | 解释 |
name | 用于指定安装包的包名 |
state | 用于指定软件包的状态,默认值为 present |
disable_gpg_check | 用于禁用对 rpm 包的公钥 gpg 验证,默认值为 no |
enablerepo | 用于指定安装软件包时临时启用的 yum 源 |
disablerepo | 用于指定安装软件包时临时禁用的 yum 源 |
exclude | 排除哪些包不安装,仅在 state=present 或 latest 时生效 |
list | 类似于 yum list |
update_cache | 强制更新 yum 的 cache |
代码示例:
# 安装软件:通过 Yum 模块批量的安装 httpd 服务到指定主机上.
[student@ansible ~/ansible]$ ansible node1 -m yum -a "name=httpd state=installed"
# 卸载软件:通过 Yum 模块批量的卸载 httpd 服务主机.
[student@ansible ~/ansible]$ ansible node1 -m yum -a "name=httpd state=removed"
9. service 模块
| 参数 | 解释 |
name | 此参数用于指定需要操作的服务名称 |
state | 此参数用于指定服务的状态, started、stopped、restarted、reloaded |
enabled | 此参数用于指定是否将服务设置为开机启动项 |
代码示例:
# 设置服务开机自启动,设置 httpd 服务开机自启动.
[student@ansible ~/ansible]$ ansible node1 -m service -a "name=httpd state=started enabled=yes"
# 关闭服务开机自启动,关闭 httpd 服务开机自启动.
[student@ansible ~/ansible]$ ansible node1 -m service -a "name=httpd state=stopped enabled=no"
10. fetch 模块
| 参数 | 解释 |
dest | 目标绝对路径 |
src | 复制的源文件路径,源文件只能是文件 |
flat | 改变拉取后的路径存储方式。如果设置为 yes, 且当 dest 以 “/” 结尾时,将直接把源文件的 basename 存储在 dest 下。显然,应该考虑多个主机拉取时的文件覆盖情况。 |
fail on missing | 当设置为 yes 时,如果拉取的源文件不存在,则此任务失败。默认为 no. |
validate_checksum | 远程主机上的源文件。只能是文件,不支持目录。 |
代码示例:
# 将远程主机的 /etc/fstab 文件拉取到本地来,存储的名字为 /tmp/node1/etc/fstab
[student@ansible ~/ansible]$ ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp'
# 将某台远程主机的 /etc/fstab 文件拉取到本地来,存储的名字为 /tmp/fstab
[student@ansible ~/ansible]$ ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp/ flat=yes'
# 将远程主机的 /etc/fstab 文件拉取到本地来,存储的名字为 /tmp/fstab-node1
[student@ansible ~/ansible]$ ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp/fstab-{{inventory_hostname}} flat=yes'
11. firewalld 模块
| 参数 | 解释 |
icmp_block | 在防火墙中添加或者移除的 ICMP 块 |
icmp_bolck_inversion | 开启/关闭防火墙区域 ICMP 报文反转功能 |
immediate | 如果将此配置设置为永久性,则应立即应用此配置,yes or no,默认 no |
interface | 在防火墙中添加或移除 interface |
masquerade | 在防火墙中开启或关闭 masquerade 功能 |
offline | 是否在防火墙离线时运行此模块,yes or no |
permanent | 该配置是否在运行的防火墙配置中,或者在重新启动时仍然存在。注意,如果这是 no, immediate 被假定为 yes。 |
port | 在防火墙中添加或移除端口名称或端口范围。格式:PORT/PROTOCOL 或 PORT-PORT/PROTOCOL |
rich_rule | rich_rule 添加或删除到防火墙 |
service | 在防火墙中添加或移除服务名称。该服务必须在 firewall-cmd --get-services 的输出中列出 |
source | 在防火墙中添加或移除某个来源的网络 |
state | 启用或禁用一项设置。对于端口:该端口是否接受(enabled)或拒绝(disabled)连接。状态的(present)和(absent)只能在区域级别操作中使用。 |
timeout | 该规则应在非永久性时生效的时间,默认 0 |
zone | 添加或移除的防火墙区域。默认 public。 |
代码示例:
# 允许 http 流量的传入
[student@ansible ~/ansible]$ ansible node1 -m firewalld -a 'service=http permanent=yes state=enabled immediate=yes'
# 富规则 允许 192.168.111.0/24 主机 http 流量的传入
[student@ansible ~/ansible]$ ansible node1 -m firewalld -a 'zone=public rich_rule="rule family=ipv4 source address=192.168.111.0/24 service name=http accept" permanent=yes state=enabled immediate=yes'
12. replace 模块
| 参数 | 解释 |
path | 必须参数,指定要操作的文件名称 |
regexp | 必须参数,指定一个正则表达式 |
replace | 指定最终要替换成的文本 |
backup | 在修改文件之前对文件进行备份, yes/no |
代码示例:
# 将 /tmp/zsl 文件中的“abc”替换成“yyy”
[student@ansible ~/ansible]$ ansible node1 -m replace -a 'path=/tmp/zsl regexp="abc" replace="yyy"'
# 将 /tmp/zsl 文件中的“yyy”替换成“iii”,且把替换前的 /tmp/zsl 文件备份
[student@ansible ~/ansible]$ ansible node1 -m replace -a 'path=/tmp/zsl regexp="yyy" replace="iii" backup=yes'
13. parted 模块
| 参数 | 解释 |
device | 指定硬盘设备路径 比如 /dev/vdb |
label | 指定分区表类型 gpt mbr |
number | 指定分区序号 |
part_start | 分区起始位置 |
part_end | 分区结束位置 |
state | 指定操作方式 创建(present) 、删除(absent) 、查信息(info) |
代码示例:
# 新建扩展分区
[student@ansible ~/ansible]$ ansible node1 -m parted -a 'device=/dev/sda number=4 part_type=extended part_start=46GiB part_end=49.8GiB state=present'
# 新建逻辑分区
[student@ansible ~/ansible]$ ansible node1 -m parted -a 'device=/dev/sda number=5 part_type=logical part_start=46.1GiB part_end=48.2GiB state=present'
14. filesystem 模块
| 参数 | 解释 |
dev | 要格式化的分区 |
fstype | 文件系统类型 比如 ext4 xfs |
force | 强制格式化,如果以前分区中有数据 |
代码示例:
# 给 /dev/sda5 格式化,类型是 xfs
[student@ansible ~/ansible]$ ansible node1 -m filesystem -a 'fstype=xfs dev=/dev/sda5'
15. mount 模块
| 参数 | 解释 |
path | 挂载点 |
src | 挂载的文件 |
fstype | 挂载的硬盘类型 比如 iso9660、ext4、xfs、nfs、cifs(samba)、ntfs |
opts | 传递给 mount 命令的参数 |
state | present 开机挂载,仅将挂载配置写入 /etc/fstab 并不会真的挂载 <br> mounted 挂载设备,并将配置写入 /etc/fstab <br> unmounted 卸载设备,不会清除 /etc/fstab 写入的配置 <br> absent 卸载设备,并清理 /etc/fstab 写入的配置 |
代码示例:
# 新建挂载点 /common
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/common state=directory'
# 查看 /dev/sda5 的 UUID
[student@ansible ~/ansible]$ ansible node1 -m shell -a 'blkid /dev/sda5'
# 将分区 /dev/sda5 挂载到 /common 目录
[student@ansible ~/ansible]$ ansible node1 -m mount -a 'path=/common src="UUID=d162b8b9-2326-4ee4-a559-80861461c4f0" fstype=xfs state=mounted'
# 卸载
[student@ansible ~/ansible]$ ansible node1 -m mount -a 'path=/common src="UUID=d162b8b9-2326-4ee4-a559-80861461c4f0" fstype=xfs state=absent'
16. lvg 模块 (LVM卷组)
| 参数 | 解释 |
vg | 卷组名称 |
state | present 创建(默认) 或者 absent 删除 |
force | 可以在删除时使用 |
pvs | 指定物理卷 |
pesize | 设定 pe 大小 |
代码示例:
# 新建卷组 vg0
[student@ansible ~/ansible]$ ansible node1 -m lvg -a 'vg=vg0 pesize=16M pvs=/dev/sda5'
17. lvol 模块 (LVM逻辑卷)
| 参数 | 解释 |
lv | 定义逻辑卷名称 |
size | 定义逻辑卷大小 |
vg | 逻辑卷的空间来自哪个 vg |
state | present 创建(默认) 或者 absent 删除 |
force | 强制删除或者调整逻辑卷大小 |
代码示例:
# 新建逻辑卷 lv0
[student@ansible ~/ansible]$ ansible node1 -m lvol -a 'lv=lv0 size=1000M vg=vg0'
# 在线扩容逻辑卷
[student@ansible ~/ansible]$ ansible node1 -m lvol -a 'lv=lv0 size=1600M vg=vg0 resizefs=yes'
18. sefcontext 模块 (SELinux)
| 参数 | 解释 |
target | 指定目标目录 |
setype | 设置安全性本文 |
state | 模块状态:present 代表增加目录的安全性本文;absent 代表删除目录的安全性本文 |
代码示例:
# 修改 context 值
[student@ansible ~/ansible]$ ansible node1 -m sefcontext -a 'target="/share(/.*)?" setype=samba_share_t state=present'
# 应用新的 selinux 文件的 context 值
[student@ansible ~/ansible]$ ansible node1 -m command -a 'restorecon -Rv /share'
19. debug 模块
| 参数 | 解释 |
msg | 调试输出的消息 |
var | 将某个任务执行的输出作为变量传递给 debug 模块,debug 会直接将其打印输出 |
verbosity | debug 的级别(默认是 0 级,全部显示) |
代码示例:
# 输出 Alone
[student@ansible ~/ansible]$ ansible node1 -m debug -a 'msg=Alone'
20. cron 模块
| 参数 | 解释 |
user | 用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户 |
job | 指定计划的任务中需要实际执行的命令或者脚本 |
name | 用于设置计划任务的名称,计划任务的名称会在注释中显示 |
state | 相关状态信息,当删除计划任务时,需要将 state 的值设置为 absent,用于创建 present(默认) |
disabled | 当计划任务有名称时,我们可以根据名称使对应的任务失效 |
backup | 此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会对计划任务备份 |
$time | 指定具体的执行时间、minute 分、hour 时、day 天、month 月、weekday、0-7 代表周 |
代码示例:
# 创建计划任务,任务名称为 mkdirs test,于每天 1 点 5 分,执行输出一段话 echo hello lyshark
[student@ansible ~/ansible]$ ansible node1 -m cron -a "name='mkdirs test' minute=5 hour=1 job='echo hello lyshark'"
# 删除计划任务 mkdirs test,删除前做好备份.
[student@ansible ~/ansible]$ ansible node1 -m cron -a "name='mkdirs test' state=absent backup=yes"
21. get_url 模块
| 参数 | 解释 |
dest | 文件下载到远程的那个目录下。如果 dest 是一个目录,则使用 url 的 base name 作为文件名;如果 dest 是一个目录,则 force 选项不生效;如果 dest 是一个目录,则总是会下载目标文件,但只在已存在的文件变化了才会替换旧文件;如果设置为 yes, 且 dest 不是一个目录时,则总是会下载文件,但只在已存在的文件变化了才会替换旧文件;如果设置为 no(默认),则只会在目录路径下不存在该文件时才会进行下载 |
force | 是否强制覆盖 yes/no |
url | 指定一个 URL 地址 |
backup | 下载文件时间时创建一个名称中包含时间戳的备份文件 |
tmp_dest | 下载时临时存放目录,在任务执行完成前会删除下载的临时文件 |
group | 文件/目录的所属组 |
owner | 文件/目录的所有者 |
timeout | 请求 url 时的超时时间,默认 10 秒钟 |
代码示例:
# 下载一个指定文件到远程主机
[student@ansible ~/ansible]$ ansible node1 -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/root"