Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save angeloxx/52ccbc1c584b103a2dab05089202e000 to your computer and use it in GitHub Desktop.
Save angeloxx/52ccbc1c584b103a2dab05089202e000 to your computer and use it in GitHub Desktop.
Export to Atlassian Confluence via API the list of vCenter VMs using Ansible

This small playbook:

  • get the list of registered VMs and dump in a temporary json file (tag discover)
  • create or edit a page on Confluence (tag report)

You can reuse the task confluence-page.yaml to generate automatically pages via Ansible

TBD: get vCPU and Memory

Usage:

ansible-playbook vm-inventory -t discover,report
This small playbook:
* get the list of registered VMs and dump in a temporary json file (tag discover)
* create or edit a page on Confluence (tag report)
You can reuse the task confluence-page.yaml to generate automatically pages via Ansible
- name: "Confluence | Get parent page '{{ confluence_parent_title }}' exists on {{ confluence_server }}"
uri:
url: "https://{{ confluence_server }}/rest/api/content/search/?cql=title=%22{{ title|urlencode }}%22&space={{ space|urlencode }}&expand=version"
method: GET
user: "{{ confluence_user }}"
password: "{{ confluence_pass }}"
force_basic_auth: yes
status_code: 200
register: confluence_parent
failed_when: confluence_parent.json.size == 0
vars:
title: "{{ confluence_parent_title }}"
space: "{{ confluence_page_space }}"
tags:
- always
- name: "Confluence | Check if page '{{ confluence_page_title }}' exists on {{ confluence_server }}"
uri:
url: "https://{{ confluence_server }}/rest/api/content/search/?cql=title=%22{{ title|urlencode }}%22&space={{ space|urlencode }}&expand=version"
method: GET
user: "{{ confluence_user }}"
password: "{{ confluence_pass }}"
force_basic_auth: yes
status_code: 200
register: confluence_validate
vars:
title: "{{ confluence_page_title }}"
space: "{{ confluence_page_space }}"
tags:
- always
- name: "Confluence | Create page {{ confluence_page_title }} on {{ confluence_server }}"
uri:
url: "https://{{ confluence_server }}/rest/api/content/"
method: POST
user: "{{ confluence_user }}"
password: "{{ confluence_pass }}"
body: "{{ lookup('template', 'new-page.json.j2') }}"
force_basic_auth: yes
status_code: 201,200
body_format: json
validate_certs: no
vars:
content: "{{ confluence_content }}"
title: "{{ confluence_page_title }}"
space: "{{ confluence_page_space }}"
parent_id: "{{ confluence_parent.json.results[0].id }}"
when: confluence_validate.json.size == 0
tags:
- always
- name: "Confluence | Update page {{ confluence_page_title }}, pageid {{ page_id|default('n.a.') }} on {{ confluence_server }}"
uri:
url: "https://{{ confluence_server }}/rest/api/content/{{ page_id }}"
method: PUT
user: "{{ confluence_user }}"
password: "{{ confluence_pass }}"
body: "{{ lookup('template', 'edit-page.json.j2') }}"
force_basic_auth: yes
status_code: 201,200
body_format: json
validate_certs: no
vars:
content: "{{ confluence_content }}"
title: "{{ confluence_page_title }}"
space: "{{ confluence_page_space }}"
page_id: "{{ confluence_validate.json.results[0].id }}"
parent_id: "{{ confluence_parent.json.results[0].id }}"
version: "{{ confluence_validate.json.results[0].version.number|int + 1 }}"
when: confluence_validate.json.size == 1
tags:
- always
{
"type":"page",
"title":"{{ title }}",
"id":"{{ page_id }}",
"space":{
"key":"{{ space }}"
},
"body":{
"storage":{"value":"{{ content|replace("\n","") }}","representation":"storage"}
},
"version":{"number":{{ version }}}
}
{
"type":"page",
"title":"{{ title }}",
"ancestors":[{"id": "{{ parent_id }}" }],
"space":{
"key":"{{ space }}"
},
"body":{
"storage":{"value":"{{ content|replace("\n","") }}","representation":"storage"}
}
}
- name: "Get credentials"
hosts:
- localhost
tasks:
- include_vars: vault.yaml
tags:
- always
- name: "Gather all registered virtual machines"
hosts: localhost
vars:
vcenter_host: "vcenter-server.domain.tld"
vcenter_user: "{{ ldap_readonly_username }}"
vcenter_pass: "{{ ldap_readonly_password }}"
confluence_server: "confluence-server.domain.tld"
confluence_user: "{{ atlassian_username }}"
confluence_pass: "{{ atlassian_password }}"
tasks:
- community.vmware.vmware_vm_info:
hostname: "{{ vcenter_host }}"
username: "{{ vcenter_user }}"
password: "{{ vcenter_pass }}"
validate_certs: no
register: vmlist
tags:
- never
- discover
- name: Gather some info from a guest using the vSphere API output schema
community.vmware.vmware_guest_disk_info:
hostname: "{{ vcenter_host }}"
username: "{{ vcenter_user }}"
password: "{{ vcenter_pass }}"
name: "{{ item.guest_name }}"
datacenter: "{{ item.datacenter }}"
#schema: "vsphere"
#properties: ["config.hardware.memoryMB", "guest.disk", "overallStatus"]
validate_certs: no
register: vms
with_items: "{{ vmlist.virtual_machines }}"
loop_control:
label: "{{ item.guest_name }}"
tags:
- never
- discover
- name: Create dump file
copy:
dest: "{{ vcenter_host }}.json"
content: "{{ vms | to_json }}"
tags:
- never
- discover
- name: "Load vars"
set_fact:
vms: "{{ lookup('file',vcenter_host +'.json') }}"
tags:
- never
- report
- name: Debug
debug:
msg:
- "{{ lookup('template', 'vm-list.json.j2') }}"
verbosity: 3
tags:
- never
- report
- name: "Confluence"
include_tasks: "tasks/confluence-page.yaml"
vars:
confluence_content: "{{ lookup('template', 'vm-list.json.j2') }}"
confluence_page_title: "VM {{ vcenter_host }}"
confluence_parent_title: "Inventory"
confluence_page_space: "MYSPACE"
tags:
- never
- report
<table>
<tr>
<th>Folder</th>
<th>VM Name</th>
<th>OS</th>
<th>Power State</th>
<th>Memory (TBD)</th>
<th>Disk #</th>
<th>Disk Total Size</th>
</tr>
{% for vm in vms.results|sort(attribute='item.folder') %}
<tr>
<td>{{ (vm.item.folder|upper).split("/")[3:]|join("/") }}</td>
<td>{{ vm.item.guest_name|upper }}</td>
<td>{{ vm.item.guest_fullname }}</td>
<td>{{ vm.item.power_state }}</td>
<td>vm.instance.config.hardware.memoryMB (TBD)</td>
<td>{{ vm.guest_disk_info|length }}</td>
{% set capacity = [0] -%}
{% for key,disk in vm.guest_disk_info.items() -%}
{% if (capacity.append(capacity.pop() + disk.capacity_in_kb)) -%}{% endif %}
{% endfor %}
<td>{{ (capacity[0] / 1024 / 1024 )|int }} GB</td>
</tr>
{% endfor %}
</table>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment