domingo, mayo 27, 2018

Usar Ansible para instalar Python

Los módulos de Ansible están escritos en Python. Por lo tanto, si la máquina destino no tiene Python instalado, no se puede ejecutar hasta que no se instale. Ansible tiene la opción raw para poder ejecutar un comando usando la conexión ssh directamente, saltándose todo el sistema de módulos. El uso más normal de este comando es instalar Python para poder usar posteriormente el sistema de módulos. Un ejemplo de uso, es poder usar Ansible para provisionar una Ubuntu 16.04 instalada en EC2, ya que por defecto la ami que se usa no tiene Python. Si incluimos en nuestro playbook una tarea de este tipo:

  tasks:
    - name: install python 2
      raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
      become: yes

Sino encuentra el ejecutable de Python, nos instalará el mismo. Luego, podremos usar los módulos de Ansible como siempre. Un ejemplo completo de un playbook que despliega una máquina en EC2 usando la AMI de Ubuntu 16.04 y se instala python en la misma para poder usar el resto de los módulos. Las variables se pueden definir en un fichero de configuración y pasarlas con -e a ansible-playbook.

- name: Deploy EC2 machine and install python if no exists
  hosts: 127.0.0.1
  connection: local
  gather_facts: False
  tasks:
    - name: Create the security group
      ec2_group:
        name: "{{ec2securitygroup}}"
        description: Access
        rules:
          - proto: tcp
            ports:
              - 22
            cidr_ip: 0.0.0.0/0

    - name: Deploy the machine
      ec2:
        region: "{{ec2region}}"
        key_name: "{{ec2sshkey}}"
        instance_type: "{{ec2instancetype}}"
        image: "{{ec2ami}}"
        wait: yes
        count: 1
        group: "{{ec2securitygroup}}"
        vpc_subnet_id: "{{ec2subnetid}}"
      register: ec2

    - name: If EC2 exists, register its IP
      add_host:
         hostname: "{{item.public_ip}}"
         groups:
          - deployedMachines
      with_items: "{{ec2.instances|default([])}}"

    - name: Wait for SSH to come up
      wait_for:
          host: "{{item}}"
          port: 22
          delay: 10
          timeout: 60
          state: started
      with_items: "{{groups[\"deployedMachines\"]|default([])}}"


- name: Configure instance
  hosts: deployedMachines
  user: "{{remoteuser}}"
  gather_facts: False
  tasks:
    - name: install python 2
      raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
      become: yes
    - name: Update the system
      shell: apt-get update && apt-get -y install  python-apt
      become: yes


Las variables a definir en el fichero yaml de configuración son:

ec2machinename: Nombre de la máquina
ec2sshkey: Clave de la instancia que se va a usar.
ec2instancetype: Tipo de instancia
ec2region: Región de Amazon
ec2ami: "ami-43a15f3e" # Esta es la AMI de Ubuntu en us-east-1
ec2subnetid: ID de la subred donde se va a desplegar
ec2securitygroup: Nombre grupo de seguridad
remoteuser: "ubuntu" # Por defecto, el usuario de las AMI es este

No hay comentarios: