Criar um módulo personalizado com Ansible-Python

Módulos possíveis

Naves possíveis com um número de módulos (chamada ‘biblioteca de módulos’) que podem ser executados diretamente em hosts remotos ou através de Playbooks.

Os usuários também podem escrever seus próprios módulos. Estes módulos podem controlar recursos do sistema, como serviços, pacotes ou arquivos (qualquer coisa realmente), ou manipular a execução de comandos do sistema.

Por que criar seu próprio módulo?

Como dito anteriormente, ansible tem muitos módulos para executar várias tarefas. Mas ambientes diferentes podem ter requisitos diferentes onde você preferiria ter um módulo personalizado para lidar com o sistema ou ambiente ou projetar do seu próprio jeito.

Vamos entender como podemos criar um módulo personalizado de uma maneira fácil.

Estrutura de pastas

É importante conhecer a estrutura de pastas e arquivos antes de começarmos a criar um módulo personalizado. Confira abaixo a imagem para referência. O que precisamos trabalhar é em main.yaml e testing.py na pasta library.

root@ubuntu:~/ANSIBLEtesting# tree
.
└── playbooks
├── library
│ └── testing.py
└── main.yaml

2 directórios, 2 ficheiros

Escreva o seu primeiro programa python

Para escrever um possível pragmaticamente devemos compreender as utilidades do módulo. Ansible fornece um número de utilitários de módulo que fornecem funções de ajuda que você pode usar ao desenvolver seus próprios módulos. O utilitário módulo testing.py fornece o principal ponto de entrada para acessar a biblioteca Ansible, e todos os módulos Ansible devem, no mínimo, importar do testing.py.

from ansible.module_utils.basic import *

Isso irá importar todos os arquivos module_utils para criar um módulo personalizado. O formato de saída do arquivo python é apenas JSON. Então quando você imprime a saída de um arquivo python, ele terá que estar em JSON.

Key parts include always importing the boilerplate code from ansible.module_utils.basic like this:

from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()

Now instantiate the main class or you can write directly to the main class.

if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)

The AnsibleModule provides lots of common code for handling returns, parseses your arguments for you, and allows you to check inputs. Aqui seuNome é o input dado para o arquivo python. Este input será retirado de um playbook.

Os retornos bem sucedidos são feitos assim:

module.exit_json(changed=True, something_else=12345)

E as falhas são igualmente simples (onde msg é um parâmetro necessário para explicar o erro):

module.fail_json(msg="Something fatal happened")

O programa final python se parece com isto

#!/bin/env python
from ansible.module_utils.basic import *
import os, json
import re, sysdef firstProg(text):
text1 = "Hello " + text
return text1if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)

Ponha seu playbook pronto

Saberemos que usaremos o nome do módulo personalizado igual ao nome do arquivo python.

- hosts: all
remote_user: root
gather_facts: yes vars_prompt:
- name: giveName
prompt: "Please provide your name"
private: no
failed_when: giveName is undefined tasks:
- name: Python Execution
testing: yourName={{ giveName }}
register: result
- debug: var=result

Aqui o vars_prompt irá pedir-lhe um nome e o módulo de teste sob tarefa irá passar esse nome para o script python. Você pode adivinhar qual será a saída ? Vamos verificar.

ansible-playbook main.yaml

Conclusions

Pode verificar mais em detalhe sobre os módulos personalizados em Ansible Documentation. Há muito mais que pode ser feito com módulos personalizados.

Este artigo foi retirado directamente de www.9tocloud.com