Implementing your own Ansible Azure Collection
In a recent azure ansible article I wrote (https://adrianhynes.medium.com/orchestrating-azure-resources-with-ansible-fa82f4e3dfd6), I came across a challenge, whereby listing resources in a resource group wasn’t real-time.
In that article I improvised by waiting and checking every minute until the resources eventually appeared. BUT that loop and sleep took ~20 minutes.
It turns out, the “/resources API is served from a regional cache from Azure Resource Manager, which is eventual consistent, and not real time” https://github.com/Azure/AKS/issues/1964
This means, in order to get a real time view of the resources in our resource group, we need to hit the regional azure management endpoint i.e. https://<region>.management.azure.com/
In this article, I want to show a simple way I’ve got around this by creating our own custom module.
Updating the Azure Ansible Collection
I’m going to do this through Azure Cloudshell, so at the time of writing, Ansible on Cloudshell is using Python 2.7, so first let’s install ansible for python 3
pip install ansible
Clone down the latest Azure Ansible Collection
git clone https://github.com/ansible-collections/azure.git
Install all the azure ansible collection dependencies
pip install -r azure/requirements-azure.txt
I’m going to create a new module, by coping azure_rm_resource_info.py
cp azure/plugins/modules/azure_rm_resource_info.py azure/plugins/modules/azure_rm_resource_info_rt.py
Now we’ll make a few changes, highlighted in bold
class AzureRMResourceInfoRT(AzureRMModuleBase)...self.module_arg_spec = dict(
...self.location = None...
def exec_module(self, **kwargs):
self.mgmt_client = self.get_mgmt_svc_client(GenericRestClient, base_url="https://"+self.location+".management.azure.com/")
See the full code for this module here: https://github.com/aido123/ansible/blob/main/azure_rm_resource_info_rt.py
Right we’re good to install/upgrade this Azure Ansible Collection.
#Generate collection tarball (--force to replace if ran previously)
ansible-galaxy collection build --force#Install the collection tarball (--force to reinstall)
ansible-galaxy collection install azure-azcollection-*.tar.gz --force
Now let’s give it a run. Create a simple Playbook called ans.yaml
- name: AKS Demo Ansible Playbook on Azure Cloud Shell
- name: List all VMScaleSets in the rsg1 Resource Group
until: vmssresources.response.name is defined
Now run the playbook
I hope you found this article useful and it gives you some ideas on creating your own azure ansible collection. Obviously you don’t want to have to reinstall the azure ansible module each time, so preferably you will create your own collection (extend azure_rm_common.py) that you can install independently.