Ansible 主流版本(Core 2.15+)安装部署与实操全总结
本文摘要: Ansible核心2.15-2.17版本使用指南,全面适配Python3.9+,采用模块化Collection架构。主要内容包括: 环境要求:控制节点支持主流Linux发行版,目标节点需SSH/Python3.6+ 安装方式:在线(YUM/APT)、Pip及离线安装方案 核心配置:自定义ansible.cfg和YAML格式主机清单 使用模式:Ad-hoc临时命令和Playbook剧本
目前 Ansible 的主流版本为Ansible Core 2.15~2.17(RedHat 官方维护的核心版本),摒弃了对 Python2 的支持,全面适配 Python3.9+,同时采用模块化 + Collection(集合) 架构扩展功能,控制节点适配主流 Linux 发行版(CentOS Stream 8/9、Rocky Linux 8/9、Ubuntu 20.04/22.04),目标节点支持 Linux/Windows/ 网络设备等。
本总结以生产环境主流配置为核心,涵盖安装部署(在线 / 离线)、核心配置、基础使用、Playbook 实战、Roles 入门,内容简洁易查,适配日常自动化运维场景。
一、前置条件(主流环境要求)
控制节点(仅需安装 Ansible)
- 系统:CentOS Stream 8/9、Rocky Linux 8/9、Ubuntu 20.04/22.04(推荐 64 位);
- Python:3.9+(系统默认满足,低版本可通过
pyenv升级); - 网络:能通目标节点,开启 SSH(22 端口);
- 权限:控制节点需有root / 免密 sudo权限。
目标节点(无需安装 Ansible)
- Linux 节点:开启 SSH,安装 Python3.6+(无 Python 可通过 Ansible 的
raw模块补装),支持 SSH 免密 / 密码登录; - Windows 节点:开启 WinRM 服务(需单独配置,本文重点讲 Linux 运维);
- 网络设备:支持 SSH/Telnet(需对应 Collection 插件)。
核心前提
控制节点到所有 Linux 目标节点实现 SSH 免密登录(Ansible 默认通信方式,生产环境必配,密码登录仅测试用)。
二、Ansible 核心安装部署(主流方式)
Ansible Core 的安装分在线安装(推荐,适配系统源)、Pip 安装(通用)、离线安装(无网络生产环境),以下为各方式实操,优先推荐系统包管理器安装(YUM/APT),避免 Pip 的环境冲突。
2.1 在线安装
方式 1:RHEL/CentOS Stream 8/9、Rocky Linux 8/9(DNF/YUM)
Ansible Core 不在系统默认源,需添加官方 epel 源(适配主流版本):
# 1. 安装epel源(CentOS Stream 9/Rocky 9)
dnf install -y epel-release
# CentOS Stream 8/Rocky 8
yum install -y epel-release
# 2. 安装Ansible Core(自动解决Python3依赖)
dnf install -y ansible-core # 9系
# yum install -y ansible-core # 8系
# 3. 验证安装(查看核心版本,显示2.15+即成功)
ansible --version
# 查看已安装的核心模块
ansible-doc -l | head -10
方式 2:Ubuntu 20.04/22.04(APT)
添加 Ansible 官方 PPA 源,适配最新 Core 版本:
# 1. 安装依赖
apt update && apt install -y software-properties-common
# 2. 添加官方PPA源
add-apt-repository --yes --update ppa:ansible/ansible
# 3. 安装Ansible Core
apt install -y ansible-core
# 4. 验证
ansible --version
方式 3:Pip 安装(通用,适用于所有 Linux,进阶用户)
通过 Python3 的 pip 安装,可指定具体版本,适合需要多版本隔离的场景:
# 1. 安装/升级pip3
python3 -m pip install --upgrade pip
# 2. 安装Ansible Core(指定主流版本2.17)
pip3 install ansible-core==2.17.0
# 3. 验证(若提示命令未找到,添加pip路径到环境变量)
ansible --version
# 环境变量补全(临时)
export PATH=/root/.local/bin:$PATH
# 环境变量补全(永久)
echo 'export PATH=/root/.local/bin:$PATH' >> /etc/profile && source /etc/profile
2.2 离线安装(生产环境无网络场景,主流适配)
离线安装核心是在有网络的同版本控制节点上下载 Ansible Core 及所有依赖的 rpm 包,拷贝到离线节点后本地安装,以CentOS Stream 9为例:
# 步骤1:有网络节点下载rpm包(含所有依赖)
dnf install -y yum-utils # 安装yumdownloader工具
mkdir -p /root/ansible_offline # 新建包存放目录
yumdownloader --resolve --destdir=/root/ansible_offline ansible-core # 下载包及依赖
# 步骤2:拷贝包到离线控制节点
# 通过U盘/内网SCP将/root/ansible_offline目录拷贝到离线节点的同路径
# 步骤3:离线节点本地批量安装
cd /root/ansible_offline
dnf localinstall -y *.rpm # 用dnf自动解决依赖,推荐
# 若dnf报错,用rpm强制安装(确保包完整)
rpm -ivh *.rpm --force --nodeps
# 步骤4:验证
ansible --version
2.3 必配:SSH 免密登录(控制节点→目标节点)
生产环境禁止密码登录,必须配置 SSH 免密,实操步骤(控制节点执行):
# 1. 生成SSH密钥对(rsa算法,2048位,一路回车,不设置密码)
ssh-keygen -t rsa -b 2048 -N '' -f /root/.ssh/id_rsa
# 2. 拷贝公钥到目标节点(替换为目标节点IP/用户名,示例root@192.168.1.100)
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.100
# 3. 测试免密登录(无需输入密码即成功,退出回到控制节点)
ssh root@192.168.1.100
exit
# 批量拷贝公钥(多目标节点,可写for循环)
for ip in 192.168.1.100 192.168.1.101 192.168.1.102; do
ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ip
done
免密登录避坑:若拷贝失败,检查目标节点/etc/ssh/sshd_config,确保开启以下配置并重启 sshd:
# 目标节点执行
sed -i 's/^#PubkeyAuthentication/PubkeyAuthentication/g' /etc/ssh/sshd_config
systemctl restart sshd && systemctl enable sshd
三、Ansible 核心配置(主流规范)
Ansible 的配置遵循就近原则(优先级从高到低):当前目录./ansible.cfg → 用户家目录~/.ansible.cfg → 系统默认/etc/ansible/ansible.cfg。
生产环境推荐在工作目录创建自定义 ansible.cfg(避免修改系统配置),核心配置包含主机清单(Inventory) 和主配置文件(ansible.cfg),主流支持INI/YAML两种格式,YAML 更推荐(易读、易扩展)。
3.1 目录结构(生产环境主流规范)
建议创建统一的 Ansible 工作目录,便于管理清单、Playbook、角色等:
# 新建工作目录
mkdir -p /data/ansible/{inventory,playbook,roles,files,templates}
cd /data/ansible
# 新建自定义配置文件
touch ansible.cfg inventory/hosts.yml
inventory/:存放主机清单(YAML/INI);playbook/:存放 Playbook 剧本;roles/:存放自动化角色(复杂场景);files/:存放静态文件(如配置文件、安装包);templates/:存放 Jinja2 模板文件(动态配置);ansible.cfg:自定义主配置文件。
3.2 自定义主配置(ansible.cfg,主流核心参数)
在/data/ansible/ansible.cfg中写入以下内容,覆盖系统默认配置,适配生产环境:
[defaults]
# 主机清单文件路径(自定义YAML格式)
inventory = ./inventory/hosts.yml
# 并行任务数(默认5,根据控制节点性能调整,生产环境20-50)
forks = 30
# 跳过SSH首次连接的主机密钥验证(必开,避免手动确认)
host_key_checking = False
# SSH连接超时时间(秒,生产环境10-30)
timeout = 20
# 默认执行模块(推荐shell,替代command,支持管道/环境变量)
module_name = shell
# 关闭不必要的警告
warn_on_undefined_vars = False
# 模块存放路径(核心+自定义)
library = ./library:/usr/share/ansible/plugins/library
[ssh_connection]
# 开启SSH长连接(提升批量操作速度)
control_path = ~/.ssh/ansible-%%h-%%p-%%r
control_master = auto
control_persist = 60s # 长连接保持时间60秒
3.3 主机清单(Inventory,主流 YAML 格式)
主机清单用于定义 Ansible 管理的目标节点,YAML 格式比传统 INI 更易扩展,支持分组、主机变量、组变量、组嵌套,在/data/ansible/inventory/hosts.yml中编写,示例覆盖生产环境常见场景:
# 主流YAML格式主机清单
all:
vars:
# 全局变量(所有节点生效)
ansible_ssh_user: root # 默认SSH用户
ansible_python_interpreter: /usr/bin/python3 # 默认Python解释器
children:
# 分组1:Web服务器组
web:
hosts:
192.168.1.101:
nginx_port: 80 # 主机独立变量
192.168.1.102:
nginx_port: 8080
vars:
# 组变量(web组所有节点生效)
app: nginx
env: prod
# 分组2:数据库服务器组
db:
hosts:
192.168.1.201:
mysql_port: 3306
192.168.1.202:
mysql_port: 3306
vars:
app: mysql
env: prod
# 组嵌套:生产环境所有节点(包含web+db)
prod:
children:
web:
db:
清单验证(核心命令):
cd /data/ansible
# 列出所有受管节点
ansible all --list-hosts
# 列出指定组节点(如web组)
ansible web --list-hosts
# 测试节点连通性(核心ping模块,成功返回pong)
ansible all -m ping
四、Ansible 基础使用(两大核心模式)
Ansible 的使用分为Ad-hoc 临时命令和Playbook 剧本,是自动化运维的核心,Ad-hoc 适用于快速临时操作,Playbook 适用于复杂批量自动化,二者互补,覆盖所有运维场景。
4.1 模式 1:Ad-hoc 临时命令(快速操作,ansible)
Ad-hoc 是单条命令批量执行,适用于快速测试、临时操作(如查看磁盘、重启服务、创建目录),生产环境常用于日常巡检。
核心格式
ansible <目标节点/组> -m <模块名> -a <模块参数> [可选选项]
- 目标节点 / 组:
all(所有)、组名(web/db)、单个 IP(192.168.1.101); -m:指定官方内置模块(前缀ansible.builtin.,主流推荐显式写,规范);-a:模块参数,用单 / 双引号包裹;- 可选选项:
-b(提权为 root)、-C(测试执行,不实际操作)、-f(指定并行数)、-k(密码登录,仅测试)。
主流高频 Ad-hoc 示例(覆盖 80% 日常操作)
所有命令在/data/ansible工作目录执行(加载自定义配置),模块显式带ansible.builtin.,符合生产规范:
# 1. 测试所有节点连通性(核心ping模块)
ansible all -m ansible.builtin.ping
# 2. 查看web组节点磁盘使用情况(command模块,无管道)
ansible web -m ansible.builtin.command -a 'df -h'
# 3. 查看db组节点mysql进程(shell模块,支持管道/重定向)
ansible db -m ansible.builtin.shell -a 'ps -ef | grep mysql | grep -v grep'
# 4. 在所有节点创建/data/app目录(file模块,指定权限)
ansible all -m ansible.builtin.file -a 'path=/data/app state=directory mode=755 owner=root group=root'
# 5. 拷贝控制节点的nginx.conf到web组节点(copy模块,覆盖前备份)
ansible web -m ansible.builtin.copy -a 'src=./files/nginx.conf dest=/etc/nginx/nginx.conf backup=yes mode=644'
# 6. 给web组节点安装nginx(yum模块,CentOS)
ansible web -m ansible.builtin.yum -a 'name=nginx state=installed'
# 7. 启动并开机自启nginx(service模块)
ansible web -m ansible.builtin.service -a 'name=nginx state=started enabled=yes'
# 8. 查看所有节点内存信息(setup模块,过滤系统信息)
ansible all -m ansible.builtin.setup -a 'filter=ansible_memtotal_mb'
# 9. 批量重启web组节点nginx服务(shell模块)
ansible web -m ansible.builtin.shell -a 'systemctl restart nginx'
# 10. 测试执行(不实际操作,查看步骤)
ansible web -m ansible.builtin.yum -a 'name=redis state=installed' -C
4.2 模式 2:Playbook 剧本(核心,ansible-playbook)
Playbook 是 Ansible 的核心功能,适用于复杂多步骤自动化任务(如部署 Nginx/Mysql、系统优化、批量安装软件),采用YAML 语法编写,具备幂等性(执行 1 次和 N 次结果一致),生产环境所有自动化操作均通过 Playbook 实现。
1. YAML 基础语法(必守,避免语法报错)
Playbook 文件以.yml/.yaml结尾,YAML 对格式严格敏感,核心规则:
- 大小写敏感;
- 用2 个空格缩进(禁止 Tab,生产规范),同层级必须对齐;
- 用
- 空格表示列表项(如任务、主机); - 用
键: 空格 值表示键值对(如模块参数); - 用
---表示文件开始(推荐加,规范); - 注释用
#,变量用{{ 变量名 }}(Jinja2 语法)。
2. Playbook 核心构成(主流规范)
一个 Playbook 由一个 / 多个 Play组成,每个 Play 对应一组目标节点 + 一组任务,单个 Play 的核心构成(生产环境必配):
---
# Play名称:自定义,清晰描述功能
- name: 部署Nginx服务(prod环境web组)
hosts: web # 目标节点/组(从主机清单读取)
remote_user: root # 远程执行用户
become: yes # 是否提权为root(非root用户必开)
gather_facts: false # 是否获取目标节点系统信息(关闭可提速,无需时推荐)
vars:
# 自定义变量(可覆盖主机清单的变量,优先级更高)
nginx_conf: /etc/nginx/nginx.conf
nginx_port: 80
tasks:
# 任务列表:按顺序执行,每个任务对应一个模块
- name: 安装nginx依赖
ansible.builtin.yum:
name: [gcc, pcre-devel, zlib-devel]
state: installed
- name: 安装nginx
ansible.builtin.yum:
name: nginx
state: latest
- name: 拷贝自定义nginx配置文件
ansible.builtin.copy:
src: ./files/nginx.conf
dest: "{{ nginx_conf }}"
backup: yes
mode: 644
notify: 重启nginx # 触发处理器(配置文件修改时才执行)
- name: 启动nginx并开机自启
ansible.builtin.service:
name: nginx
state: started
enabled: yes
handlers:
# 处理器:仅被notify触发时执行,用于后续操作(如重启服务、重载配置)
- name: 重启nginx
ansible.builtin.service:
name: nginx
state: restarted
tags:
# 标签:指定执行部分任务(提速,避免全量执行)
- nginx_install
- nginx_config
3. Playbook 常用执行命令(生产规范)
将上述 Playbook 保存为/data/ansible/playbook/deploy_nginx.yml,在工作目录执行,核心命令按执行顺序使用:
cd /data/ansible
# 1. 检查语法(必做,避免执行报错)
ansible-playbook --syntax-check ./playbook/deploy_nginx.yml
# 2. 列出执行的任务和节点(预览)
ansible-playbook --list-tasks --list-hosts ./playbook/deploy_nginx.yml
# 3. 测试执行(不实际操作,查看执行步骤和结果)
ansible-playbook -C ./playbook/deploy_nginx.yml
# 4. 正常执行(全量任务)
ansible-playbook ./playbook/deploy_nginx.yml
# 5. 执行指定标签的任务(仅安装nginx,提速)
ansible-playbook -t nginx_install ./playbook/deploy_nginx.yml
# 6. 后台执行(大批次节点,记录日志)
nohup ansible-playbook ./playbook/deploy_nginx.yml > nginx_deploy.log 2>&1 &
4. 执行结果解析(颜色区分,快速判断)
Ansible Playbook 执行结果以颜色区分状态,生产环境快速定位问题:
- 绿色:执行成功,目标节点状态无变更(如已安装的软件再次执行安装);
- 黄色:执行成功,目标节点状态发生变更(如安装软件、创建目录、修改配置);
- 红色:执行失败,终端会显示具体错误信息(如模块参数错误、文件不存在、SSH 连接失败);
- 蓝色:执行 skipped(跳过,如条件不满足)。
五、Ansible 主流核心模块(内置,ansible.builtin)
Ansible Core 2.15 + 的内置模块均以ansible.builtin.为前缀,覆盖所有基础运维场景,无需额外安装 Collection,以下为生产环境高频核心模块,含关键参数 + 使用场景,方便快速查阅:
表格
| 模块前缀 | 模块名 | 核心用途 | 关键参数(必配 / 常用) | |
|---|---|---|---|---|
| ansible.builtin. | ping | 测试节点连通性 | 无 | |
| ansible.builtin. | command | 执行系统命令(无管道) | creates/removes(条件执行)、chdir(切换目录) | |
| ansible.builtin. | shell | 执行系统命令(支持管道) | 同 command,支持 ` | /&`/ 重定向 |
| ansible.builtin. | file | 管理文件 / 目录 / 软链接 | path(路径,必配)、state(directory/absent/touch/link)、mode/owner/group | |
| ansible.builtin. | copy | 拷贝本地文件到目标节点 | src(本地源)、dest(远程目标,必配)、backup=yes、mode | |
| ansible.builtin. | yum/dnf | 管理 RPM 包(CentOS) | name(包名)、state(installed/removed/latest) | |
| ansible.builtin. | apt | 管理 DEB 包(Ubuntu) | name、state、update_cache=yes(更新源) | |
| ansible.builtin. | service | 管理系统服务 | name(服务名,必配)、state(started/stopped/restarted)、enabled=yes | |
| ansible.builtin. | setup | 获取目标节点系统信息 | filter(过滤信息,如 ansible_*_ipv4) | |
| ansible.builtin. | cron | 管理定时任务 | name(描述,必配)、minute/hour/day、job(执行命令)、state=absent(删除) | |
| ansible.builtin. | user | 管理系统用户 | name(用户名,必配)、groups(附加组)、state=absent、remove=yes(删家目录) | |
| ansible.builtin. | lineinfile | 修改文件单行内容 | path(文件路径)、regexp(正则匹配)、line(修改后内容)、state=absent | |
| ansible.builtin. | unarchive | 解压压缩包 | src(本地压缩包)、dest(远程解压路径,必配)、mode | |
| ansible.builtin. | synchronize | 基于 rsync 同步文件 | src、dest、mode=push/pull(推 / 拉)、delete=yes(同步删除) |
模块文档查询(核心命令):
# 查看模块详细用法(如copy模块)
ansible-doc ansible.builtin.copy
# 查看模块参数摘要(-s)
ansible-doc -s ansible.builtin.file
六、Roles 角色入门(生产环境复杂场景,主流规范)
当 Playbook 的任务量增多(如部署一套 LAMP/ELK),直接编写单 Playbook 会导致代码臃肿、难以维护,Ansible 提供Roles(角色) 功能,将任务、变量、文件、模板按功能拆分,实现代码复用、模块化管理,是生产环境复杂自动化的主流方案。
6.1 Roles 目录结构(官方规范,必须遵循)
Roles 的目录结构为 Ansible 官方定义,固定命名,在/data/ansible/roles下创建角色(如nginx角色):
# 创建nginx角色的目录结构
mkdir -p /data/ansible/roles/nginx/{tasks,handlers,vars,files,templates,defaults,meta}
tasks/:存放核心任务(main.yml,必配);handlers/:存放处理器(main.yml);vars/:存放角色专属变量(main.yml);files/:存放静态文件(如 nginx.conf);templates/:存放 Jinja2 动态模板(如 nginx.conf.j2);defaults/:存放默认变量(优先级最低);meta/:存放角色依赖 / 说明。
6.2 Roles 核心编写(以 nginx 角色为例)
1. 编写任务(/data/ansible/roles/nginx/tasks/main.yml)
---
- name: 安装nginx依赖
ansible.builtin.yum:
name: [gcc, pcre-devel, zlib-devel]
state: installed
- name: 安装nginx
ansible.builtin.yum:
name: nginx
state: latest
- name: 拷贝nginx配置文件
ansible.builtin.copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
backup: yes
mode: 644
notify: 重启nginx
- name: 启动nginx并开机自启
ansible.builtin.service:
name: nginx
state: started
enabled: yes
2. 编写处理器(/data/ansible/roles/nginx/handlers/main.yml)
---
- name: 重启nginx
ansible.builtin.service:
name: nginx
state: restarted
3. 放入静态文件(/data/ansible/roles/nginx/files/nginx.conf)
将自定义的 nginx.conf 配置文件拷贝到该目录。
6.3 调用 Roles(Playbook 简化版)
创建 Playbook/data/ansible/playbook/nginx_roles.yml,直接调用 nginx 角色,替代原有冗长的任务列表:
---
- name: 调用nginx角色部署服务
hosts: web
remote_user: root
gather_facts: false
roles:
- nginx # 调用roles/nginx角色
6.4 执行 Roles 版 Playbook
cd /data/ansible
ansible-playbook ./playbook/nginx_roles.yml
Roles 核心优势:一个角色可被多个 Playbook 调用,实现代码复用;多个角色可组合使用(如部署 LAMP,调用nginx+mysql+php角色),大幅提升自动化效率。
七、生产环境经典实战案例(主流场景,直接复用)
以下为3 个生产环境高频实战案例,基于 Ansible Core 2.15 + 编写,符合主流规范,可直接修改变量 / 路径后使用。
案例 1:Linux 系统基础优化(全节点通用)
保存为/data/ansible/playbook/sys_optimize.yml,实现关闭 SELinux、调优文件句柄、关闭防火墙、定时同步时间等核心优化:
---
- name: Linux系统基础优化(prod环境)
hosts: all
remote_user: root
gather_facts: false
tasks:
- name: 关闭SELinux(永久)
ansible.builtin.lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: 'SELINUX=disabled'
- name: 临时关闭SELinux
ansible.builtin.shell: setenforce 0 || true
- name: 调优文件句柄(永久)
ansible.builtin.lineinfile:
path: /etc/security/limits.conf
line: "{{ item }}"
with_items:
- "* soft nofile 655360"
- "* hard nofile 655360"
- "* soft nproc 655360"
- "* hard nproc 655360"
- name: 关闭并禁用firewalld
ansible.builtin.service:
name: firewalld
state: stopped
enabled: no
- name: 清空iptables规则
ansible.builtin.shell: iptables -F && iptables-save > /etc/sysconfig/iptables
- name: 定时同步时间(5分钟一次,阿里云NTP)
ansible.builtin.cron:
name: ntpdate_sync
minute: "*/5"
job: "/usr/sbin/ntpdate -u ntp.aliyun.com && /sbin/hwclock -w"
- name: 禁用DNS反向解析(提升SSH速度)
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#UseDNS'
line: 'UseDNS no'
notify: 重启sshd
handlers:
- name: 重启sshd
ansible.builtin.service:
name: sshd
state: restarted
案例 2:批量安装 Docker(CentOS Stream 9)
保存为/data/ansible/playbook/install_docker.yml,实现 Docker-ce 的安装、启动、配置镜像加速:
---
- name: 批量安装Docker-ce(CentOS Stream 9)
hosts: all
remote_user: root
gather_facts: false
vars:
docker_mirror: https://docker.mirrors.ustc.edu.cn # 镜像加速地址
tasks:
- name: 卸载旧版本Docker
ansible.builtin.yum:
name: [docker, docker-client, docker-client-latest, docker-common, docker-latest, docker-latest-logrotate, docker-logrotate, docker-engine]
state: removed
- name: 安装Docker依赖
ansible.builtin.yum:
name: [yum-utils, device-mapper-persistent-data, lvm2]
state: installed
- name: 添加Docker官方源
ansible.builtin.yum_repository:
name: docker-ce-stable
baseurl: https://download.docker.com/linux/centos/$releasever/$basearch/stable
gpgcheck: yes
gpgkey: https://download.docker.com/linux/centos/gpg
enabled: yes
- name: 安装Docker-ce
ansible.builtin.yum:
name: [docker-ce, docker-ce-cli, containerd.io]
state: latest
- name: 配置Docker镜像加速
ansible.builtin.file:
path: /etc/docker
state: directory
- name: 写入daemon.json
ansible.builtin.copy:
content: |
{
"registry-mirrors": ["{{ docker_mirror }}"]
}
dest: /etc/docker/daemon.json
mode: 644
notify: 重启docker
- name: 启动Docker并开机自启
ansible.builtin.service:
name: docker
state: started
enabled: yes
- name: 加入docker组(免sudo)
ansible.builtin.user:
name: root
groups: docker
append: yes
handlers:
- name: 重启docker
ansible.builtin.service:
name: docker
state: restarted
案例 3:批量修改目标节点主机名
保存为/data/ansible/playbook/change_hostname.yml,结合主机清单变量,实现批量个性化修改主机名:
---
- name: 批量修改目标节点主机名
hosts: all
remote_user: root
gather_facts: false
vars:
# 可按组定义主机名,或从主机清单读取
hostname_map:
192.168.1.101: web-prod-01
192.168.1.102: web-prod-02
192.168.1.201: db-prod-01
192.168.1.202: db-prod-02
tasks:
- name: 修改主机名(永久)
ansible.builtin.hostname:
name: "{{ hostname_map[inventory_hostname] }}"
- name: 写入/etc/hostname
ansible.builtin.copy:
content: "{{ hostname_map[inventory_hostname] }}"
dest: /etc/hostname
mode: 644
- name: 临时生效主机名
ansible.builtin.shell: hostname {{ hostname_map[inventory_hostname] }}
八、生产环境避坑与实用技巧(主流经验)
8.1 核心避坑点
- 幂等性:所有 Playbook / 模块必须保证幂等性,避免重复执行导致异常(如用
lineinfile代替shell echo修改配置); - Python 依赖:目标节点无 Python3 时,用
raw模块先安装:ansible 节点IP -m ansible.builtin.raw -a 'yum install -y python3'; - SSH 免密:控制节点的公钥必须写入目标节点的
~/.ssh/authorized_keys,且文件权限为600,目录权限为700; - YAML 语法:缩进用 2 个空格,键值对的
:后必须加空格,变量{{ }}前后加空格; - 模块选择:尽量用内置模块代替
shell/command,模块更稳定、更易实现幂等性; - 并行数:
forks参数不要设置过大(如超过 100),否则会导致控制节点 CPU / 内存耗尽,SSH 连接超时。
8.2 实用技巧
- 批量执行:用
for循环实现公钥批量拷贝、节点批量操作,减少重复工作; - 日志记录:后台执行 Playbook 时,用
nohup记录日志,方便后续排查问题; - 标签使用:为 Playbook 添加标签,按需执行部分任务,提升效率;
- 变量优先级:Ansible 变量优先级从高到低:
Playbook vars→主机清单主机变量→主机清单组变量→全局变量→Roles默认变量; - Collection 扩展:主流功能扩展通过
ansible-galaxy安装官方 Collection(如网络设备、云厂商):ansible-galaxy collection install ansible.posix; - 条件执行:用
when实现条件判断(如不同系统执行不同任务):yaml
- name: 安装apt包(Ubuntu) ansible.builtin.apt: name: nginx state: installed when: ansible_os_family == "Debian"
九、Ansible 常用核心命令汇总
表格
| 命令 | 核心用途 |
|---|---|
ansible --version |
查看 Ansible 版本 |
ansible <组> --list-hosts |
列出指定组的节点 |
ansible <组> -m ping |
测试节点连通性 |
ansible-doc <模块> |
查看模块文档 |
ansible-playbook --syntax-check <yml> |
检查 Playbook 语法 |
ansible-playbook -C <yml> |
测试执行 Playbook |
ansible-galaxy collection install <集合> |
安装 Collection |
ansible-galaxy role init <角色名> |
初始化 Roles 目录结构 |
更多推荐


所有评论(0)