ansible-expert — скилл для Claude Code: что делает и как установить
Скилл помогает писать плейбуки Ansible, настраивать инвентари и шаблоны Jinja2. Пригодится при автоматизации серверов и оркестрации инфраструктуры.
npx skills add personamanagmentlayer/pcl --skill ansible-expert -a claude-codeЧто делает ansible-expert
Скилл даёт правила по автоматизации серверов и работе с Ansible. Он помогает собирать статические инвентари в форматах INI и YAML, писать динамические скрипты для AWS EC2 и готовить шаблоны Jinja2. Агент опирается на декларативный синтаксис. Внутри описана обработка ошибок через блоки block, rescue и always.
Инструкция учитывает 17 уровней приоритета переменных — от дефолтов ролей до флагов командной строки. Для работы в терминале открыты только утилиты ansible, ansible-playbook и ansible-galaxy. Без локально установленного пакета ansible запустить сгенерированные плейбуки агент не сможет.
Какие задачи решает
- структурировать статические и динамические инвентари хостов
- написать плейбук с обработкой ошибок через block и rescue
- подготовить Jinja2-шаблон конфигурации сервиса с переменными
- разобраться с приоритетом переменных в ролях и плейбуках
Примеры запросов агенту
- Сгенерируй YAML-инвентарь для серверов баз данных и веб-узлов с общими переменными окружения
- Напиши плейбук для деплоя сервиса с проверкой условий через assert и блоком rescue
- Сделай Jinja2-шаблон для app.conf с параметрами Redis и дефолтными значениями
Как установить ansible-expert
1Через Skills CLI (Vercel)
npx skills add personamanagmentlayer/pcl --skill ansible-expert -a claude-code2Вручную: положить файлы
~/.claude/skills/ansible-expert/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/ansible-expert/
1Через Skills CLI (Vercel)
npx skills add personamanagmentlayer/pcl --skill ansible-expert -a codex2Вручную: положить файлы
.agents/skills/ansible-expert/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add personamanagmentlayer/pcl --skill ansible-expert -a cursor2Вручную: положить файлы
.cursor/skills/ansible-expert/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install personamanagmentlayer/pcl ansible-expert2Вручную: положить файлы
.github/skills/ansible-expert/SKILL.md1Через Skills CLI (Vercel)
npx skills add personamanagmentlayer/pcl --skill ansible-expert -a gemini-cli2Командой платформы
gemini skills install https://github.com/personamanagmentlayer/pcl --path stdlib/devops/ansible-expertВручную: положить файлы
.devin/skills/ansible-expert/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add personamanagmentlayer/pcl --skill ansible-expert -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о ansible-expert
Как установить ansible-expert в Claude Code?
Выполните команду npx skills add personamanagmentlayer/pcl --skill ansible-expert -a claude-code. Также можно поместить файл скилла вручную в путь ~/.claude/skills/ansible-expert/SKILL.md.
Какие команды терминала разрешено выполнять этому скиллу?
В Bash доступны только утилиты ansible, ansible-playbook и ansible-galaxy. Доступ к остальным системным командам через инструмент заблокирован.
Что делает скилл ansible-expert?
Он предоставляет ИИ-агенту контекст для создания плейбуков, ролей, инвентарей и шаблонов Jinja2. Скилл также задаёт правила обработки сбоев и учёта приоритетов переменных.
Исходный текст
SKILL.md · Apache-2.0
---
name: ansible-expert
version: 1.1.0
description: >-
Expert-level Ansible for configuration management, automation, and infrastructure as
code. Use when the user mentions automation, configuration management, infrastructure as
code, playbooks, or roles, or when the task involves Ansible Architecture, Basic
Inventory, YAML Inventory, or Dynamic Inventory.
category: devops
tags: [ansible, automation, configuration-management, iac, playbooks, roles]
allowed-tools:
- Read
- Write
- Edit
- Bash(ansible:*, ansible-playbook:*, ansible-galaxy:*)
---
# Ansible Expert
Expert guidance for Ansible - configuration management, application deployment, and IT automation using declarative YAML playbooks.
## Core Concepts
### Ansible Architecture
- Control node (runs Ansible)
- Managed nodes (target systems)
- Inventory (hosts and groups)
- Playbooks (YAML automation scripts)
- Modules (units of work)
- Roles (reusable automation units)
- Plugins (extend functionality)
### Key Features
- Agentless (SSH-based)
- Idempotent operations
- Declarative syntax
- Human-readable YAML
- Extensible with modules
- Push-based configuration
- Parallel execution
### Use Cases
- Configuration management
- Application deployment
- Provisioning
- Continuous delivery
- Security automation
- Orchestration
## Installation
```bash
# Using pip
pip install ansible
# Using apt (Ubuntu/Debian)
sudo apt update
sudo apt install ansible
# Using yum (RHEL/CentOS)
sudo yum install ansible
# Verify installation
ansible --version
```
## Inventory
### Basic Inventory (INI format)
```ini
# inventory/hosts
[webservers]
web1.example.com
web2.example.com ansible_host=192.168.1.10
[databases]
db1.example.com ansible_user=dbadmin
db2.example.com
[production:children]
webservers
databases
[production:vars]
ansible_python_interpreter=/usr/bin/python3
ansible_connection=ssh
```
### YAML Inventory
```yaml
# inventory/hosts.yml
all:
children:
webservers:
hosts:
web1.example.com:
web2.example.com:
ansible_host: 192.168.1.10
databases:
hosts:
db1.example.com:
ansible_user: dbadmin
db2.example.com:
production:
children:
webservers:
databases:
vars:
ansible_python_interpreter: /usr/bin/python3
ansible_connection: ssh
```
### Dynamic Inventory
```python
#!/usr/bin/env python3
# inventory/aws_ec2.py
import json
import boto3
def get_inventory():
ec2 = boto3.client('ec2', region_name='us-east-1')
response = ec2.describe_instances(Filters=[
{'Name': 'instance-state-name', 'Values': ['running']}
])
inventory = {
'_meta': {'hostvars': {}},
'all': {'hosts': []},
'webservers': {'hosts': []},
'databases': {'hosts': []},
}
for reservation in response['Reservations']:
for instance in reservation['Instances']:
ip = instance['PrivateIpAddress']
tags = {tag['Key']: tag['Value'] for tag in instance.get('Tags', [])}
inventory['all']['hosts'].append(ip)
inventory['_meta']['hostvars'][ip] = {
'ansible_host': ip,
'instance_id': instance['InstanceId'],
'instance_type': instance['InstanceType'],
}
# Group by role tag
role = tags.get('Role', '')
if role in inventory:
inventory[role]['hosts'].append(ip)
return inventory
if __name__ == '__main__':
print(json.dumps(get_inventory(), indent=2))
```
## Templates (Jinja2)
```jinja2
{# templates/app.conf.j2 #}
# Application configuration for {{ app_name }}
# Generated by Ansible on {{ ansible_date_time.iso8601 }}
[server]
host = {{ ansible_default_ipv4.address }}
port = {{ app_port }}
workers = {{ ansible_processor_vcpus }}
[database]
host = {{ db_host }}
port = {{ db_port }}
name = {{ db_name }}
user = {{ db_user }}
password = {{ db_password }}
[cache]
enabled = {{ cache_enabled | default(true) | lower }}
{% if cache_enabled | default(true) %}
backend = redis
redis_host = {{ redis_host }}
redis_port = {{ redis_port }}
{% endif %}
[features]
{% for feature, enabled in features.items() %}
{{ feature }} = {{ enabled | lower }}
{% endfor %}
{% if environment == 'production' %}
[production]
debug = false
log_level = warning
{% else %}
[development]
debug = true
log_level = debug
{% endif %}
```
## Variables and Facts
### Variable Precedence (low to high)
1. Role defaults
2. Inventory file/script group vars
3. Inventory group_vars/all
4. Playbook group_vars/all
5. Inventory group_vars/\*
6. Playbook group_vars/\*
7. Inventory file/script host vars
8. Inventory host_vars/\*
9. Playbook host_vars/\*
10. Host facts
11. Play vars
12. Play vars_prompt
13. Play vars_files
14. Role vars
15. Block vars
16. Task vars
17. Extra vars (-e flag)
### Using Variables
```yaml
---
- name: Variable examples
hosts: all
vars:
app_name: myapp
app_version: 1.0.0
vars_files:
- vars/common.yml
- 'vars/{{ environment }}.yml'
tasks:
- name: Load variables from file
include_vars:
file: 'vars/{{ ansible_distribution }}.yml'
- name: Set fact
set_fact:
full_app_name: '{{ app_name }}-{{ app_version }}'
- name: Register output
command: hostname
register: hostname_output
- name: Use registered variable
debug:
msg: 'Hostname is {{ hostname_output.stdout }}'
- name: Access facts
debug:
msg: |
OS: {{ ansible_distribution }} {{ ansible_distribution_version }}
Kernel: {{ ansible_kernel }}
CPU: {{ ansible_processor_vcpus }} cores
Memory: {{ ansible_memtotal_mb }} MB
IP: {{ ansible_default_ipv4.address }}
```
## Error Handling
```yaml
---
- name: Error handling examples
hosts: all
tasks:
- name: Task that might fail
command: /bin/false
ignore_errors: yes
- name: Task with custom error handling
block:
- name: Try to start service
systemd:
name: myapp
state: started
rescue:
- name: Log error
debug:
msg: 'Failed to start myapp'
- name: Try alternative
systemd:
name: myapp-fallback
state: started
always:
- name: This always runs
debug:
msg: 'Cleanup task'
- name: Assert condition
assert:
that:
- ansible_memtotal_mb >= 2048
- ansible_processor_vcpus >= 2
fail_msg: 'Server does not meet minimum requirements'
- name: Fail when condition
fail:
msg: 'Production deployment requires version tag'
when:
- environment == 'production'
- app_version == 'latest'
- name: Changed when condition
command: /usr/local/bin/check_status.sh
register: result
changed_when: "'updated' in result.stdout"
failed_when: result.rc not in [0, 2]
```
## Ansible Vault
```bash
# Create encrypted file
ansible-vault create secrets.yml
# Edit encrypted file
ansible-vault edit secrets.yml
# Encrypt existing file
ansible-vault encrypt vars/production.yml
# Decrypt file
ansible-vault decrypt vars/production.yml
# View encrypted file
ansible-vault view secrets.yml
# Rekey (change password)
ansible-vault rekey secrets.yml
```
```yaml
# secrets.yml - what `ansible-vault view secrets.yml` shows you.
# On disk this file is ciphertext; it is only ever plaintext in memory and in
# your editor during `ansible-vault edit`. Never commit the decrypted form.
---
db_password: "{{ lookup('env', 'DB_PASSWORD') }}"
api_key: "{{ lookup('env', 'API_KEY') }}"
ssl_key: "{{ lookup('env', 'SSL_PRIVATE_KEY') }}"
# The same file at rest, after `ansible-vault encrypt`:
# $ANSIBLE_VAULT;1.1;AES256
# 66386439653236336462626566653063336164663966303231363934653561363964363833313662
# ...
# Use in playbook
---
- name: Deploy with secrets
hosts: production
vars_files:
- secrets.yml
tasks:
- name: Configure database
template:
src: db.conf.j2
dest: /etc/db.conf
no_log: yes # Don't log sensitive data
```
```bash
# Run playbook with vault password
ansible-playbook playbook.yml --ask-vault-pass
# Use password file
ansible-playbook playbook.yml --vault-password-file ~/.vault_pass
# Use multiple vault IDs
ansible-playbook playbook.yml --vault-id prod@prompt --vault-id dev@~/.vault_dev
```
## Testing
### Molecule (Role Testing)
```bash
# Install molecule
pip install molecule molecule-docker
# Initialize molecule
cd roles/myapp
molecule init scenario
# Run tests
molecule test
# Test workflow
molecule create # Create test instances
molecule converge # Run playbook
molecule verify # Run tests
molecule destroy # Cleanup
```
```yaml
# molecule/default/molecule.yml
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: ubuntu
image: geerlingguy/docker-ubuntu2004-ansible
pre_build_image: yes
provisioner:
name: ansible
verifier:
name: ansible
```
## Anti-Patterns to Avoid
❌ **Not using roles**: Organize code in reusable roles
❌ **Shell commands everywhere**: Use modules when available
❌ **Hardcoded values**: Use variables
❌ **No error handling**: Use blocks, rescue, always
❌ **Storing secrets in plaintext**: Use Ansible Vault
❌ **Not testing**: Use molecule for role testing
❌ **Ignoring idempotency**: Tasks should be safe to run multiple times
❌ **Complex playbooks**: Break into smaller, focused playbooks
## Reference Documentation
Detailed material lives alongside this skill and is read on demand:
- [Best Practices](references/BEST_PRACTICES.md) — Playbook Organization, Idempotency, Performance, Security
- [Playbooks](references/PLAYBOOKS.md) — Basic Playbook, Advanced Playbook, Conditionals and Loops
- [Roles](references/ROLES.md) — Role Structure, Example Role, Role Dependencies
## Resources
- Ansible Documentation: https://docs.ansible.com/
- Ansible Galaxy: https://galaxy.ansible.com/
- Molecule: https://molecule.readthedocs.io/
- Best Practices: https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html
© personamanagmentlayer · Apache-2.0 · personamanagmentlayer/pcl