Based on Franck Pachots Blog about the unexpected downtime of the always free tier Databases I wrote an ansible playbook which restarts all your free tier databases. Improvements are welcome.
The Playbook is very simple.
---
- name: Restart all Always Free DBs
hosts: localhost
connection: local
vars:
compartment_ocid: "ocid1.tenancy.oc1..aaaaaaaafks433vraror3fo5h2pdld75q6az2uwxvuw67onypqq7uvn6gmea"
tasks:
- name: Get details of the compartment
oci_compartment_facts:
compartment_id: "{{ compartment_ocid }}"
register: compartmentList
- name: Set Fact compartment_id list
set_fact:
compartmentIdList: "{{ compartmentList | to_json | from_json | json_query(query) }}"
vars:
query: "compartments[*].id"
- name: Get region details
oci_region_subscription_facts:
id: "{{ compartment_ocid }}"
register: regionSub
- name: Set Fact compartment_id list
set_fact:
regionSub: "{{ regionSub | to_json | from_json | json_query(query) }}"
vars:
query: "region_subscriptions[*].region_name"
- name: "OCI Autonomous Facts"
oci_autonomous_database_facts:
is_free_tier: True
compartment_id: "{{ item.0 }}"
region: "{{ item.1 }}"
loop: "{{ compartmentIdList | product(regionSub)|list}}"
register: alwaysFreeDBs
- name: Restart DBs
include_tasks: "oci_restart_db.yml"
vars:
DBList: "{{ item }}"
loop: "{{ alwaysFreeDBs.results }}"
when: item.autonomous_databases | length > 0
In the “Get details of the compartment” Task I get the list of all sub compartments to search for autonomous databases. Afterwards I generate a list of ids in the “Set Fact compartment_id list” task. Then I generate a list of all regions this tenancy is subscribed to (“Get region details”) and build a list of ids (“Set Fact compartment_id list”). With this information I am able to loop all compartments and regions to create a list of always free DBs (“OCI Autonomous Facts”).
With this information I can loop thru these always free dbs. This loop includes the tasks in the file oci_restart_db.yml.
And in the included tasks file I restart the databases:
- name: "Set Region Fact"
set_fact:
region: "{{ DBList.item[1] }}"
- name: Stop DB
oci_autonomous_database:
autonomous_database_id: "{{ stopDB.id }}"
compartment_id: "{{ stopDB.compartment_id }}"
state: 'stop'
region: "{{ region }}"
loop: "{{ DBList.autonomous_databases }}"
loop_control:
loop_var: stopDB
when:
- stopDB.lifecycle_state == 'AVAILABLE'
- stopDB.is_free_tier == True
- name: Stop DB
oci_autonomous_database:
autonomous_database_id: "{{ startDB.id }}"
compartment_id: "{{ startDB.compartment_id }}"
state: 'start'
region: "{{ region }}"
loop: "{{ DBList.autonomous_databases }}"
loop_control:
loop_var: startDB
when:
- startDB.is_free_tier == True
- startDB.lifecycle_state == 'AVAILABLE'