Files
ewnix-automation/roles/inventory/linode/tasks/main.yml
2025-08-07 14:23:08 -05:00

310 lines
9.9 KiB
YAML

---
# Main tasks for linode_inventory role
- name: Set API token (AWX credential injection takes precedence)
ansible.builtin.set_fact:
linode_api_token: "{{ linode_api_token | default(lookup('env', 'LINODE_API_TOKEN')) | default('') }}"
- name: Validate required variables
ansible.builtin.assert:
that:
- linode_api_token is defined
- linode_api_token | length > 0
fail_msg: |
Linode API token not found.
For AWX: Attach a Linode API Token credential to your job template
For local: Set LINODE_API_TOKEN environment variable or pass linode_api_token variable
quiet: true
- name: Ensure output directory exists
ansible.builtin.file:
path: "{{ linode_inventory_output_dir }}"
state: directory
mode: '0755'
delegate_to: localhost
- name: Copy Linode inventory script
ansible.builtin.copy:
src: linode_inventory.py
dest: "{{ linode_inventory_output_dir }}/linode_inventory.py"
mode: '0755'
delegate_to: localhost
- name: Execute Linode inventory script
ansible.builtin.command:
cmd: python3 {{ linode_inventory_output_dir }}/linode_inventory.py --list
environment:
LINODE_API_TOKEN: "{{ linode_api_token }}"
register: linode_inventory_result
delegate_to: localhost
changed_when: true
- name: Show script execution details
ansible.builtin.debug:
msg: |
Script execution results:
Return code: {{ linode_inventory_result.rc }}
Stdout length: {{ linode_inventory_result.stdout | length }}
Stderr length: {{ linode_inventory_result.stderr | length }}
- name: Show stderr if present
ansible.builtin.debug:
msg: "Script stderr: {{ linode_inventory_result.stderr }}"
when: linode_inventory_result.stderr | length > 0
- name: Show stdout if present
ansible.builtin.debug:
msg: "Script stdout: {{ linode_inventory_result.stdout }}"
when: linode_inventory_result.stdout | length > 0
- name: Test API token directly
ansible.builtin.uri:
url: "https://api.linode.com/v4/linode/instances"
method: GET
headers:
Authorization: "Bearer {{ linode_api_token }}"
Content-Type: "application/json"
return_content: yes
status_code: [200, 401, 403]
register: direct_api_test
delegate_to: localhost
- name: Display direct API test results
ansible.builtin.debug:
msg: |
Direct API test results:
Status: {{ direct_api_test.status }}
Response: {{ direct_api_test.json | default('No JSON response') }}
- name: Parse inventory JSON (only if stdout exists)
ansible.builtin.set_fact:
linode_inventory_data: "{{ linode_inventory_result.stdout | from_json }}"
when:
- linode_inventory_result.stdout | length > 0
- linode_inventory_result.rc == 0
- name: Set empty inventory if script failed
ansible.builtin.set_fact:
linode_inventory_data:
_meta:
hostvars: {}
all:
children: ['ungrouped']
ungrouped:
hosts: []
when: linode_inventory_data is not defined
- name: Save inventory to file
ansible.builtin.copy:
content: "{{ linode_inventory_data | to_nice_json }}"
dest: "{{ temp_inventory_path }}"
mode: '0644'
delegate_to: localhost
- name: Display inventory summary
ansible.builtin.debug:
msg: |
Linode Dynamic Inventory Summary:
Total hosts discovered: {{ linode_inventory_data._meta.hostvars | length }}
Groups created: {{ linode_inventory_data.keys() | reject('equalto', '_meta') | list | length }}
Inventory saved to: {{ temp_inventory_path }}
API Token status: {{ 'Set (' + (linode_api_token[:8] + '...' if linode_api_token | length > 8 else linode_api_token) + ')' if linode_api_token is defined else 'NOT SET' }}
- name: Show raw script output for debugging
ansible.builtin.debug:
var: linode_inventory_result.stdout
when: linode_inventory_result.stdout | length > 0
- name: Show discovered hosts
ansible.builtin.debug:
msg: "Host: {{ item.key }} ({{ item.value.ansible_host }}) - Region: {{ item.value.linode_region }} - Status: {{ item.value.linode_status }}"
loop: "{{ linode_inventory_data._meta.hostvars | dict2items }}"
loop_control:
label: "{{ item.key }}"
when: linode_inventory_data._meta.hostvars | length > 0
- name: Create inventory directory in project
ansible.builtin.file:
path: "/runner/project/inventory"
state: directory
mode: '0755'
delegate_to: localhost
- name: Create JSON inventory file in project
ansible.builtin.copy:
content: "{{ linode_inventory_data | to_nice_json }}"
dest: "/runner/project/inventory/linode_hosts.json"
mode: '0644'
delegate_to: localhost
when: linode_inventory_data is defined
- name: Debug current directory and Git status
ansible.builtin.shell: |
echo "Current directory: $(pwd)" &&
echo "Directory contents:" &&
ls -la &&
echo "Git status:" &&
git status 2>&1 || echo "Not a git repository" &&
echo "Git remote:" &&
git remote -v 2>&1 || echo "No git remotes"
register: debug_git_info
delegate_to: localhost
ignore_errors: true
- name: Display debug information
ansible.builtin.debug:
msg: |
Debug Git Information:
{{ debug_git_info.stdout }}
Git Config Result:
{{ git_config_result.stdout if git_config_result is defined else 'Not available' }}
Git Commit Result:
{{ git_commit_result.stdout if git_commit_result is defined else 'Not available' }}
- name: Check if inventory file was created
ansible.builtin.stat:
path: "inventory/linode_hosts.json"
register: inventory_file_check
delegate_to: localhost
- name: Display inventory file status
ansible.builtin.debug:
msg: |
Inventory file status:
- Path: inventory/linode_hosts.json
- Exists: {{ inventory_file_check.stat.exists }}
- Size: {{ inventory_file_check.stat.size | default(0) }} bytes
- Location: {{ ansible_env.PWD | default('unknown') }}/inventory/linode_hosts.json
- name: Show current Git status and try manual push
ansible.builtin.shell: |
echo "=== Current working directory ==="
pwd
echo "=== Git status ==="
git status
echo "=== Git log (last commit) ==="
git log --oneline -1
echo "=== Attempting to push ==="
git push origin HEAD 2>&1 || echo "Push failed - check SSH access"
register: manual_git_push
delegate_to: localhost
ignore_errors: true
when: inventory_file_check.stat.exists
- name: Display Git push results
ansible.builtin.debug:
msg: |
Manual Git Push Results:
{{ manual_git_push.stdout }}
Error (if any):
{{ manual_git_push.stderr | default('No errors') }}
when: manual_git_push is defined
- name: Initialize Git if needed and configure
ansible.builtin.shell: |
if [ ! -d ".git" ]; then
echo "Not in a git repository, checking for git in parent directories"
git_root=$(git rev-parse --show-toplevel 2>/dev/null || echo "")
if [ -n "$git_root" ]; then
cd "$git_root"
echo "Found git repository at: $git_root"
else
echo "No git repository found"
exit 0
fi
fi &&
git config user.email "awx@ewnix.net" &&
git config user.name "AWX Automation" &&
git remote set-url origin git@git.ewnix.net:phlux/ewnix-automation.git &&
echo "Git configured successfully"
register: git_config_result
delegate_to: localhost
ignore_errors: true
- name: Skip SSH test for now and proceed
ansible.builtin.debug:
msg: "Skipping SSH test to avoid hanging - will attempt Git operations directly"
- name: Create inventory directory
ansible.builtin.file:
path: "inventory"
state: directory
mode: '0755'
delegate_to: localhost
- name: Create JSON inventory file
ansible.builtin.copy:
content: "{{ linode_inventory_data | to_nice_json }}"
dest: "inventory/linode_hosts.json"
mode: '0644'
delegate_to: localhost
when: linode_inventory_data is defined
- name: Attempt to commit inventory (simplified)
ansible.builtin.shell: |
git_root=$(git rev-parse --show-toplevel 2>/dev/null || echo "")
if [ -n "$git_root" ]; then
cd "$git_root" &&
git add inventory/linode_hosts.json &&
if git diff --staged --quiet; then
echo "No changes to commit"
else
git commit -m "Update Linode inventory - $(date '+%Y-%m-%d %H:%M:%S') [AWX]" &&
echo "Inventory committed locally (push skipped for now)"
fi
else
echo "No git repository found - inventory file created but not committed"
fi
register: git_commit_result
delegate_to: localhost
ignore_errors: true
when:
- linode_inventory_data is defined
- push_to_git | default(true)
- name: Display Git operation result
ansible.builtin.debug:
msg: |
Git operation result:
Return code: {{ git_commit_result.rc }}
Output: {{ git_commit_result.stdout }}
Error: {{ git_commit_result.stderr | default('None') }}
when: git_commit_result is defined
- name: Trigger AWX project sync (if AWX API available)
ansible.builtin.uri:
url: "{{ awx_host | default('https://localhost') }}/api/v2/projects/{{ awx_project_id }}/update/"
method: POST
headers:
Authorization: "Bearer {{ awx_token }}"
Content-Type: "application/json"
body_format: json
body: {}
status_code: [200, 201, 202]
validate_certs: false
register: project_sync_result
delegate_to: localhost
ignore_errors: true
when:
- awx_api_integration | default(false)
- awx_token is defined
- awx_project_id is defined
- name: Display project sync result
ansible.builtin.debug:
msg: |
AWX Project sync triggered:
Status: {{ project_sync_result.status | default('Not attempted') }}
Response: {{ project_sync_result.json | default('No response') }}
when: project_sync_result is defined
- name: Clean up temporary script
ansible.builtin.file:
path: "{{ linode_inventory_output_dir }}/linode_inventory.py"
state: absent
delegate_to: localhost
when: cleanup_temp_files | default(true)