
Photo by Hush Naidoo Jade Photography on Unsplash
Are you tired of manually creating Ansible modules for every new tool, cloud service, or appliance you need to manage? Look no further than the Ansible Content Builder. This powerful Python tool can generate Ansible modules for any appliance or service with a network CLI, NETCONF, or OpenAPI. In this blog post, we'll show you how to use the Content Builder to scaffold your Ansible modules to create good, consistent content for your cloud platform of choice. We'll also explore how the Content Builder can help you onboard new tools and services into the Ansible ecosystem with ease. So if you're looking to supercharge your Ansible workflow and automate any cloud platform, this post is for you!
The Ansible Content Collections for hybrid cloud automation house multiple modules. These modules handle the creation, deletion, modification (and more) of cloud resources. While developing individual modules for different resources of the cloud platform can lead to modularity and ease of use, reinventing the wheel can be error-prone and time-consuming. Standardizing the common steps that are similar but differ based on limited parameters can solve many problems encountered while developing these modules. This is achieved by a scaffolding tool that sets up a baseline skeleton for the modules we intend to develop.
Content Builder is a tool developed to generate modules and plugins for different content verticals of Ansible. It supports networking, security, and cloud content. In this blog, we are going to look into cloud content generation in specific.
Amazon.cloud
modules are generated from the CloudFormation Resource Type Definition Schema or meta-schema. Vmware.vmware_rest
modules are generated using the vSphere REST API. The schema generated by these APIs is fed as input to this tool to generate the content.
Before the Content Builder tool, VMware generator, and Amazon cloud generator were used to generate the respective Collections. These generators are archived now.
Why Content Builder for cloud modules
The cloud Collections that this tool can generate are amazon.cloud
and vmware.vmware_rest
. Both these Collections are generated based on OpenAPI-based REST schemas. All the modules of amazon.cloud
collection use the AWS Cloud Control API to interact with the AWS services. This tool supports the generation of modules that are supported by the Cloud Control APIs. They follow the same code template the Content Builder scaffolds in a flash. The tool takes care of formatting the modules using Black. It is the same for VMware. VMware modules are based on the VMware vSphere REST API interface. Whenever a new version of the REST APIs is released, which may include support for new services for the platform, the Content Builder tool can be run to generate the new modules. Once the code is scaffolded, we can start with the automation almost immediately using the new modules.
How to use the Ansible Content Builder
The content_builder
tool takes a manifest file as input. This YAML file provides the necessary arguments for the tool to generate the cloud content. The manifest file for amazon.cloud
content generation looks like this:
manifest.yaml
---
collection:
path: collections/ansible_collections/amazon/cloud
namespace: amazon
name: cloud
plugins:
- type: module_openapi
name: "amazon_cloud"
content: cloud
api_object_path: api_spec
resource: config
action: generate_all
unique_key: ""
rm_swagger_json: ""
module_version: "1.0.0"
author: "Ansible Cloud Team"
For the VMware content, a few values from the above YAML file are changed to suit the VMware content generation.
manifest.yaml
---
collection:
path: collections/ansible_collections/VMware/vmware_rest
namespace: vmware
name: vmware_rest
plugins:
- type: module_openapi
name: "vmware_rest"
content: cloud
api_object_path: api_spec
resource: config
action: generate_all
unique_key: ""
rm_swagger_json: ""
module_version: "1.0.0"
author: "Ansible Cloud Team"
The following table explains what these key, value pairs in the manifest.yaml mean.
collection:path | Destination folder where the user wants the output of the scaffolding tool to be stored. |
collection:namespace | Ansible Content Collection org name. |
collection:name | Ansible Content Collection name. |
plugins:type | For cloud content generation, this value is set to module_openapi which scaffolds a cloud module generated using OpenApi JSON file. |
plugins:name | This is set to amazon_cloud or vmware_rest to differentiate between the 2 types of cloud contents. |
plugins:content | The content that the builder generates (values: cloud/security default: security). |
plugins:api_object_path | The path of the schema files. |
plugins:resource | The path of modules.yaml . This file lists the modules to be generated, in this format. |
plugins:action | The action that the builder is expected to perform to generate the cloud content (values: generate_schema, generate_modules, generate_examples, generate_ignore_files, generate_all ). |
plugins:module_version | The version of the module. |
plugins:author | The author of the module. |
Both plugins:unique_key
and plugins:rm_swagger_json
keys are irrelevant for the cloud content generation, but mandatory. In the future, these arguments will be made optional.
To generate the content, we use the following command:
ansible-playbook build.yaml -e manifest_file=manifest.yaml
build.yaml
---
- hosts: localhost
gather_facts: yes
roles:
- ansible.content_builder.run
Generation of amazon. cloud
The amazon.cloud
modules can be generated by listing the modules in modules.yaml
. Setting plugins: action
to generate_all
will result in the execution of generate_schema
, generate_modules
, and generate_examples
. These actions can be performed individually by specifying the respective action in the plugins: action
parameter. For the generate_modules
to be performed separately, the API specification JSON files should be present and the api_object_path
input argument should be set to the path. Similarly for the generate_examples
to be executed separately, the modules should be available, and the path to these modules should be given through the collection: path
parameter.
Following is the snippet from the execution of the content_builder
with the above-mentioned manifest file (amazon.cloud
) as input.
TASK [Generate cloud content] ******************************************************************************************************************************************
TASK [ansible.content_builder.module_openapi_cloud : Generate schema for "cloud"] **************************************************************************************
Collecting Schema
AWS::Backup::BackupVault
Collecting Schema
AWS::Backup::Framework
Collecting Schema
AWS::Backup::ReportPlan
Collecting Schema
AWS::EKS::Cluster
ok: [localhost]
TASK [ansible.content_builder.module_openapi_cloud : Generate modules for "cloud"] *************************************************************************************
Generating modules AWS_Backup_BackupVault
Generating modules AWS_Backup_Framework
Generating modules AWS_Backup_ReportPlan
Generating modules AWS_EKS_Cluster
ok: [localhost]
TASK [ansible.content_builder.module_openapi_cloud : Generate examples for "cloud"] ************************************************************************************
…….
<output trimmed>
………..
Updating eks_cluster
Updating eks_fargate_profile
Updating iam_server_certificate
Updating logs_log_group
Updating s3_bucket
ok: [localhost]
TASK [ansible.content_builder.module_openapi_cloud : Generate ignore files for "cloud"] ********************************************************************************
skipping: [localhost]
TASK [ansible.content_builder.module_openapi_cloud : Format the files in the collection using black] *******************************************************************
ok: [localhost -> 127.0.0.1]
The tool generates all the modules mentioned in modules.yaml
under collection:path
.
The JSON schema files will be generated under ./api_spec
(based on the given manifest file).
Generation of vmware.vmware_rest
Similar to amazon.cloud
, VMware modules can be generated by listing the modules in modules.yaml
and using the appropriate actions (generate_all
, generate_modules
, generate_examples
, and genrate_ignore_files
). For the VMware collection, the schema files are pre-generated using https://github.com/vmware/vmware-openapi-generator. The location of these schema files is provided to the content_builder
tool by setting api_spec
key to the respective value.
With the following pre-generated schema files, the generation of VMware modules using the Content Builder tool and the execution will look like the following.
Schema files:
api.json appliance.json cis.json content.json esx.json hvc.json __init__.py stats.json vapi.json vcenter.json
Execution output:
TASK [Generate cloud content] ******************************************************************************************************************************************
TASK [ansible.content_builder.module_openapi_cloud : Generate schema for "vmware_rest"] ********************************************************************************
skipping: [localhost]
TASK [ansible.content_builder.module_openapi_cloud : Generate modules for "vmware_rest"] *******************************************************************************
Generating modules from vcenter.json
- do not build: vcenter_authentication_token
….
<output trimmed>
………….
Generating modules from appliance.json
No parameters for get /api/appliance/system/time
- do not build: appliance_health_applmgmt
- do not build: appliance_health_database
- do not build: appliance_recovery_backup_schedules_update
- do not build: appliance_recovery_backup_validate
- do not build: appliance_recovery_restore_validate
ok: [localhost]
TASK [ansible.content_builder.module_openapi_cloud : Generate examples for "vmware_rest"] ******************************************************************************
….
<output trimmed>
……….
Hiding register _result.
Hiding register _result.
Hiding register _result.
Hiding register _vm_hardware_ethernet_2.
Hiding register _result.
Updating appliance_access_consolecli_info
Updating appliance_access_consolecli
Updating appliance_access_dcui_info
Updating appliance_access_dcui
….
<output trimmed>
……….
Updating appliance_networking_dns_hostname_info
Updating appliance_networking_dns_hostname
Updating appliance_networking_dns_servers_info
Updating appliance_networking_dns_servers
Updating appliance_networking_firewall_inbound_info
Updating appliance_networking_firewall_inbound
Updating appliance_networking_interfaces_ipv4_info
Updating appliance_networking_interfaces_ipv4
Updating appliance_networking_interfaces_ipv6_info
Updating appliance_networking_interfaces_ipv6
….
<output trimmed>
……….
Updating vcenter_vm_guest_networking_routes_info
Updating vcenter_vm_power_info
Updating vcenter_vm_guest_identity_info
Updating vcenter_vm_tools
ok: [localhost]
TASK [ansible.content_builder.module_openapi_cloud : Generate ignore files for "vmware_rest"] **************************************************************************
ok: [localhost]
TASK [ansible.content_builder.module_openapi_cloud : Format the files in the collection using black] *******************************************************************
ok: [localhost -> 127.0.0.1]
The vmware_rest
modules for the given schema files are generated under collection:path
.
This tool does not support the generation of ‘RETURN’ blocks for the VMware modules for now. These blocks can be generated by following these steps.
What’s next?
The plan for this tool is to extend the code scaffolding capabilities across different content verticals. In particular, for the REST API-based content generation, the plan is to extend the module_openapi
role to support the generation of other REST API-based Collections.
For more details on amazon.cloud
and vmware.vmware_rest
content generation, refer to
- https://github.com/ansible-collections/amazon.cloud
- https://github.com/ansible-collections/vmware.vmware_rest
- https://github.com/ansible-community/ansible.content_builder
What can we do to make the content_builder
tool more usable? What type of content generation do you want to add to this tool? We would love to hear from you. Please do give your feedback and suggestions by submitting an issue or pull requests here. You can also join us on the #ansible-aws
channel on Libera chat and #aws:ansible.com
on Matrix.
Where to go next
- Come visit us at AnsibleFest, now a part of Red Hat Summit 2023.
- Missed out on AnsibleFest 2022? Check out the Best of AnsibleFest 2022.
- Self-paced lab exercises - We have interactive, in-browser exercises to help you get started with the Ansible Automation Platform.
- Try the Ansible Automation Platform for free for 60 days.
Sobre o autor
Mais como este
Navegue por canal
Automação
Últimas novidades em automação de TI para empresas de tecnologia, equipes e ambientes
Inteligência artificial
Descubra as atualizações nas plataformas que proporcionam aos clientes executar suas cargas de trabalho de IA em qualquer ambiente
Nuvem híbrida aberta
Veja como construímos um futuro mais flexível com a nuvem híbrida
Segurança
Veja as últimas novidades sobre como reduzimos riscos em ambientes e tecnologias
Edge computing
Saiba quais são as atualizações nas plataformas que simplificam as operações na borda
Infraestrutura
Saiba o que há de mais recente na plataforma Linux empresarial líder mundial
Aplicações
Conheça nossas soluções desenvolvidas para ajudar você a superar os desafios mais complexos de aplicações
Programas originais
Veja as histórias divertidas de criadores e líderes em tecnologia empresarial
Produtos
- Red Hat Enterprise Linux
- Red Hat OpenShift
- Red Hat Ansible Automation Platform
- Red Hat Cloud Services
- Veja todos os produtos
Ferramentas
- Treinamento e certificação
- Minha conta
- Suporte ao cliente
- Recursos para desenvolvedores
- Encontre um parceiro
- Red Hat Ecosystem Catalog
- Calculadora de valor Red Hat
- Documentação
Experimente, compre, venda
Comunicação
- Contate o setor de vendas
- Fale com o Atendimento ao Cliente
- Contate o setor de treinamento
- Redes sociais
Sobre a Red Hat
A Red Hat é a líder mundial em soluções empresariais open source como Linux, nuvem, containers e Kubernetes. Fornecemos soluções robustas que facilitam o trabalho em diversas plataformas e ambientes, do datacenter principal até a borda da rede.
Selecione um idioma
Red Hat legal and privacy links
- Sobre a Red Hat
- Oportunidades de emprego
- Eventos
- Escritórios
- Fale com a Red Hat
- Blog da Red Hat
- Diversidade, equidade e inclusão
- Cool Stuff Store
- Red Hat Summit