Introducción a cloud-init

Implantación de Aplicaciones Web

1 Introducción a cloud-init

1.1 ¿Qué es cloud-init?

cloud-init es una utilidad que permite realizar la configuración inicial de una máquina virtual o una instancia que se ejecuta en un proveedor de cloud computing como AWS, Azure, OpenStack, entre otros.

Algunas de las tareas que se pueden realizar con cloud-init son crear usuarios, instalar paquetes de software, configurar redes, configurar claves SSH, etc.

cloud-init es un proyecto open source, liderado por Canonical que fue diseñado originamente para la distribución de Ubuntu de Amazon EC2, pero actualmente es compatible con la mayoría de distribuciones Linux y es utilizado por los principales de proveedores de cloud computing.

1.2 ¿Cómo puede un usuario especificar cuál es la configuración inicial deseada?

Al crear una instancia en un proveedor de cloud computing, suele existir un campo llamado user-data en el cual un usario puede indicar que se ejecute un script de configuración inicial. Este script puede ser:

  1. Un script de bash
  2. Un archivo YAML que contiene las instrucciones de configuración. A estos archivos YAML se les conoce como scripts cloud-config.

cloud-init también le permite a los proveedores de cloud computing indicar una configuración inicial a través de metadatos (vendor-data).

1.3 Archivos de configuración cloud-config

Los archivos de configuración cloud-config son archivos de texto plano en formato YAML que contienen las instrucciones de configuración inicial de la instancia.

Si no está familiarizado con el formato YAML, le recomiendo la lectura del tutorial Aprenda YAML en Y minutos.

Debe tener en cuenta que toda la información que se utiliza en los scripts de configuración YAML de cloud-init es accesible para cualquier usuario del sistema. Por lo tanto, se recomienda no incluir información confidencial, ni contraseñas en estos archivos de configuración en entornos de producción.

1.3.1 Ejemplo 1

En este ejemplo vamos a modificar la contraseña del usuario que esté configurado en la imagen como usuario por defecto. Además vamos a indicar que la contraseña no caduca y que se puede acceder por SSH con contraseña.

#cloud-config
password: nueva_password
chpasswd: { expire: False }
ssh_pwauth: True
  • La primera línea con el texto #cloud-config es obligatoria.
  • La clave password indica cuál será la nueva del usuario.
  • La clave chpasswd indica que la contraseña no caduca y no tiene que ser cambiada después de iniciar sesión la primera vez.
  • La calve ssh_pwauth indica que se habilita el acceso por SSH con contraseña.

1.3.2 Ejemplo 2

En este ejemplo vamos a modificar la contraseña del usuario root y del usuario ubuntu.

#cloud-config
ssh_pwauth: True
chpasswd:
  expire: False
  users:
   - name: root
     password: root
     type: text
   - name: ubuntu
     password: ubuntu
     type: text
  • El usuario root no puede acceder por SSH, sólo puede por la consola de Openstack. Esto se debe a que en la configuración por defecto de cloud-init se deshabilita el acceso por SSH al usuario root.

  • El usuario ubuntu puede acceder por SSH y por la consola de Openstack

1.3.3 Ejemplo 3

En este ejemplo vamos a instalar el servidor web nginx y vamos a iniciar el servicio.

#cloud-config
package_update: true
package_upgrade: true
packages:
  - nginx
runcmd:
  - systemctl start nginx
  • La línea package_update: true equivale a ejecutar apt update.
  • La línea package_upgrade: true equivale a ejecutar apt upgrade -y. Tenga en cuenta que esta operación puede tardar varios minutos en algunos casos.

1.3.4 Ejemplo 4

En este ejemplo vamos a realizar las siguientes acciones:

  • Configurar la contraseña del usuario del sistema que vamos a utilizar para conectarnos a la instancia por SSH.
  • Instalar los paquetes docker.io y docker-compose.
  • Habilitar el servicio de docker en el inicio del sistema.
  • Iniciar el servicio de docker.
  • Añadir el usuario ubuntu al grupo docker.
#cloud-config
password: nueva_password
chpasswd: { expire: False }
ssh_pwauth: True
package_update: true
package_upgrade: true
packages:
  - docker.io
  - docker-compose

runcmd:
  - systemctl enable docker
  - systemctl start docker
  - usermod -aG docker ubuntu

1.3.5 Ejemplo 5

En este ejemplo vamos a realizar las siguientes acciones:

  • Configurar la contraseña del usuario del sistema que vamos a utilizar para conectarnos a la instancia por SSH.
  • Instalar el servidor de base de datos MySQL.
  • Configurar el parámetro bind-address para permitir conexiones remotas.
  • Reiniciar el servicio de MySQL para que se apliquen los cambios de la configuración.
  • Crear un usuario para conectarnos a MySQL desde cualquier host.
#cloud-config
password: nueva_password
chpasswd: { expire: False }
ssh_pwauth: True
package_update: true
package_upgrade: true
packages:
  - mysql-server

runcmd:
  # Configuramos el parámetro bind-address para permitir conexiones remotas
  - sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
  
  # Reiniciamos el servicio de MySQL
  - systemctl restart mysql

  # Creamos un usuario para conectarnos a MySQL desde cualquier host
  - |
    mysql -e "CREATE USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'root';"
    mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';"
    mysql -e "FLUSH PRIVILEGES;"

1.4 Referencias

2 Licencia

Licencia de Creative Commons
Esta página forma parte del curso Implantación de Aplicaciones Web de José Juan Sánchez Hernández y su contenido se distribuye bajo una licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.