Expand description
§Ansible-rs
A modern, type-safe Rust wrapper library for Ansible command-line tools.
This library provides a safe, ergonomic interface for executing Ansible commands,
playbooks, and managing Ansible configurations from Rust applications. It supports
all major Ansible tools including ansible
, ansible-playbook
, ansible-vault
,
ansible-config
, and ansible-inventory
.
§Features
- 🔒 Type-safe - Leverages Rust’s type system to prevent common configuration errors
- 🚀 Modern API - Uses builder patterns and fluent interfaces for ergonomic usage
- 🛡️ Comprehensive error handling - Detailed error types for different failure modes
- ⚡ Memory efficient - Optimized for minimal allocations and clones
- 🔧 Smart build system - Automatic Ansible detection and installation during build
- 🌍 Cross-platform - Supports Linux, macOS, and BSD systems
- 📚 Rust 2024 edition - Uses the latest Rust features and idioms
- 🧪 100% test coverage - Comprehensive test suite with property-based testing
§System Requirements
- Supported platforms: Linux, macOS, FreeBSD, OpenBSD, NetBSD
- Ansible: Version 2.9 or higher (automatically detected and installed)
- Python: Version 3.6 or higher (required by Ansible)
The build script will automatically detect and attempt to install Ansible if not present. See the installation guide for manual installation.
§Quick Start
§Basic Ansible Commands
use ansible::{Ansible, Module};
let mut ansible = Ansible::default();
ansible
.set_system_envs()
.filter_envs(["HOME", "PATH"])
.add_host("all")
.set_inventory("./hosts");
// Execute a ping
let result = ansible.ping()?;
println!("Ping result: {}", result);
// Execute a shell command
let result = ansible.shell("uptime")?;
println!("Uptime: {}", result);
§Playbook Execution
use ansible::{Playbook, Play};
let mut playbook = Playbook::default();
playbook.set_inventory("./hosts");
// Run from file
let result = playbook.run(Play::from_file("site.yml"))?;
println!("Playbook result: {}", result);
// Run from string content
let yaml_content = r#"
---
- hosts: all
tasks:
- name: Ensure nginx is installed
package:
name: nginx
state: present
"#;
let result = playbook.run(Play::from_content(yaml_content))?;
§Ansible Vault Operations
Manage encrypted files and strings with Ansible Vault:
use ansible::AnsibleVault;
let mut vault = AnsibleVault::new();
vault.set_vault_password_file("vault_pass.txt");
// Encrypt a file
vault.encrypt("secrets.yml")?;
// Decrypt a file
vault.decrypt("secrets.yml")?;
// Encrypt a string
let encrypted = vault.encrypt_string("my_secret_password")?;
println!("Encrypted: {}", encrypted);
§Configuration Management
Query and manage Ansible configuration:
use ansible::{AnsibleConfig, ConfigFormat, PluginType};
let mut config = AnsibleConfig::new();
// List all configuration options
let config_list = config.list()?;
println!("Configuration: {}", config_list);
// Dump configuration in JSON format
config.set_format(ConfigFormat::Json);
let config_dump = config.dump()?;
println!("Config dump: {}", config_dump);
// List specific plugin types
config.set_plugin_type(PluginType::Callback);
let callbacks = config.list()?;
§Inventory Management
Parse and query Ansible inventories:
use ansible::{AnsibleInventory, InventoryFormat};
let mut inventory = AnsibleInventory::new();
inventory
.set_inventory("hosts.yml")
.set_format(InventoryFormat::Json);
// List all hosts
let hosts = inventory.list()?;
println!("Hosts: {}", hosts);
// Get specific host information
let host_info = inventory.host("web01")?;
println!("Host info: {}", host_info);
// Parse inventory data
let inventory_data = inventory.parse_inventory_data()?;
for (group_name, group) in &inventory_data.groups {
println!("Group {}: {} hosts", group_name, group.hosts.len());
}
§System Requirements Validation
Check system compatibility and Ansible installation:
use ansible::{validate_system, get_system_info, PlatformValidator};
// Quick validation
validate_system()?;
// Detailed system information
let system_info = get_system_info()?;
println!("{}", system_info);
if system_info.is_fully_supported() {
println!("All Ansible features are available!");
} else {
println!("Missing features: {:?}", system_info.missing_features());
}
// Check individual components
if PlatformValidator::is_platform_supported() {
println!("Platform is supported");
}
§Error Handling
The library provides comprehensive error handling with detailed error types:
use ansible::{Ansible, AnsibleError};
let result = Ansible::default().ping();
match result {
Ok(output) => println!("Success: {}", output),
Err(AnsibleError::CommandFailed { message, exit_code, stdout, stderr }) => {
eprintln!("Command failed: {}", message);
if let Some(code) = exit_code {
eprintln!("Exit code: {}", code);
}
if let Some(stderr) = stderr {
eprintln!("Error: {}", stderr);
}
}
Err(AnsibleError::UnsupportedPlatform(msg)) => {
eprintln!("Platform not supported: {}", msg);
}
Err(e) => eprintln!("Other error: {}", e),
}
§Environment Variables
Control build-time behavior with environment variables:
SKIP_ANSIBLE_CHECK=1
- Skip Ansible installation check during buildANSIBLE_AUTO_INSTALL=true
- Enable automatic Ansible installationCI=1
- Disable interactive installation prompts in CI environmentsDOCS_RS=1
- Skip all checks when building documentation
§Module Organization
The library is organized into several modules:
- Core Ansible command execution and module management
- Ansible playbook execution and management
vault
- Ansible Vault encryption and decryption operationsconfig
- Ansible configuration querying and managementinventory
- Inventory parsing and host managementplatform
- System requirements validation and platform detectionerrors
- Comprehensive error types and handlingcommand_config
- Low-level command configuration utilities
§Examples
See the examples/
directory for complete working examples:
examples/basic.rs
- Basic Ansible commandsexamples/playbook.rs
- Playbook executionexamples/new_features_demo.rs
- Vault, config, and inventory featuresexamples/system_check.rs
- System requirements validationexamples/test_build.rs
- Build script functionality testing
Re-exports§
pub use errors::AnsibleError;
pub use errors::Result;
pub use vault::AnsibleVault;
pub use vault::VaultError;
pub use config::AnsibleConfig;
pub use config::ConfigFormat;
pub use config::PluginType;
pub use inventory::AnsibleInventory;
pub use inventory::InventoryFormat;
pub use inventory::InventoryData;
pub use inventory::InventoryGroup;
pub use inventory::InventoryMeta;
pub use platform::PlatformValidator;
pub use platform::SystemInfo;
pub use platform::validate_system;
pub use platform::get_system_info;
Modules§
- command_
config - Low-level command configuration utilities.
- config
- Ansible configuration querying and management.
- errors
- Comprehensive error handling for Ansible operations.
- inventory
- Ansible inventory parsing and host management.
- platform
- Platform compatibility and system requirements validation.
- vault
- Ansible Vault encryption and decryption operations.
Structs§
- Ansible
- Main Ansible command builder and executor.
- Playbook
- Ansible playbook executor with comprehensive configuration options.
Enums§
- File
State - File states for file management modules.
- Group
State - Group states for group management modules.
- Module
- Type-safe representation of Ansible modules with their arguments.
- Package
State - Package states for package management modules.
- Play
- Represents different sources of playbook content.
- Service
State - Service states for service management modules.
- User
State - User states for user management modules.