refactor ♻️: Refactoring the tasks directory to include new roles and tasks.
The commit updates the `tasks` directory by adding new roles (`rapbian_desktop_prov.yml`, `test_remote.yml`, `update_roles.sh`) and tasks within these roles. This refactoring enhances the organization and maintainability of the Ansible playbook.
This commit is contained in:
23
.gitignore
vendored
23
.gitignore
vendored
@@ -1,3 +1,24 @@
|
|||||||
# ---> Ansible
|
# Ansible specific (optional - ignore temporary output or secrets)
|
||||||
*.retry
|
*.retry
|
||||||
|
*.vault
|
||||||
|
*.vault_pass
|
||||||
|
*.secret
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# VSCode settings
|
||||||
|
.vscode/
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
|
# Windows system files
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
Desktop.ini
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
# Backup files
|
||||||
|
*~
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.tmp
|
||||||
12
requirements.yml
Normal file
12
requirements.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# requirements.yml
|
||||||
|
- name: samba_domain_member role
|
||||||
|
src: git+ssh://git@repo.piave7.duckdns.org/Jose/ansible_samba_domain_member.git
|
||||||
|
version: main
|
||||||
|
|
||||||
|
- name: samba_ad_dc role
|
||||||
|
src: git+https://repo.piave7.duckdns.org/Jose/ansible_samba_ad_dc.git
|
||||||
|
version: main
|
||||||
|
|
||||||
|
- name: samba_windows_share role
|
||||||
|
src: git+ssh@repo.piave7.dedyn.io:Jose/ansible_samba_windows_share.git
|
||||||
|
version: main
|
||||||
80
tasks/get_anible_ssh_pub_key.yml
Normal file
80
tasks/get_anible_ssh_pub_key.yml
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
- name: Read and display local SSH public key with user and host info
|
||||||
|
hosts: localhost
|
||||||
|
connection: local
|
||||||
|
gather_facts: true # Required to access ansible_user and ansible_hostname
|
||||||
|
|
||||||
|
vars:
|
||||||
|
ssh_key_type: "rsa"
|
||||||
|
public_key_path: "{{ lookup('env', 'HOME') + '/.ssh/id_' + ssh_key_type + '.pub' }}"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Check if SSH public key file exists
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: "{{ public_key_path }}"
|
||||||
|
register: ssh_key_file
|
||||||
|
tags: [check]
|
||||||
|
|
||||||
|
- name: Fail if SSH public key is missing
|
||||||
|
ansible.builtin.fail:
|
||||||
|
msg: "Public SSH key not found at {{ public_key_path }}."
|
||||||
|
when: not ssh_key_file.stat.exists
|
||||||
|
tags: [fail]
|
||||||
|
|
||||||
|
- name: Read SSH public key content
|
||||||
|
ansible.builtin.slurp:
|
||||||
|
src: "{{ public_key_path }}"
|
||||||
|
register: local_public_key
|
||||||
|
when: ssh_key_file.stat.exists
|
||||||
|
tags: [read]
|
||||||
|
|
||||||
|
- name: Get current user's UID
|
||||||
|
ansible.builtin.command: id -u
|
||||||
|
register: user_uid
|
||||||
|
changed_when: false
|
||||||
|
tags: [info]
|
||||||
|
|
||||||
|
- name: Get current user's GID
|
||||||
|
ansible.builtin.command: id -g
|
||||||
|
register: user_gid
|
||||||
|
changed_when: false
|
||||||
|
tags: [info]
|
||||||
|
|
||||||
|
- name: Get Docker host (default gateway) IP
|
||||||
|
ansible.builtin.shell: "ip route | awk '/default/ {print $3}'"
|
||||||
|
register: docker_host_ip
|
||||||
|
changed_when: false
|
||||||
|
tags: [host_ip]
|
||||||
|
|
||||||
|
- name: Try resolving host.docker.internal
|
||||||
|
command: getent hosts host.docker.internal
|
||||||
|
register: docker_dns_host
|
||||||
|
failed_when: false
|
||||||
|
changed_when: false
|
||||||
|
tags: [host_ip]
|
||||||
|
|
||||||
|
|
||||||
|
- name: Display SSH key with user and host information
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: |
|
||||||
|
SSH Public Key Info
|
||||||
|
---------------------
|
||||||
|
User : {{ ansible_user }}
|
||||||
|
User : {{ ansible_facts['user_id'] }}
|
||||||
|
UID : {{ user_uid.stdout }}
|
||||||
|
GID : {{ user_gid.stdout }}
|
||||||
|
Host : {{ ansible_hostname }}
|
||||||
|
IP Addr : {{ ansible_default_ipv4.address }}
|
||||||
|
IPs : {{ ansible_all_ipv4_addresses }}
|
||||||
|
Host : {{ ansible_facts['hostname'] }}
|
||||||
|
Docker Host IP: {{ docker_host_ip.stdout }}
|
||||||
|
Host.docker.internal resolves to: {{ docker_dns_host.stdout }}
|
||||||
|
Path : {{ public_key_path }}
|
||||||
|
|
||||||
|
Key:
|
||||||
|
{{ local_public_key.content | b64decode }}
|
||||||
|
tags: [show]
|
||||||
|
|
||||||
|
- name: Set decoded SSH public key as fact
|
||||||
|
set_fact:
|
||||||
|
decoded_ssh_key: "{{ local_public_key.content | b64decode }}"
|
||||||
|
tags: [read, set_fact]
|
||||||
65
tasks/get_ssh_key.sh
Normal file
65
tasks/get_ssh_key.sh
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "[DEBUG] Script started"
|
||||||
|
echo "Running as $(whoami)"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Force use of specific home directory
|
||||||
|
USER_HOME="/home/semaphore"
|
||||||
|
|
||||||
|
# Get current user home directory
|
||||||
|
# USER_HOME=$(eval echo ~${SUDO_USER:-$USER})
|
||||||
|
|
||||||
|
# Define default public key locations
|
||||||
|
KEY_FILES=(
|
||||||
|
"$USER_HOME/.ssh/id_rsa.pub"
|
||||||
|
"$USER_HOME/.ssh/id_ecdsa.pub"
|
||||||
|
"$USER_HOME/.ssh/id_ed25519.pub"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Loop through each key file to find the first one that exists
|
||||||
|
for key_file in "${KEY_FILES[@]}"; do
|
||||||
|
if [ -f "$key_file" ]; then
|
||||||
|
if [ -r "$key_file" ]; then
|
||||||
|
echo "✅ Public SSH key found at: $key_file"
|
||||||
|
echo
|
||||||
|
cat "$key_file"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "⚠️ Found public key at $key_file, but it's not readable (permission issue)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# If no public key was found, check for private key to regenerate the pub key
|
||||||
|
PRIVATE_KEY="$USER_HOME/.ssh/id_rsa"
|
||||||
|
if [ -f "$PRIVATE_KEY" ] && [ ! -f "${PRIVATE_KEY}.pub" ]; then
|
||||||
|
echo "Public key missing, but private key found. Regenerating .pub file..."
|
||||||
|
ssh-keygen -y -f "$PRIVATE_KEY" > "${PRIVATE_KEY}.pub"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Public key regenerated at: ${PRIVATE_KEY}.pub"
|
||||||
|
echo
|
||||||
|
cat "${PRIVATE_KEY}.pub"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "Failed to regenerate public key from private key." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If no keys at all, generate new one
|
||||||
|
echo "No SSH key found. Generating a new SSH key at: $PRIVATE_KEY"
|
||||||
|
mkdir -p "$USER_HOME/.ssh"
|
||||||
|
chmod 700 "$USER_HOME/.ssh"
|
||||||
|
|
||||||
|
ssh-keygen -t rsa -b 4096 -C "admin@localhost" -f "$PRIVATE_KEY" -N ""
|
||||||
|
|
||||||
|
# Output the new key
|
||||||
|
if [ -f "${PRIVATE_KEY}.pub" ]; then
|
||||||
|
echo
|
||||||
|
echo "New SSH key generated at: ${PRIVATE_KEY}.pub"
|
||||||
|
cat "${PRIVATE_KEY}.pub"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "Failed to generate SSH key." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
79
tasks/rapbian_desktop_prov.yml
Normal file
79
tasks/rapbian_desktop_prov.yml
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
- name: Install LDAP client and Bitwarden Extension on Raspbian Desktop
|
||||||
|
hosts: pi5
|
||||||
|
become: true
|
||||||
|
become_user: root
|
||||||
|
gather_facts: true
|
||||||
|
|
||||||
|
vars:
|
||||||
|
# System detection
|
||||||
|
is_raspbian_desktop: false
|
||||||
|
|
||||||
|
pre_tasks:
|
||||||
|
- name: Check if Raspbian Desktop (GUI) is installed
|
||||||
|
ansible.builtin.shell: dpkg -l | grep raspberrypi-ui-mods
|
||||||
|
register: raspbian_desktop_check
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
tags: [system_check]
|
||||||
|
|
||||||
|
- name: Check if Chromium is installed
|
||||||
|
ansible.builtin.shell: which chromium-browser || which chromium
|
||||||
|
register: chromium_check
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
tags: [system_check]
|
||||||
|
|
||||||
|
- name: Set fact if host is Raspbian Desktop
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
is_raspbian_desktop: true
|
||||||
|
when:
|
||||||
|
- ansible_distribution | lower in ['raspbian', 'debian']
|
||||||
|
- raspbian_desktop_check.rc == 0
|
||||||
|
- chromium_check.rc == 0
|
||||||
|
tags: [system_check]
|
||||||
|
|
||||||
|
- name: Verify LDAP password is set
|
||||||
|
assert:
|
||||||
|
that: ldap_bind_pw is defined
|
||||||
|
fail_msg: "ldap_bind_pw must be defined in vault file"
|
||||||
|
success_msg: "LDAP password verification successful"
|
||||||
|
when: is_raspbian_desktop
|
||||||
|
tags: [always]
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- role: bitwarden_chromium
|
||||||
|
when: is_raspbian_desktop
|
||||||
|
tags: [bitwarden]
|
||||||
|
|
||||||
|
- role: ldap-client
|
||||||
|
vars:
|
||||||
|
enable_auth: true
|
||||||
|
vault_ldap_password: "{{ ldap_bind_pw }}"
|
||||||
|
nss_services:
|
||||||
|
- passwd
|
||||||
|
- group
|
||||||
|
- shadow
|
||||||
|
when: is_raspbian_desktop
|
||||||
|
tags: [ldap]
|
||||||
|
|
||||||
|
# post_tasks:
|
||||||
|
# - name: Verify LDAP authentication
|
||||||
|
# block:
|
||||||
|
# - name: Test LDAP user lookup
|
||||||
|
# ansible.builtin.command: id "{{ test_ldap_user | default('testuser') }}"
|
||||||
|
# register: ldap_test
|
||||||
|
# changed_when: false
|
||||||
|
# failed_when: false
|
||||||
|
|
||||||
|
# - name: Show LDAP test results
|
||||||
|
# debug:
|
||||||
|
# msg: "LDAP user lookup {{ 'successful' if ldap_test.rc == 0 else 'failed' }}"
|
||||||
|
# when:
|
||||||
|
# - is_raspbian_desktop
|
||||||
|
# - enable_auth | default(true)
|
||||||
|
# tags: [test, ldap]
|
||||||
|
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# - install pavucontrol
|
||||||
23
tasks/test_remote.yml
Normal file
23
tasks/test_remote.yml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
- name: Gather and print relevant system facts
|
||||||
|
hosts: all
|
||||||
|
gather_facts: false # disable default full fact gathering
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Gather only selected facts
|
||||||
|
ansible.builtin.setup:
|
||||||
|
filter:
|
||||||
|
- ansible_hostname
|
||||||
|
- ansible_distribution
|
||||||
|
- ansible_distribution_version
|
||||||
|
- ansible_kernel
|
||||||
|
- ansible_architecture
|
||||||
|
- ansible_default_ipv4
|
||||||
|
|
||||||
|
- name: Show relevant facts
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg:
|
||||||
|
- "Hostname: {{ ansible_facts['hostname'] }}"
|
||||||
|
- "OS: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }}"
|
||||||
|
- "Kernel: {{ ansible_facts['kernel'] }}"
|
||||||
|
- "Architecture: {{ ansible_facts['architecture'] }}"
|
||||||
|
- "IP Address: {{ ansible_facts['default_ipv4']['address'] }}"
|
||||||
22
tasks/update_roles.sh
Normal file
22
tasks/update_roles.sh
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit on any error
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Define project root (one level up from tasks/)
|
||||||
|
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
REQUIREMENTS_FILE="$PROJECT_ROOT/requirements.yml"
|
||||||
|
ROLES_DIR="$PROJECT_ROOT/roles"
|
||||||
|
# ANSIBLE_CFG="$PROJECT_ROOT/ansible.cfg"
|
||||||
|
|
||||||
|
echo "🔧 [INFO] Running deployment from: $PROJECT_ROOT"
|
||||||
|
echo "📦 [INFO] Installing roles from: $REQUIREMENTS_FILE"
|
||||||
|
|
||||||
|
# Step 1: Install roles
|
||||||
|
ansible-galaxy install -r "$REQUIREMENTS_FILE" -p "$ROLES_DIR"
|
||||||
|
|
||||||
|
# # Step 2: Run playbook
|
||||||
|
# echo "🚀 [INFO] Running playbook: $PLAYBOOK_FILE"
|
||||||
|
# ANSIBLE_CONFIG="$ANSIBLE_CFG" ansible-playbook "$PLAYBOOK_FILE" -i "$INVENTORY_DIR"
|
||||||
|
|
||||||
|
echo "✅ [SUCCESS] Roles updated successfully from requirements."
|
||||||
Reference in New Issue
Block a user