目前 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)

  1. 系统:CentOS Stream 8/9、Rocky Linux 8/9、Ubuntu 20.04/22.04(推荐 64 位);
  2. Python:3.9+(系统默认满足,低版本可通过pyenv升级);
  3. 网络:能通目标节点,开启 SSH(22 端口);
  4. 权限:控制节点需有root / 免密 sudo权限。

目标节点(无需安装 Ansible)

  1. Linux 节点:开启 SSH,安装 Python3.6+(无 Python 可通过 Ansible 的raw模块补装),支持 SSH 免密 / 密码登录;
  2. Windows 节点:开启 WinRM 服务(需单独配置,本文重点讲 Linux 运维);
  3. 网络设备:支持 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 核心避坑点

  1. 幂等性:所有 Playbook / 模块必须保证幂等性,避免重复执行导致异常(如用lineinfile代替shell echo修改配置);
  2. Python 依赖:目标节点无 Python3 时,用raw模块先安装:ansible 节点IP -m ansible.builtin.raw -a 'yum install -y python3'
  3. SSH 免密:控制节点的公钥必须写入目标节点的~/.ssh/authorized_keys,且文件权限为600,目录权限为700
  4. YAML 语法:缩进用 2 个空格,键值对的:后必须加空格,变量{{ }}前后加空格;
  5. 模块选择:尽量用内置模块代替shell/command,模块更稳定、更易实现幂等性;
  6. 并行数forks参数不要设置过大(如超过 100),否则会导致控制节点 CPU / 内存耗尽,SSH 连接超时。

8.2 实用技巧

  1. 批量执行:用for循环实现公钥批量拷贝、节点批量操作,减少重复工作;
  2. 日志记录:后台执行 Playbook 时,用nohup记录日志,方便后续排查问题;
  3. 标签使用:为 Playbook 添加标签,按需执行部分任务,提升效率;
  4. 变量优先级:Ansible 变量优先级从高到低:Playbook vars主机清单主机变量主机清单组变量全局变量Roles默认变量
  5. Collection 扩展:主流功能扩展通过ansible-galaxy安装官方 Collection(如网络设备、云厂商):ansible-galaxy collection install ansible.posix
  6. 条件执行:用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 目录结构
Logo

助力合肥开发者学习交流的技术社区,不定期举办线上线下活动,欢迎大家的加入

更多推荐