feat: add Ansible support and improve inventory
- Added a new Python script to dynamically handle Ansible playbook executions with password prompts. - Enhanced `inventory.yml` by defining explicit `ansible_name` and `ansible_host` for each host to improve manageability. - Introduced `.gitignore` to omit `venv/` and `.vscode/` directories from version control, ensuring a cleaner repository. - Updated `apt.yml` playbook to unify update and upgrade tasks, using `ansible.builtin.apt`. - Created `requirements.txt` to manage Python dependencies, including `ansible`, `ansible-lint`, and `pyyaml`. These changes streamline the management of Ansible hosts and execution of playbooks, aligning with best practices for ongoing development.
This commit is contained in:
parent
317b88a26a
commit
63be88788e
5 changed files with 134 additions and 10 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
venv/
|
||||||
|
.vscode/
|
|
@ -3,12 +3,54 @@ all:
|
||||||
children:
|
children:
|
||||||
debian:
|
debian:
|
||||||
hosts:
|
hosts:
|
||||||
lardlad:
|
burns:
|
||||||
|
ansible_name: burns
|
||||||
|
ansible_host: 10.123.1.1
|
||||||
selma:
|
selma:
|
||||||
edna:
|
ansible_name: selma
|
||||||
|
ansible_host: 10.123.1.3
|
||||||
|
lardlad:
|
||||||
|
ansible_name: lardlad
|
||||||
|
ansible_host: 10.123.1.4
|
||||||
|
lance:
|
||||||
|
ansible_name: lance
|
||||||
|
ansible_host: 10.123.1.5
|
||||||
chimpman:
|
chimpman:
|
||||||
|
ansible_name: chimpman
|
||||||
|
ansible_host: 10.123.1.6
|
||||||
|
edna:
|
||||||
|
ansible_name: edna
|
||||||
|
ansible_host: 10.123.1.7
|
||||||
|
nelson:
|
||||||
|
ansible_name: nelson
|
||||||
|
ansible_host: 10.123.1.8
|
||||||
|
hannah:
|
||||||
|
ansible_name: hannah
|
||||||
|
ansible_host: 10.123.1.9
|
||||||
|
marge:
|
||||||
|
ansible_name: marge
|
||||||
|
ansible_host: 10.123.1.10
|
||||||
|
andy:
|
||||||
|
ansible_name: andy
|
||||||
|
ansible_host: 10.123.1.11
|
||||||
|
herman:
|
||||||
|
ansible_name: herman
|
||||||
|
ansible_host: 10.123.1.12
|
||||||
frink:
|
frink:
|
||||||
|
ansible_name: frink
|
||||||
|
ansible_host: 10.123.1.13
|
||||||
homer:
|
homer:
|
||||||
zwergente:
|
ansible_name: homer
|
||||||
|
ansible_host: 10.123.1.14
|
||||||
smaragdente:
|
smaragdente:
|
||||||
|
ansible_name: smaragdente
|
||||||
|
ansible_host: 10.123.2.1
|
||||||
|
zwergente:
|
||||||
|
ansible_name: zwergente
|
||||||
|
ansible_host: 10.123.2.2
|
||||||
pekingente:
|
pekingente:
|
||||||
|
ansible_name: pekingente
|
||||||
|
ansible_host: 10.123.2.3
|
||||||
|
stockente:
|
||||||
|
ansible_name: stockente
|
||||||
|
ansible_host: 10.123.2.4
|
||||||
|
|
79
playbook.py
Normal file
79
playbook.py
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
import yaml
|
||||||
|
import subprocess
|
||||||
|
import json
|
||||||
|
from getpass import getpass
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
def parse_arguments():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Ansible-playbook wrapper for dynamic password input."
|
||||||
|
)
|
||||||
|
parser.add_argument("playbook", help="The path to the Ansible playbook.")
|
||||||
|
parser.add_argument(
|
||||||
|
"-i",
|
||||||
|
"--inventory",
|
||||||
|
default="inventory.yml",
|
||||||
|
help="The path to the inventory file.",
|
||||||
|
)
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
def load_playbook_targets(playbook_path):
|
||||||
|
# Load the playbook YAML and extract the hosts
|
||||||
|
with open(playbook_path, "r") as f:
|
||||||
|
playbook_data = yaml.safe_load(f)
|
||||||
|
|
||||||
|
return playbook_data[0].get("hosts", [])
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_inventory(inventory_path):
|
||||||
|
inventory_json = subprocess.check_output(
|
||||||
|
["ansible-inventory", "-i", inventory_path, "--list"]
|
||||||
|
)
|
||||||
|
return json.loads(inventory_json)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = parse_arguments()
|
||||||
|
playbook_targets = load_playbook_targets(args.playbook)
|
||||||
|
inventory = fetch_inventory(args.inventory)
|
||||||
|
|
||||||
|
# Determine targeted hosts
|
||||||
|
targeted_hosts = set()
|
||||||
|
|
||||||
|
if isinstance(playbook_targets, str):
|
||||||
|
if playbook_targets in inventory:
|
||||||
|
targeted_hosts.update(inventory[playbook_targets]["hosts"])
|
||||||
|
elif playbook_targets == "all":
|
||||||
|
targeted_hosts.update(inventory["_meta"]["hostvars"].keys())
|
||||||
|
elif isinstance(playbook_targets, list):
|
||||||
|
targeted_hosts.update(playbook_targets)
|
||||||
|
|
||||||
|
# Validate targeted hosts against inventory
|
||||||
|
valid_hosts = set(inventory["_meta"]["hostvars"].keys())
|
||||||
|
targeted_hosts.intersection_update(valid_hosts)
|
||||||
|
|
||||||
|
# Process each targeted host
|
||||||
|
for host in targeted_hosts:
|
||||||
|
print(f"Processing host: {host}")
|
||||||
|
become_pass = getpass(f"Enter become password for {host}: ")
|
||||||
|
|
||||||
|
# Execute Ansible playbook for each host
|
||||||
|
subprocess.run(
|
||||||
|
[
|
||||||
|
"ansible-playbook",
|
||||||
|
"-i",
|
||||||
|
args.inventory,
|
||||||
|
"--limit",
|
||||||
|
host,
|
||||||
|
args.playbook,
|
||||||
|
"--extra-vars",
|
||||||
|
f"ansible_become_pass={become_pass}",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -1,12 +1,10 @@
|
||||||
---
|
---
|
||||||
- name: Update and upgrade all Debian hosts
|
- name: Update and upgrade all Debian hosts
|
||||||
hosts: debian
|
hosts: debian
|
||||||
become: yes
|
become: true
|
||||||
tasks:
|
|
||||||
- name: Update apt cache
|
|
||||||
apt:
|
|
||||||
update_cache: yes
|
|
||||||
|
|
||||||
- name: Upgrade all packages
|
tasks:
|
||||||
apt:
|
- name: Apt update and upgrade
|
||||||
|
ansible.builtin.apt:
|
||||||
|
update_cache: true
|
||||||
upgrade: dist
|
upgrade: dist
|
||||||
|
|
3
requirements.txt
Normal file
3
requirements.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
ansible
|
||||||
|
ansible-lint
|
||||||
|
pyyaml
|
Loading…
Reference in a new issue