Ansible 学习指南一、Ansible 概述1.1 什么是 Ansible自动化运维工具用于配置管理、应用部署、任务自动化无代理架构通过 SSH 或 WinRM 直接管理节点无需在目标机器安装客户端声明式语言使用 YAML 描述系统状态而非具体操作步骤幂等性多次执行同一任务结果保持一致1.2 核心优势简单易学YAML 语法直观学习曲线平缓模块化设计丰富的内置模块支持自定义扩展跨平台支持 Linux、Windows、网络设备等开源免费Red Hat 支持社区活跃二、核心概念2.1 控制节点 vs 受管节点控制节点运行 Ansible 的主机受管节点被管理的主机2.2 主要组件Inventory主机清单定义管理哪些主机Playbook任务剧本YAML 格式的自动化脚本Module执行具体任务的模块Task调用模块执行的操作Role预定义的任务集合可复用Collection模块、插件、角色的分发单元三、安装与配置3.1 安装 Ansible# Ubuntu/Debiansudoaptupdatesudoaptinstallansible# RHEL/CentOSsudoyuminstallansible# macOSbrewinstallansible# Python pip 安装pipinstallansible3.2 基础配置# 配置文件优先级1. ANSIBLE_CONFIG 环境变量指定2. ./ansible.cfg当前目录3. ~/.ansible.cfg用户目录4. /etc/ansible/ansible.cfg系统目录# 最小化配置示例[defaults]inventory./inventory host_key_checkingFalse四、Inventory主机清单4.1 基本格式# inventory 文件示例 [webservers] web1.example.com ansible_ssh_userroot web2.example.com ansible_port2222 [databases] db1.example.com db2.example.com [all:vars] ansible_python_interpreter/usr/bin/python34.2 分组与变量# YAML 格式 inventoryall:hosts:host1:ansible_connection:sshansible_user:adminchildren:webservers:hosts:web[1:3].example.com:databases:hosts:db[1:2].example.com:vars:db_port:5432五、Ad-hoc 命令5.1 基本语法ansiblepattern-mmodule-aarguments# 示例ansible webservers-mpingansible all-mshell-auptimeansible db-mapt-anamenginx statepresent5.2 常用模块# 系统信息ansible all-msetup# 收集事实ansible all-mcommand-adf -h# 执行命令# 软件管理ansible webservers-mapt-anamenginx statelatestansible webservers-myum-anamehttpd statepresent# 文件管理ansible all-mcopy-asrc/local/file dest/remote/fileansible all-mfile-apath/tmp/test statedirectory# 服务管理ansible webservers-mservice-anamenginx statestarted六、Playbook 基础6.1 Playbook 结构----name:配置 Web 服务器hosts:webserversbecome:yesvars:http_port:80max_clients:200tasks:-name:安装 Nginxapt:name:nginxstate:latest-name:复制配置文件template:src:nginx.conf.j2dest:/etc/nginx/nginx.confnotify:重启 Nginxhandlers:-name:重启 Nginxservice:name:nginxstate:restarted6.2 核心指令name: 任务描述hosts: 目标主机become: 是否提权vars: 定义变量tasks: 任务列表handlers: 触发任务when: 条件判断loop: 循环执行七、变量与事实7.1 变量定义# 多种变量定义方式vars:package_name:nginxport:80vars_files:-vars/main.yml# 主机变量# inventory 或 host_vars/ 目录# 组变量# inventory 或 group_vars/ 目录7.2 事实收集# 查看所有事实-debug:var:ansible_facts# 常用事实-debug:var:ansible_distribution-debug:var:ansible_ip_addresses-debug:var:ansible_memory_mb八、条件、循环和错误处理8.1 条件判断tasks:-name:重启服务仅当 CentOSservice:name:httpdstate:restartedwhen:ansible_os_family RedHat-name:多种条件command:/bin/falseregister:resultignore_errors:yes-debug:msg:命令失败when:result.failed8.2 循环tasks:-name:添加多个用户user:name:{{ item }}state:presentloop:-alice-bob-charlie-name:带字典的循环user:name:{{ item.name }}uid:{{ item.uid }}loop:-{name:user1,uid:1001}-{name:user2,uid:1002}九、Roles 和 Collections9.1 Role 结构roles/ └── nginx/ ├── defaults/ │ └── main.yml # 默认变量 ├── tasks/ │ └── main.yml # 主要任务 ├── handlers/ │ └── main.yml # 处理器 ├── templates/ │ └── nginx.conf.j2 # 模板文件 ├── files/ ├── vars/ │ └── main.yml # 变量定义 └── meta/ └── main.yml # 依赖信息9.2 使用 Role# playbook.yml-hosts:webserversroles:-role:nginxvars:nginx_port:8080十、模板和文件管理10.1 Jinja2 模板# nginx.conf.j2 server { listen {{ http_port }}; server_name {{ server_name }}; {% if ssl_enabled %} ssl_certificate {{ ssl_cert }}; ssl_certificate_key {{ ssl_key }}; {% endif %} location / { proxy_pass http://backend; } }10.2 文件操作模块tasks:-name:复制文件copy:src:files/app.confdest:/etc/app.confowner:rootmode:0644-name:创建符号链接file:src:/file/to/linkdest:/path/to/symlinkstate:link-name:获取文件内容slurp:src:/etc/hostsregister:hosts_file十一、实战案例11.1 部署 LAMP 栈----name:部署 LAMP 环境hosts:webserversbecome:yestasks:-name:更新 apt 缓存apt:update_cache:yes-name:安装 Apacheapt:name:apache2state:present-name:安装 MySQLapt:name:mysql-serverstate:present-name:安装 PHPapt:name:{{ item }}state:presentloop:-php-php-mysql-libapache2-mod-php-name:复制网站文件copy:src:files/index.phpdest:/var/www/html/-name:启动服务service:name:{{ item }}state:startedenabled:yesloop:-apache2-mysql11.2 管理 Docker 容器----name:管理 Docker 容器hosts:docker_hostsbecome:yestasks:-name:安装 Dockerapt:name:docker.iostate:present-name:启动 Nginx 容器docker_container:name:my-nginximage:nginx:latestports:-80:80volumes:-/data:/usr/share/nginx/htmlstate:started十二、最佳实践12.1 目录结构建议project/ ├── inventory/ │ ├── production │ ├── staging │ └── dev ├── group_vars/ │ ├── all.yml │ ├── webservers.yml │ └── databases.yml ├── host_vars/ │ └── server1.yml ├── roles/ │ ├── common/ │ ├── nginx/ │ └── mysql/ ├── playbooks/ │ ├── site.yml │ ├── webservers.yml │ └── databases.yml ├── files/ ├── templates/ └── ansible.cfg12.2 性能优化# ansible.cfg [defaults] forks 50 # 并发连接数 host_key_checking False gathering smart # 智能事实收集 fact_caching jsonfile # 事实缓存 [ssh_connection] pipelining True # 管道传输 control_path /tmp/ansible-ssh-%%h-%%p-%%r十三、学习资源13.1 官方资源官方文档Ansible Galaxy角色市场GitHub 仓库13.2 推荐书籍《Ansible 权威指南》《Ansible for DevOps》13.3 练习平台Katacoda Ansible 课程Play-with-Docker十四、常见问题14.1 调试技巧# 详细输出ansible-playbook playbook.yml-vvv# 检查语法ansible-playbook playbook.yml --syntax-check# 测试运行不实际执行ansible-playbook playbook.yml--check# 逐步执行ansible-playbook playbook.yml--step14.2 常见错误权限问题使用become: yes或--become主机不可达检查网络和 SSH 配置模块不存在确认模块名称或安装对应集合语法错误使用 YAML 语法检查工具学习路线建议第一周安装配置 Ad-hoc 命令第二周Playbook 基础语法第三周变量、条件和循环第四周模板和文件管理第五周Roles 和 Collections第六周实际项目练习通过以上内容系统学习你将能够熟练使用 Ansible 进行自动化运维管理。建议结合实际项目练习逐步掌握各项技能。