生成、审查并优化 Ansible 自动化脚本;在用户提及 Ansible、playbook、角色、清单、任务、处理器等情况时使用本技能。
Ansible Skill.
功能概述
Ansible Skill.是一项面向实际任务的技能,主要用于A 生成生产级Ansble自动化的技巧:游戏本,角色,目录,.;Jinja2模板,可变文件,以及官后完整的项目结构.bes.。
核心要点
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
- 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。
使用与执行
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
结果检查与注意事项
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
Ansible 技能
一项用于生成生产级 Ansible 自动化内容的技能:Playbook、Role、Inventory、Jinja2 模板、变量文件,以及遵循官方最佳实践的完整项目结构。
工作流概览
1. 明确意图 → 理解目标操作系统、任务类型、规模、幂等性需求 2. 选择输出类型 → Playbook / Role / Inventory / 模板 / 完整项目 3. 生成制品 → 生成嵌入最佳实践的 YAML 文件 4. 验证与注释 → 添加 lint 提示、--check 命令及幂等性说明 5. 输出结构 → 清晰展示文件路径与执行指令
第 1 步:明确意图
生成前需收集以下信息(上下文明确时可自动推断):
| 参数 | 说明 | 示例 |
|---|---|---|
target_os |
被管主机的操作系统家族 | Ubuntu 22.04, RHEL 9 |
task_type |
需自动化的操作类型 | deploy app, manage users |
connection_type |
Ansible 的连接方式 | SSH(默认)、WinRM |
privilege |
是否需要 sudo/become 权限? | yes / no |
scale |
主机/主机组数量 | 3 webservers, 1 DB |
idempotency |
是否必须支持重复安全执行? | yes(始终推荐) |
var_source |
变量来源 | group_vars, vault, extra |
若上下文已足够清晰,可跳过交互式确认,直接生成。
第 2 步:输出类型
A) 单个 Playbook
适用场景:临时任务、简单自动化、一次性操作。
模板:
--- # playbooks/.yml - name: <描述性 Play 名称> hosts: become: true gather_facts: true vars: app_port: 8080 app_user: deploy pre_tasks: - name: Ensure required packages are present ansible.builtin.package: name: "{{ item }}" state: present loop: - curl - git roles: - role: when: ansible_os_family == "Debian" tasks: - name: Task description (use verb + object) ansible.builtin.module: param: value notify: Restart service tags: - setup - deploy handlers: - name: Restart service ansible.builtin.service: name: state: restarted
规则:
- 始终使用 FQCN(Fully Qualified Collection Name):如
ansible.builtin.copy,而非copy - 使用
state: present/absent保证幂等性 - 为任务添加
tags,支持选择性执行 - 服务重启必须通过
notify+ handler 实现(禁止在 task 中内联重启) - 优先使用
loop而非已弃用的with_items
B) Role 骨架
适用场景:可复用、可共享、可测试的自动化单元。
目录结构:
roles// ├── defaults/ │ └── main.yml # 低优先级默认值(可被覆盖) ├── vars/ │ └── main.yml # 高优先级 Role 内部变量 ├── tasks/ │ ├── main.yml # 入口文件(按 OS/功能 import_tasks) │ ├── install.yml │ ├── configure.yml │ └── service.yml ├── handlers/ │ └── main.yml ├── templates/ │ └── .conf.j2 ├── files/ │ └── ├── meta/ │ └── main.yml # Galaxy 元数据与依赖声明 └── README.md
tasks/main.yml 模式:
---
- name: Include OS-specific variables
ansible.builtin.include_vars: "{{ ansible_os_family }}.yml"
failed_when: false
- ansible.builtin.import_tasks: install.yml
tags: [install]
- ansible.builtin.import_tasks: configure.yml
tags: [configure]
- ansible.builtin.import_tasks: service.yml
tags: [service]
defaults/main.yml 模式:
--- # Role:# All variables with safe defaults role_package_name: nginx role_service_name: nginx role_config_path: /etc/nginx/nginx.conf role_user: www-data role_port: 80 role_enabled: true
C) Inventory
静态 Inventory(INI 格式):
# inventory/hosts [webservers] web01.example.com ansible_host=10.0.1.10 web02.example.com ansible_host=10.0.1.11 [databases] db01.example.com ansible_host=10.0.2.10 [loadbalancers] lb01.example.com [production:children] webservers databases loadbalancers [all:vars] ansible_user=deploy ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_python_interpreter=/usr/bin/python3
静态 Inventory(YAML 格式 — 推荐):
# inventory/hosts.yml
all:
vars:
ansible_user: deploy
ansible_python_interpreter: /usr/bin/python3
children:
webservers:
hosts:
web01:
ansible_host: 10.0.1.10
http_port: 80
web02:
ansible_host: 10.0.1.11
http_port: 80
databases:
hosts:
db01:
ansible_host: 10.0.2.10
db_port: 5432
staging:
children:
webservers:
databases:
group_vars 目录结构:
inventory/
├── hosts.yml
├── group_vars/
│ ├── all.yml # 应用于所有主机
│ ├── all/
│ │ ├── vars.yml
│ │ └── vault.yml # ansible-vault 加密的敏感信息
│ ├── webservers.yml
│ └── databases.yml
└── host_vars/
└── web01.yml
D) Jinja2 模板
配置文件模板模式:
{# templates/nginx.conf.j2 #}
{# Managed by Ansible - Do not edit manually #}
user {{ nginx_user | default('www-data') }};
worker_processes {{ nginx_worker_processes | default(ansible_processor_vcpus) }};
events {
worker_connections {{ nginx_worker_connections | default(1024) }};
}
http {
include mime.types;
default_type application/octet-stream;
{% if nginx_log_format is defined %}
log_format main '{{ nginx_log_format }}';
{% endif %}
{% for vhost in nginx_vhosts | default([]) %}
server {
listen {{ vhost.port | default(80) }};
server_name {{ vhost.name }};
root {{ vhost.root }};
{% if vhost.ssl | default(false) %}
listen 443 ssl;
ssl_certificate {{ vhost.ssl_cert }};
ssl_certificate_key {{ vhost.ssl_key }};
{% endif %}
}
{% endfor %}
}
Jinja2 关键模式:
{# 默认值过滤器 #}
{{ variable | default('fallback_value') }}
{# 条件块 #}
{% if ansible_os_family == "Debian" %}
apt_cache_valid_time: 3600
{% elif ansible_os_family == "RedHat" %}
yum_releasever: latest
{% endif %}
{# 遍历字典 #}
{% for key, value in config_dict.items() %}
{{ key }} = {{ value }}
{% endfor %}
{# 列表拼接 #}
{{ my_list | join(', ') }}
{# 大写 / 替换 #}
{{ service_name | upper | replace('-', '_') }}
E) 变量文件
变量优先级顺序(高 → 低):
extra vars (-e) # 最高优先级 task vars block vars role and include vars play vars host facts host_vars group_vars/all role defaults # 最低优先级
vault.yml 模式(存放敏感数据):
# group_vars/all/vault.yml # Encrypt with: ansible-vault encrypt vault.yml vault_db_password: "super_secret_password" vault_api_key: "abc123xyz" vault_ssl_cert_content: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
vars.yml(引用 vault 中的变量):
# group_vars/all/vars.yml
db_password: "{{ vault_db_password }}"
api_key: "{{ vault_api_key }}"
F) ansible.cfg
[defaults] inventory = ./inventory/hosts.yml roles_path = ./roles:~/.ansible/roles collections_paths = ./collections:~/.ansible/collections remote_user = deploy private_key_file = ~/.ssh/id_rsa host_key_checking = False retry_files_enabled = False stdout_callback = yaml callbacks_enabled = profile_tasks, timer interpreter_python = auto_silent # 性能调优 forks = 10 pipelining = True gathering = smart fact_caching = jsonfile fact_caching_connection = /tmp/ansible_facts fact_caching_timeout = 3600 [privilege_escalation] become = True become_method = sudo become_user = root become_ask_pass = False [ssh_connection] ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s control_path_dir = /tmp/.ansible/cp
第 3 步:完整项目结构
对于完整项目,请生成如下布局:
/ ├── ansible.cfg ├── requirements.yml # Galaxy roles/collections 依赖声明 ├── site.yml # 主 Playbook ├── playbooks/ │ ├── deploy.yml │ ├── rollback.yml │ └── maintenance.yml ├── roles/ │ └── / # 见上方 Role 骨架定义 ├── inventory/ │ ├── production/ │ │ ├── hosts.yml │ │ ├── group_vars/ │ │ └── host_vars/ │ └── staging/ │ ├── hosts.yml │ └── group_vars/ ├── collections/ │ └── requirements.yml ├── filter_plugins/ # 自定义 Jinja2 过滤器 ├── library/ # 自定义模块 └── .github/ └── workflows/ └── ansible-lint.yml # CI 验证流程
requirements.yml:
---
collections:
- name: community.general
version: ">=7.0.0"
- name: ansible.posix
- name: community.docker
version: "3.4.0"
roles:
- name: geerlingguy.nodejs
version: "6.1.0"
- src: https://github.com/org/role.git
scm: git
version: main
name: custom_role
第 4 步:验证与执行说明
所有生成内容末尾均须附加以下说明:
语法检查:
ansible-playbook playbooks/deploy.yml --syntax-check
模拟运行(不实际变更):
ansible-playbook playbooks/deploy.yml --check --diff
代码规范检查(需安装 ansible-lint):
pip install ansible-lint ansible-lint playbooks/deploy.yml
使用 Vault 执行:
ansible-playbook playbooks/deploy.yml --ask-vault-pass # 或指定 vault 密码文件: ansible-playbook playbooks/deploy.yml --vault-password-file ~/.vault_pass
限制执行范围(特定主机/主机组):
ansible-playbook site.yml --limit webservers ansible-playbook site.yml --limit web01.example.com
执行特定标签的任务:
ansible-playbook site.yml --tags deploy,configure ansible-playbook site.yml --skip-tags debug
Ad-hoc 命令示例:
# Ping 所有主机 ansible all -m ping # 收集主机事实 ansible webservers -m ansible.builtin.setup # 执行 Shell 命令 ansible databases -m ansible.builtin.shell -a "df -h" # 复制文件 ansible all -m ansible.builtin.copy -a "src=file.conf dest=/etc/file.conf"
最佳实践检查清单
务必始终遵循以下原则:
- ✅ FQCN:使用
ansible.builtin.copy,而非copy - ✅ 幂等性:每个任务都必须支持安全地重复执行
- ✅ 显式声明 state:资源类模块必须始终指定
state: - ✅ 避免不必要的 shell:优先使用原生模块,而非
shell/command - ✅ 重启交由 Handler 处理:禁止在 task 中内联重启服务
- ✅ 合理使用 tags:每个 task/block 都应设置 tag,便于选择性执行
- ✅ Vault 管理密钥:禁止以明文形式硬编码密码或密钥
- ✅ Role 所有变量均设默认值:每个 role 变量都应在 defaults/main.yml 中提供安全默认值
- ✅ 显式控制 changed_when / failed_when:对
shell/command类任务必须设置 - ✅ 条件判断基于 Ansible Fact:使用
when表达式,而非 shell 条件语句 - ✅ 统一头部注释:每个文件首行均为:
# Managed by Ansible
常用模块参考
| 任务 | 模块 |
|---|---|
| 安装软件包 | ansible.builtin.package |
| 复制文件 | ansible.builtin.copy |
| 渲染模板文件 | ansible.builtin.template |
| 管理服务 | ansible.builtin.service |
| 管理用户 | ansible.builtin.user |
| 执行命令 | ansible.builtin.command |
| 执行 Shell 命令 | ansible.builtin.shell |
| 管理文件/目录 | ansible.builtin.file |
| 编辑文件中的某行 | ansible.builtin.lineinfile |
| 下载文件 | ansible.builtin.get_url |
| 解压归档包 | ansible.builtin.unarchive |
| 管理定时任务 | ansible.builtin.cron |
| 管理防火墙 | ansible.posix.firewalld |
| Docker 容器管理 | community.docker.docker_container |
| Git 克隆 | ansible.builtin.git |
| 等待条件满足 | ansible.builtin.wait_for |
| 设置自定义 Fact | ansible.builtin.set_fact |
| 断言条件成立 | ansible.builtin.assert |
| 导入变量文件 | ansible.builtin.include_vars |
| 调试输出 | ansible.builtin.debug |
输出格式规范
交付 Ansible 制品时请遵守:
- 每个文件顶部必须注明完整路径,作为注释行
- 相关文件分组呈现,并使用清晰分隔符
- 对非常规设计决策进行内联说明,使用
# comment - 每份响应结尾必须提供可执行命令
- 明确标识敏感信息 —— 指出哪些位置需使用 ansible-vault 加密
- 一个代码块仅包含一个文件 —— 禁止将多个文件合并至同一代码块中
相关专题
本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。
0
2026.11.06
围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。
0
2026.11.06
详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。
0
2026.11.06
DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。
0
2026.11.05
DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。
0
2026.11.05
本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。
0
2026.11.04
本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。
0
2026.11.04
本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。
0
2026.11.04
本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。
0
2026.11.04
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.8万人学习
共6课时 | 54.7万人学习
最新文章