Skip to content
Back to skills

Ansible 1

CSecurity

Infrastructure automation for Proxmox lab services. USE WHEN deploying services, configuring VMs/LXCs, managing Docker stacks, or automating lab infrastructure.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 27, 2026
devopsgoshellbashdockerterraform

Security analysis

C71/100
  • criticalPipes output to a shell interpreter
  • mediumUses curl or wget to download content
  • criticalDownloads and executes remote scripts — classic supply chain attack

Pro scans all 4 files and shows the line behind each finding

Scanned September 27, 2026

npx -y skills add David-Li0406/meta-skill-evloving --skill ansible-1 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ansible 1?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ansible 1
[![Security: C — Skills Directory](https://www.skillsdirectory.com/api/skills/david-li0406-ansible-1/badge)](https://www.skillsdirectory.com/skills/david-li0406-ansible-1)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: Ansible
version: 1.0.0
description: Infrastructure automation for Proxmox lab services. USE WHEN deploying services, configuring VMs/LXCs, managing Docker stacks, or automating lab infrastructure.
---

# Ansible - Infrastructure as Code for Lab Services

**Declarative service deployment.** Ansible manages your Proxmox lab - VMs, LXCs, Docker stacks, NFS mounts, and secrets.

---

## Your Lab Pattern

Every service follows the same structure:

```
<service>/
├── ansible/
│   ├── playbook.yml      # Main entrypoint
│   ├── inventory.yml     # Target hosts
│   ├── vars.yml          # Service-specific variables (optional)
│   ├── vault.yml         # Encrypted secrets (optional)
│   ├── files/            # Static files (docker-compose.yml, configs)
│   ├── templates/        # Jinja2 templates (.j2)
│   └── roles/            # Reusable role (optional)
│       └── <service>/
│           ├── tasks/main.yml
│           ├── handlers/main.yml
│           └── files/
└── terraform/            # VM/LXC provisioning (if applicable)
```

**Run from service directory:**
```bash
cd /home/beau/src/personal/lab/<service>
ansible-playbook -i ansible/inventory.yml ansible/playbook.yml
```

---

## Philosophy: Idempotent by Default

Ansible's power is **idempotency** - run it once or 100 times, same result.

**Good (idempotent):**
```yaml
- name: Ensure Docker is installed
  apt:
    name: docker-ce
    state: present  # Only installs if missing
```

**Bad (not idempotent):**
```yaml
- name: Install Docker
  shell: curl -fsSL https://get.docker.com | sh  # Runs every time
```

If you MUST use `shell`/`command`, add `creates:` or `when:` guards:
```yaml
- name: Initialize something
  shell: /opt/init.sh
  args:
    creates: /opt/.initialized  # Skip if file exists
```

---

## Common Patterns

### 1. Docker Stack Deployment

Your standard pattern for services like arr, kestra, immich:

```yaml
- name: Deploy {{ service_name }}
  hosts: service
  become: yes

  tasks:
    - name: Create app directory
      file:
        path: /opt/{{ service_name }}
        state: directory
        owner: ansible
        group: ansible

    - name: Deploy docker-compose.yml
      copy:
        src: files/docker-compose.yml
        dest: /opt/{{ service_name }}/docker-compose.yml

    - name: Start services
      community.docker.docker_compose_v2:
        project_src: /opt/{{ service_name }}
        state: present
        pull: always
```

### 2. NFS Mount (from Proxmox ZFS)

```yaml
- name: Mount NFS share
  mount:
    path: /mnt/media
    src: "10.0.0.42:/tank/media"
    fstype: nfs
    state: mounted
    opts: defaults,_netdev
```

### 3. Vault for Secrets

```bash
# Create encrypted vault
ansible-vault create ansible/vault.yml

# Edit existing vault
ansible-vault edit ansible/vault.yml

# Run playbook with vault
ansible-playbook -i ansible/inventory.yml ansible/playbook.yml --ask-vault-pass
```

In playbook:
```yaml
pre_tasks:
  - name: Load vault secrets
    include_vars:
      file: vault.yml
    ignore_errors: yes
    no_log: yes
```

### 4. Health Check Pattern

```yaml
- name: Wait for service to be ready
  uri:
    url: http://localhost:8080
    status_code: [200, 302, 401]
  register: service_ready
  until: service_ready.status in [200, 302, 401]
  retries: 30
  delay: 5
  failed_when: false
```

---

## Inventory Patterns

### Single Host
```yaml
all:
  hosts:
    service:
      ansible_host: 10.0.0.155
      ansible_user: ansible
      ansible_become: yes
```

### Multi-Host with Groups
```yaml
all:
  children:
    proxmox:
      hosts:
        pve:
          ansible_host: 10.0.0.42
    services:
      hosts:
        arr:
          ansible_host: 10.0.0.155
        kestra:
          ansible_host: 10.0.0.153
```

---

## Quick Command Reference

```bash
# Dry run (check mode)
ansible-playbook -i inventory.yml playbook.yml --check

# Run specific tags
ansible-playbook -i inventory.yml playbook.yml --tags "docker,deploy"

# Limit to specific host
ansible-playbook -i inventory.yml playbook.yml --limit "arr"

# Extra variables
ansible-playbook -i inventory.yml playbook.yml -e "service_version=2.0"

# Verbose output
ansible-playbook -i inventory.yml playbook.yml -vvv
```

---

## Context Files

- `Philosophy.md` - Deep dive on idempotency, roles vs inline, when to abstract
- `Patterns.md` - Your lab-specific patterns, Docker, NFS, Proxmox integration
- `Reference.md` - Module quick reference for common tasks

---

## Decision Tree

```
What are you automating?
        │
        ├─→ New service? → Copy template-vm or template-lxc structure
        │
        ├─→ Single playbook task? → Inline in playbook.yml
        │
        ├─→ Reusable across services? → Extract to role
        │
        └─→ Secrets involved? → Use vault.yml + include_vars
```

Files in this skill

  • Patterns.md8.6 KB
  • Philosophy.md4.8 KB
  • Reference.md7.4 KB
  • SKILL.md4.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…