Ansible collection for managing devil shared hosting servers via a local UNIX domain socket.
This collection provides Ansible modules to manage various aspects of devil-type shared hosting servers including:
- DNS management - domains, records, templates
- Database management - MySQL, MongoDB, and PostgreSQL databases and users
- Web hosting - websites, applications, SSL certificates
- Email services - mailboxes, forwarders, aliases
- File services - FTP accounts, repositories
- System information - account details, limits, ports
All modules communicate with the devil daemon through a Unix domain socket, located at /var/run/devil2.sock
.
Since this collection is only available on GitHub (not on Ansible Galaxy), install it directly from the repository:
# Clone and install from the current directory
git clone https://github.com/devil-imps/devil-ansible.git
cd devil-ansible
ansible-galaxy collection install . --force
# Or install directly from GitHub
ansible-galaxy collection install git+https://github.com/devil-imps/devil-ansible.git --force
- The devil socket must be accessible at the specified path (default:
/var/run/devil2.sock
) - SSH access to the target devil host
---
- name: Basic devil server management
hosts: devil_servers
tasks:
- name: Get account information
devil_imps.devil.info:
query: account
register: account_info
- name: Create a MySQL database with user
devil_imps.devil.mysql:
name: myapp_db
user: myapp_user
password: "SecurePassword123!"
- name: Create a PHP website
devil_imps.devil.www:
name: example.com
type: php
- name: Add DNS A record
devil_imps.devil.dns:
domain: example.com
record: www
record_type: A
target: 192.0.2.10
Retrieve account information and limits.
- name: Get account information
devil_imps.devil.info:
query: account
- name: Get account limits
devil_imps.devil.info:
query: limits
List available IP addresses (private/public).
- name: List all IP addresses
devil_imps.devil.vhost:
- name: List only public IPs
devil_imps.devil.vhost:
type: public
Manage port reservations.
- name: Reserve a port
devil_imps.devil.port:
port: 8080
state: present
- name: List reserved ports
devil_imps.devil.port:
manage: list
Comprehensive DNS domain and record management.
# Domain management
- name: Create DNS domain with template
devil_imps.devil.dns:
domain: example.com
template: mail
- name: List all domains
devil_imps.devil.dns:
manage: list
- name: List available templates
devil_imps.devil.dns:
manage: templates
# Record management
- name: Add A record
devil_imps.devil.dns:
domain: example.com
record: www
record_type: A
target: 192.0.2.10
ttl: 3600
- name: Add MX record
devil_imps.devil.dns:
domain: example.com
record: "@"
record_type: MX
target: mail.example.com
priority: 10
- name: Add CNAME record
devil_imps.devil.dns:
domain: example.com
record: blog
record_type: CNAME
target: example.com
- name: Remove specific record by ID
devil_imps.devil.dns:
domain: example.com
record_id: "12345"
state: absent
MySQL database and user management with advanced features.
# Database operations
- name: Create database with user and privileges
devil_imps.devil.mysql:
name: myapp_db
user: myapp_user
password: "SecurePassword123!"
collate: utf8mb4_unicode_ci
- name: Create database only
devil_imps.devil.mysql:
name: analytics_db
# User management
- name: Create user with random password
devil_imps.devil.mysql:
manage: user
user: readonly_user
- name: Change user password
devil_imps.devil.mysql:
manage: password
user: myapp_user
password: "NewPassword456!"
# Access and privileges
- name: Add host access for user
devil_imps.devil.mysql:
manage: access
user: myapp_user
host: "192.168.1.%"
state: present
- name: Grant specific privileges
devil_imps.devil.mysql:
manage: privileges
user: readonly_user
name: myapp_db
privileges: "+SELECT +SHOW +VIEW"
- name: Grant all privileges
devil_imps.devil.mysql:
manage: privileges
user: admin_user
name: myapp_db
privileges: "+ALL"
- name: List databases and users
devil_imps.devil.mysql:
manage: list
PostgreSQL database and user management.
- name: Create PostgreSQL database
devil_imps.devil.pgsql:
name: myapp_db
- name: Create PostgreSQL user
devil_imps.devil.pgsql:
manage: user
user: myapp_user
password: "SecurePassword123!"
- name: List PostgreSQL resources
devil_imps.devil.pgsql:
manage: list
MongoDB database management.
- name: Create MongoDB database
devil_imps.devil.mongo:
name: myapp_db
- name: List MongoDB databases
devil_imps.devil.mongo:
manage: list
Comprehensive website and web application management.
# Basic websites
- name: Create PHP website
devil_imps.devil.www:
name: example.com
type: php
- name: Create pointer (redirect)
devil_imps.devil.www:
name: www.example.com
type: pointer
pointer_target: example.com
# Application hosting
- name: Create Python web application
devil_imps.devil.www:
name: app.example.com
type: python
passenger_binary: "/home/user/venv/bin/python"
environment: production
- name: Create Node.js application
devil_imps.devil.www:
name: api.example.com
type: nodejs
passenger_binary: "/home/user/.nvm/versions/node/v18.0.0/bin/node"
environment: development
- name: Create Ruby application
devil_imps.devil.www:
name: rails.example.com
type: ruby
passenger_binary: "/home/user/.rbenv/versions/3.0.0/bin/ruby"
environment: production
# Proxy configuration
- name: Create proxy to local service
devil_imps.devil.www:
name: proxy.example.com
type: proxy
proxy_target: localhost
proxy_port: 3000
# Domain options and management
- name: Set domain options
devil_imps.devil.www:
name: example.com
manage: options
option_name: gzip
option_value: "on"
- name: Restart passenger application
devil_imps.devil.www:
name: app.example.com
manage: restart
# Statistics (Matomo) management
- name: Create statistics user
devil_imps.devil.www:
manage: stats
stats_operation: account
stats_user: analytics_user
stats_password: "StatsPassword123!"
- name: Add domain to statistics
devil_imps.devil.www:
name: example.com
manage: stats
stats_operation: domain
state: present
- name: Grant user access to domain stats
devil_imps.devil.www:
name: example.com
manage: stats
stats_operation: access
stats_user: analytics_user
state: present
- name: List all websites
devil_imps.devil.www:
manage: list
SSL certificate management.
- name: Create LE SSL certificate
devil_imps.devil.ssl:
ip: "192.168.1.100"
domain: "example.com"
letsencrypt: true
- name: List SSL certificates
devil_imps.devil.ssl:
manage: list
- name: Remove SSL certificate
devil_imps.devil.ssl:
domain: example.com
state: absent
Email account and forwarding management.
# Mailbox management
- name: Create email account
devil_imps.devil.mail:
email: user@example.com
password: "EmailPassword123!"
- name: Change email password
devil_imps.devil.mail:
manage: password
email: user@example.com
password: "NewEmailPassword456!"
# Forwarding and aliases
- name: Create email forwarder
devil_imps.devil.mail:
manage: forward
email: info@example.com
target: admin@example.com
- name: Create catch-all forwarder
devil_imps.devil.mail:
manage: forward
email: "*@example.com"
target: admin@example.com
- name: List email accounts
devil_imps.devil.mail:
manage: list
FTP account management.
- name: Create FTP account
devil_imps.devil.ftp:
user: ftpuser
password: "FtpPassword123!"
path: "/home/user/public_html"
- name: List FTP accounts
devil_imps.devil.ftp:
manage: list
- name: Remove FTP account
devil_imps.devil.ftp:
user: ftpuser
state: absent
Repository management (Git, SVN, HG).
- name: Create Git repository
devil_imps.devil.repo:
name: myproject
type: git
- name: List repositories
devil_imps.devil.repo:
manage: list
All modules support these common parameters:
socket_path
(str): Path to devil socket (default:/var/run/devil2.sock
)
Most modules also support:
state
(str):present
orabsent
(default:present
)
The collection includes comprehensive error handling:
- name: Handle potential errors
devil_imps.devil.mysql:
name: test_db
register: result
failed_when: false
- name: Check if operation succeeded
debug:
msg: "Database creation {{ 'succeeded' if result.changed else 'failed or already exists' }}"
Contributions, issues, and feature requests are welcome! Feel free to check the issues page or submit a pull request.
This project is licensed under the GNU AFFERO GENERAL PUBLIC LICENSE License. See the LICENSE file for details.