Completed Issue #2: Ansible Base Configuration All objectives met: - ✅ Hetzner Cloud dynamic inventory (hcloud plugin) - ✅ Common role (SSH hardening, UFW firewall, fail2ban, auto-updates) - ✅ Docker role (Docker Engine + Compose + networks) - ✅ Traefik role (reverse proxy with Let's Encrypt SSL) - ✅ Setup playbook (orchestrates all base roles) - ✅ Successfully tested on live test server (91.99.210.204) Additional improvements: - Fixed ansible.cfg for Ansible 2.20+ compatibility - Updated ADR dates to 2025 - All roles follow Infrastructure Agent patterns Test Results: - SSH hardening applied (key-only auth) - UFW firewall active (ports 22, 80, 443) - Fail2ban protecting SSH - Automatic security updates enabled - Docker running with traefik network - Traefik deployed and ready for SSL Files added: - ansible/playbooks/setup.yml - ansible/roles/docker/* (complete) - ansible/roles/traefik/* (complete) Closes #2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
40 lines
844 B
INI
40 lines
844 B
INI
[defaults]
|
|
# Inventory configuration
|
|
inventory = hcloud.yml
|
|
host_key_checking = False
|
|
interpreter_python = auto_silent
|
|
|
|
# Performance
|
|
forks = 10
|
|
gathering = smart
|
|
fact_caching = jsonfile
|
|
fact_caching_connection = /tmp/ansible_facts
|
|
fact_caching_timeout = 86400
|
|
|
|
# Output
|
|
stdout_callback = default
|
|
result_format = yaml
|
|
bin_ansible_callbacks = True
|
|
display_skipped_hosts = False
|
|
|
|
# SSH
|
|
remote_user = root
|
|
private_key_file = ~/.ssh/ptt_infrastructure
|
|
timeout = 30
|
|
|
|
# Roles
|
|
roles_path = ./roles
|
|
|
|
[inventory]
|
|
# Enable Hetzner Cloud dynamic inventory plugin
|
|
enable_plugins = hetzner.hcloud.hcloud
|
|
|
|
[privilege_escalation]
|
|
become = True
|
|
become_method = sudo
|
|
become_user = root
|
|
become_ask_pass = False
|
|
|
|
[ssh_connection]
|
|
pipelining = True
|
|
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
|