news 2026/8/10 13:13:01

Ansible 自动化运维实战 —— 批量部署、安全加固与进阶技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ansible 自动化运维实战 —— 批量部署、安全加固与进阶技巧

导语: 这是《Ansible 自动化运维入门》的续篇。在前一篇中,你已经掌握了 Ansible 的安装、配置和基础用法。本文将带你深入实战,学习如何批量部署服务、批量管理用户、系统安全加固,以及变量、角色、标签等进阶技巧。

一、实战案例

案例一:批量部署 Nginx

playbooks/目录下创建文件:

cd ~/ansible-project nano playbooks/deploy-nginx.yml
--- - name: 部署 Nginx Web 服务器 hosts: webservers become: yes tasks: - name: 安装 Nginx apt: name: nginx state: present update_cache: yes - name: 确保 Nginx 开机自启 service: name: nginx state: started enabled: yes - name: 创建测试页面 copy: content: "<h1>Hello from {{ inventory_hostname }}</h1>\n" dest: /var/www/html/index.html mode: '0644' - name: 重启 Nginx service: name: nginx state: restarted

执行部署:

ansible-playbook playbooks/deploy-nginx.yml

验证访问:

curl http://192.168.1.101 curl http://192.168.1.102

案例二:批量创建用户

playbooks/目录下创建文件:

cd ~/ansible-project nano playbooks/create-users.yml
--- - name: 批量创建用户 hosts: all become: yes vars: users: - name: alice groups: sudo - name: bob groups: docker tasks: - name: 创建用户 user: name: "{{ item.name }}" groups: "{{ item.groups }}" create_home: yes shell: /bin/bash loop: "{{ users }}" - name: 设置用户密码 lineinfile: path: /etc/shadow state: absent when: false # 实际需要设置密码

执行:

ansible-playbook playbooks/create-users.yml

案例三:系统安全加固

playbooks/目录下创建文件:

cd ~/ansible-project nano playbooks/hardening.yml
--- - name: 系统安全加固 hosts: all become: yes tasks: - name: 禁用 Root 远程登录 lineinfile: path: /etc/ssh/sshd_config regexp: '^PermitRootLogin' line: 'PermitRootLogin no' notify: 重启 SSH - name: 禁用密码登录,仅允许密钥 lineinfile: path: /etc/ssh/sshd_config regexp: '^PasswordAuthentication' line: 'PasswordAuthentication no' notify: 重启 SSH - name: 配置防火墙规则 ufw: rule: allow port: "22,80,443" proto: tcp - name: 自动更新系统 cron: name: 自动更新 special_time: daily job: 'apt update && apt upgrade -y' when: ansible_os_family == "Debian" handlers: - name: 重启 SSH service: name: ssh state: restarted

执行加固:

ansible-playbook playbooks/hardening.yml

提示: 在生产环境执行安全加固前,请务必先用--check --diff参数预览变更,确保不会锁死自己!

二、进阶技巧

2.1 使用变量

- name: 使用变量 hosts: all become: yes vars: nginx_port: 80 deploy_dir: /opt/app tasks: - name: 创建部署目录 file: path: "{{ deploy_dir }}" state: directory mode: '0755'

变量还可以定义在单独的文件中:

# group_vars/webservers.yml nginx_port: 8080 deploy_dir: /var/www # group_vars/databases.yml db_port: 3306 db_data_dir: /data/mysql

2.2 条件判断

- name: 根据系统类型安装软件 apt: name: "{{ item }}" state: present loop: - curl - vim when: ansible_distribution == "Ubuntu"

多条件判断:

- name: 根据 CPU 架构安装不同软件包 apt: name: "{{ item }}" state: present loop: - htop - tmux when: ansible_architecture == "x86_64"

2.3 使用角色 (Roles)

角色是组织 Playbook 的最佳方式,可以实现代码复用:

roles/ nginx/ tasks/ main.yml templates/ files/ handlers/ defaults/ mysql/ tasks/ main.yml templates/

在 Playbook 中引用角色:

--- - name: 部署 Web 服务 hosts: webservers become: yes roles: - nginx - common

为什么使用角色?
- 代码复用:一个角色可在多个 Playbook 中引用
- 职责分离:每个角色独立管理,便于维护
- 便于分享:可以发布到 Ansible Galaxy 供社区使用

2.4 使用标签

- name: 安装 Nginx apt: name: nginx state: present tags: - install - nginx - name: 配置 Nginx template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf tags: - configure - nginx

仅执行安装任务:

ansible-playbook playbooks/site.yml --tags "install"

排除某些任务:

ansible-playbook playbooks/site.yml --skip-tags "configure"

2.5 循环与迭代

- name: 安装多个软件包 apt: name: "{{ item }}" state: present loop: - curl - vim - htop - git - name: 创建多个用户 user: name: "{{ item }}" state: present groups: sudo loop: - alice - bob - charlie

2.6 错误处理与忽略失败

- name: 尝试安装软件,允许失败 apt: name: nginx state: present ignore_errors: yes - name: 条件性执行任务 command: /usr/bin/some_command ignore_errors: yes register: result - name: 根据结果决定下一步 debug: msg: "命令执行失败,执行备选方案" when: result.failed

三、常见问题排查

3.1 连接失败

# 使用 -vvv 查看详细日志 ansible all -i inventory/hosts.ini -m ping -vvv # 检查 SSH 配置 ssh -v user@被控节点IP

3.2 权限不足

# 检查是否配置了 become become: yes # 检查用户权限 sudo -l

3.3 YAML 格式错误

YAML 对缩进要求严格:

  • 必须使用空格,不能使用制表符

  • 同一层级的缩进必须一致

  • 使用在线工具验证: https://yamlchecker.com/

3.4 模块报错

# 查看模块文档 ansible-doc apt # 检查模块是否存在 ansible all -m apt -a "help"

3.5 被控节点 ModuleNotFoundError

如果看到类似ModuleNotFoundError: No module named 'ansible.module_utils.six.moves'错误,说明被控节点缺少 Ansible 的 Python 模块:

web01 | FAILED! => { "module_stderr": "Shared connection to 10.10.5.32 closed.\r\n", "module_stdout": "\r\nTraceback (most recent call last):\r\n File .../AnsiballZ_ping.py\", line 37, in invoke_module\r\n from ansible.module_utils import basic\r\nModuleNotFoundError: No module named 'ansible.module_utils.six.moves'\r\n", }

解决方法:在被控节点上安装 Ansible 的 Python 模块:

# Ubuntu/Debian(注意:apt 可能没有此包,需要用 pip) sudo pip3 install ansible-core --break-system-packages # CentOS/RHEL sudo dnf install -y ansible # 或者用 pip 安装(版本更新) sudo pip3 install ansible-core

为什么需要装?
Ansible 的工作方式是控制节点把模块(Python 代码)发送到被控节点,在被控节点的 Python 环境中执行。所以被控节点也需要有 Ansible 的 Python 模块,否则无法运行任何模块。

3.6 apt 软件源同步问题

如果 Playbook 安装软件时遇到类似这样的错误:

E: Failed to fetch http://security.ubuntu.com/ubuntu/.../vim-tiny_9.1.0016-1ubuntu7.18_amd64.deb File has unexpected size (836 != 805816). Mirror sync in progress?

原因:Ubuntu 软件源镜像正在同步中,文件不完整。
解决方法:在被控节点上执行sudo apt update --fix-missing刷新缓存,然后重试 Playbook。

四、总结与扩展

本节回顾

通过本系列文章,你已经学会了:

  1. ✅ 配置 Inventory 主机清单

  2. ✅ 安装配置 Ansible 和控制节点

  3. ✅ 编写和执行 Playbook

  4. ✅ 常用模块的实际应用

  5. ✅ 批量部署、用户管理、安全加固等实战案例

  6. ✅ 变量、角色、标签等进阶技巧

下一步建议

  • AWX / Tower

    : 使用 Ansible 的 Web 界面,提供可视化操作和权限管理

  • Ansible Galaxy

    : 分享和复用社区编写的角色和 Playbook

  • CI/CD 集成

    : 结合 Jenkins、GitLab CI 实现自动化部署

  • 云平台管理

    : 学习使用 Ansible 管理 AWS、Azure、阿里云等资源

参考资料

  • Ansible 官方文档: https://docs.ansible.com/

  • Ansible Galaxy: https://galaxy.ansible.com/

  • YAML 语法参考: https://yaml.org/

如果你觉得这篇文章有帮助,欢迎点赞、在看、转发支持!有问题欢迎在评论区留言讨论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 10:01:46

3分钟学会:如何免费提取视频硬字幕生成SRT文件

3分钟学会&#xff1a;如何免费提取视频硬字幕生成SRT文件 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、字幕内容提取。…

作者头像 李华
网站建设 2026/8/9 10:01:27

Unity音频开发进阶:集成NAudio实现底层音频处理与实时控制

1. 项目概述&#xff1a;当Unity遇见NAudio如果你正在Unity里折腾音频&#xff0c;尤其是那些Unity内置AudioSource和AudioClip搞不定的活儿&#xff0c;比如实时音频流处理、复杂的波形分析、多格式音频文件解码&#xff0c;或者想自己写个音频编辑器&#xff0c;那你大概率已…

作者头像 李华
网站建设 2026/8/9 10:01:23

3步快速搞定PMX转VRM:Blender插件完整解决方案

3步快速搞定PMX转VRM&#xff1a;Blender插件完整解决方案 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 to 5.2 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender 你是否在为PMX模型转换VRM格式而…

作者头像 李华
网站建设 2026/8/9 10:01:02

如何快速掌握猫抓扩展:视频资源嗅探与下载的完整指南

如何快速掌握猫抓扩展&#xff1a;视频资源嗅探与下载的完整指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓&#xff08;cat-catch&#…

作者头像 李华
网站建设 2026/8/9 10:00:11

猫抓浏览器扩展:5步轻松下载网页视频的终极指南

猫抓浏览器扩展&#xff1a;5步轻松下载网页视频的终极指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到想保存网页上的精彩视频…

作者头像 李华
网站建设 2026/8/9 9:56:57

3分钟解锁B站视频解析:开发者必备的PHP API工具全解析

3分钟解锁B站视频解析&#xff1a;开发者必备的PHP API工具全解析 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你是否曾经遇到过这样的场景&#xff1f;需要将B站的教学视频保存下来离线学习&…

作者头像 李华