Bien, ya tenemos nuestro servidor Ansible on-premises o en la nube. Ahora vamos a comenzar a usarlo para desplegar algo en Azure.
az ad sp create-for-rbac --query '{"client_id": appId, "secret": password, "tenant": tenant}'
La salida se vera parecida a lo siguiente:
{
"client_id": "eexx6xxa-9xx8-4xx6-8xx7-0xx3xx5xx0d5",
"secret": "53xxcxxa-3xxf-4xx8-9xxb-48xxcxx5xx3f",
"tenant": "72xx8xxf-8xx1-4xxf-9xxb-2dxxd0xxdb47"
}
lo anotamos y luego vamos por la identificación de la subscripcion con el siguiente comando:
az account show --query "{ subscription_id: id }"
Luego en nuestro servidor Ansible vamos a crear un archivo credentials dentro de una carpeta .azure
mkdir .azure
vi .azure/credentials
Con el siguiente contenido:
[default]
subscription_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_id=eexxxxxa-9xx8-4xx6-8xx7-0xx30xx41xx5
secret=53xxcxxa-3xxf-4xx8-9xxb-48xxc3xxea3f
tenant=72xx88xf-8xx1-4xxf-9xxb-2dxxd0xxdbx7
Instalamos AZ Cli en nuestro Ansible Server, para eso comenzamos agregando el repositorio correspondiente:
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[azure-cli]\nname=Azure CLI\nbaseurl=https://packages.microsoft.com/yumrepos/azure-cli\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/azure-cli.repo'
sudo yum install azure-cli
sudo pip install packaging
sudo pip install msrestazure
sudo pip install ansible[azure]
Por ultimo vamos a crear algo en Azure mediante ansible-playbook.
Los módulos disponibles para utilizar Ansible con Azure son los modules azure_rm_xxxxx. Podemos ver la lista de modulos disponibles en el siguiente link:
https://docs.ansible.com/ansible/2.5/modules/list_of_all_modules.html
Dentro del archivo pegamos el siguiente contenido:
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create Resource Group
azure_rm_resourcegroup:
name: MyResourceGroup
location: westus2
- name: Create virtual network
azure_rm_virtualnetwork:
resource_group: myResourceGroup
name: myVnet
address_prefixes: "10.10.0.0/16"
- name: Add subnet
azure_rm_subnet:
resource_group: myResourceGroup
name: mySubnet
address_prefix: "10.10.1.0/24"
virtual_network: myVnet
- name: Create public IP address
azure_rm_publicipaddress:
resource_group: myResourceGroup
allocation_method: Static
name: myPublicIP
- name: Create Network Security Group that allows SSH
azure_rm_securitygroup:
resource_group: myResourceGroup
name: myNetworkSecurityGroup
rules:
- name: SSH
protocol: Tcp
destination_port_range: 22
access: Allow
priority: 1001
direction: Inbound
- name: Create virtual network inteface card
azure_rm_networkinterface:
resource_group: myResourceGroup
name: myNIC
virtual_network: myVnet
subnet: mySubnet
public_ip_name: myPublicIP
security_group: myNetworkSecurityGroup
- name: Create VM
azure_rm_virtualmachine:
resource_group: myResourceGroup
name: myVM
vm_size: Standard_DS1_v2
admin_username: azureuser
ssh_password_enabled: false
ssh_public_keys:
- path: /home/azureuser/.ssh/authorized_keys
key_data: "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAqfAwtlsoniNq0y9d+k910kBIELHSHKXRYMvAU6NbZxH5WCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
network_interfaces: myNIC
image:
offer: RHEL
publisher: RedHat
sku: '7.2'
version: latest
Lo importante a tener en cuenta es la configuracion host y connection la cual se debe mantener tal cual esta:
hosts: localhost
connection: local
Luego para cada subtarea dentro del playbook los parámetros son los requeridos por el modulo que corresponde, eso lo pueden consultar en la documentación de cada modulo, por ejemplo, para el modulo azure_rm_resourcegroup le definimos los parámetros name y location tal como sigue:
- name: Create Resource Group
azure_rm_resourcegroup:
name: MyResourceGroup
location: westus2
Cuando tenemos nuestro archivo Yaml creado corremos la tarea con ansible de la siguiente manera:
sudo ansible-playbook <playbook_name-yaml>
La salida debería ser algo parecido a la siguiente imagen:
Credenciales
Lo primero que debemos hacer es crear las credenciales para poder comunicar Ansible con nuestra subscripcion de Azure. Para eso vamos a usar la opción application registration del modulo de Active Directory de Azure. o mucho mas fácil ejecutando el siguiente comando desde la interfaz de comandos web de Azure.'az ad sp create-for-rbac --query '{"client_id": appId, "secret": password, "tenant": tenant}'
La salida se vera parecida a lo siguiente:
{
"client_id": "eexx6xxa-9xx8-4xx6-8xx7-0xx3xx5xx0d5",
"secret": "53xxcxxa-3xxf-4xx8-9xxb-48xxcxx5xx3f",
"tenant": "72xx8xxf-8xx1-4xxf-9xxb-2dxxd0xxdb47"
}
lo anotamos y luego vamos por la identificación de la subscripcion con el siguiente comando:
az account show --query "{ subscription_id: id }"
Luego en nuestro servidor Ansible vamos a crear un archivo credentials dentro de una carpeta .azure
mkdir .azure
vi .azure/credentials
Con el siguiente contenido:
[default]
subscription_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_id=eexxxxxa-9xx8-4xx6-8xx7-0xx30xx41xx5
secret=53xxcxxa-3xxf-4xx8-9xxb-48xxc3xxea3f
tenant=72xx88xf-8xx1-4xxf-9xxb-2dxxd0xxdbx7
Instalar modulo AZ Cli para Ansible
Instalamos AZ Cli en nuestro Ansible Server, para eso comenzamos agregando el repositorio correspondiente:
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[azure-cli]\nname=Azure CLI\nbaseurl=https://packages.microsoft.com/yumrepos/azure-cli\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/azure-cli.repo'
sudo yum install azure-cli
sudo pip install packaging
sudo pip install msrestazure
sudo pip install ansible[azure]
Por ultimo vamos a crear algo en Azure mediante ansible-playbook.
Los módulos disponibles para utilizar Ansible con Azure son los modules azure_rm_xxxxx. Podemos ver la lista de modulos disponibles en el siguiente link:
https://docs.ansible.com/ansible/2.5/modules/list_of_all_modules.html
Crear una VM en Azure mediante Ansible playboook
Creamos el archivo azure_create_vm.yaml con el siguiente comando:
sudo vi azure_create_vm.yaml
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create Resource Group
azure_rm_resourcegroup:
name: MyResourceGroup
location: westus2
- name: Create virtual network
azure_rm_virtualnetwork:
resource_group: myResourceGroup
name: myVnet
address_prefixes: "10.10.0.0/16"
- name: Add subnet
azure_rm_subnet:
resource_group: myResourceGroup
name: mySubnet
address_prefix: "10.10.1.0/24"
virtual_network: myVnet
- name: Create public IP address
azure_rm_publicipaddress:
resource_group: myResourceGroup
allocation_method: Static
name: myPublicIP
- name: Create Network Security Group that allows SSH
azure_rm_securitygroup:
resource_group: myResourceGroup
name: myNetworkSecurityGroup
rules:
- name: SSH
protocol: Tcp
destination_port_range: 22
access: Allow
priority: 1001
direction: Inbound
- name: Create virtual network inteface card
azure_rm_networkinterface:
resource_group: myResourceGroup
name: myNIC
virtual_network: myVnet
subnet: mySubnet
public_ip_name: myPublicIP
security_group: myNetworkSecurityGroup
- name: Create VM
azure_rm_virtualmachine:
resource_group: myResourceGroup
name: myVM
vm_size: Standard_DS1_v2
admin_username: azureuser
ssh_password_enabled: false
ssh_public_keys:
- path: /home/azureuser/.ssh/authorized_keys
key_data: "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAqfAwtlsoniNq0y9d+k910kBIELHSHKXRYMvAU6NbZxH5WCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
network_interfaces: myNIC
image:
offer: RHEL
publisher: RedHat
sku: '7.2'
version: latest
hosts: localhost
connection: local
Luego para cada subtarea dentro del playbook los parámetros son los requeridos por el modulo que corresponde, eso lo pueden consultar en la documentación de cada modulo, por ejemplo, para el modulo azure_rm_resourcegroup le definimos los parámetros name y location tal como sigue:
- name: Create Resource Group
azure_rm_resourcegroup:
name: MyResourceGroup
location: westus2
Cuando tenemos nuestro archivo Yaml creado corremos la tarea con ansible de la siguiente manera:
sudo ansible-playbook <playbook_name-yaml>
La salida debería ser algo parecido a la siguiente imagen: