¿Cómo instalar automáticamente los roles de Ansible Galaxy?

129

Todos mis libros de jugadas / roles de Ansible se registran en mi repositorio de git.

Sin embargo, para los roles de Ansible Galaxy siempre tengo que descargarlos explícitamente uno por uno en cada máquina desde la que quiero ejecutar Ansible.

Incluso es difícil saber de antemano exactamente qué roles de Ansible Galaxy son necesarios hasta que Ansible se queje de un rol faltante en tiempo de ejecución.

¿Cómo se supone que uno debe administrar las dependencias del rol Ansible Galaxy? Me gustaría hacer que se registren en mi repositorio de git junto con el resto de mi código ansible o que se identifiquen y descarguen automáticamente cuando ejecuto Ansible en una nueva máquina.

Pdeva
fuente
galaxy.ansible.com/docs/using/index.html Aquí hay todo lo que necesita para usar ansible-galaxy. ¡Es un documento bien hecho! Incluso si eres principiante :)
Ayra
@pdeva ¿Podría aceptar una de las respuestas válidas a continuación?
GG.

Respuestas:

148

Debe usar un requirements.ymlarchivo para este caso de uso. Describa los roles que necesita, utilizando cualquiera de los diversos métodos de instalación:

# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight

# Install a role from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight

# Install a role from a specific git branch
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: origin/master

# Install a role at a specific tag from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: 1.0.0

# Install a role at a specific commit from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: <commit hash>

Luego instálalos:

ansible-galaxy install -r requirements.yml

Aquí hay un ejemplo de trabajo (instalación de OpenDaylight usando Ansible como un aprovisionador vagabundo). Consulte los documentos relevantes de Ansible para obtener más información.

dfarrell07
fuente
Vea también la respuesta de @Kieran Andrews a continuación. Se expande este.
Marco Ferrari
1
En realidad, esto no está instalando automáticamente las dependencias de roles de un libro de jugadas, sino que está instalando explícitamente una lista de dependencias que el humano que hizo el libro de jugadas enumeró manualmente.
Neil
53

Como se sugiere, puede usar galaxia ansible para esta necesidad.

Ansible tiene una función donde puede crear un requirements.ymlarchivo que enumera todas sus funciones. Puede averiguar sobre eso aquí: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

Por ejemplo (require.yml):

- src: yatesr.timezone

Luego se ejecuta ansible-galaxy install -r requirements.ymlen este archivo para descargar todos los roles enumerados allí.

Si desea automatizarlo aún más, puede crear un script de shell simple que ejecute los dos comandos.

Por ejemplo (ansible.sh):

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 
Kieran Andrews
fuente
1
Recién probado, muestra un mensaje de que los roles ya están descargados, no hay error. Versión2.2.1
Igonato
Si el libro de jugadas hace uso de los roles de galaxias que está instalando, no se ejecutarán la primera vez que se invoque el libro de jugadas, ya que se verifica su presencia antes de que se hayan descargado. Llamar al libro de jugadas por segunda vez recogerá los roles recién instalados.
Ben
He actualizado a cómo lo he estado haciendo ahora, con un script de contenedor para reducir los comandos.
Kieran Andrews
19

A menudo me encuentro instalando instalando un JDK de Java. Usar un rol hace que ese toque sea más fácil. He intentado un par de formas diferentes (incluyendo muchos .gitmodules y submódulos ... Tengo que usar múltiples sistemas git para el trabajo y todo se vuelve feo). Mi mayor requisito es que no verifique el código de rol en mi proyecto de libro de jugadas, principalmente para poder mantener todo en un solo lugar.

El contenido de mi archivo 'require.yml':

- src: https://github.com/staylorx/ansible-role-wls-prep.git
  version: master
  name: staylorx.wls-prep

- src: https://my-work-git-extravaganza.com
  version: 2.x
  name: coolplace.niftyrole

#From Ansible Galaxy
- src: staylorx.oracle-jdk

Ejecuto un libro de jugadas separado, install-roles.yml:

---

- hosts: localhost

  tasks:
    - file:
        path:  roles
        state: absent

    - local_action:
        command ansible-galaxy install -r requirements.yml --roles-path roles

    - lineinfile:
        dest:   .gitignore
        regexp: '^\/roles$'
        line:   '/roles'
        state:  present

Ejecuto este primer libro de jugadas, luego ejecuto mis roles en cualquier libro de jugadas normalmente. Para mí, el secreto es asegurar que git lo ignore para que no revise los roles por error. Además, como elimino la carpeta cada vez, me aseguro de no tener que forzar o ignorar los errores.

staylorx
fuente
Fallará con 'rol no encontrado' incluso antes de ejecutar el comando local.
Daniel Andrei Mincă
1
@ Mincă Daniel Andrei necesita usar de forma dinámica, por ejemplo, include_role. revisa esto
user1686407
4

Otra solución es usar submódulos git. Después de todo, Ansible Galaxy solo es un directorio de repositorios de github ...

Uso este comando para agregar automáticamente cualquier rol Galaxy como submódulo:

ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh

Confirma los cambios en tu repositorio de git. Cuando clone su repositorio en el futuro, asegúrese de clonarlo con submódulos, p. Ej.git clone ... --recursive

Una ventaja de esto es que un submódulo git siempre hace referencia a una versión específica (git commit-hash). Esto evitará que ejecute actualizaciones no probadas en su entorno productivo. Una nueva versión de un rol Galaxy podría tener errores o funcionar completamente diferente que antes. Con un submódulo git, usted decide si y cuándo actualiza un rol a la nueva versión.

Además, no tendrá que ocuparse adicionalmente de incluir en la lista negra los roles de galaxias en su .gitignorepara evitar comprometer su código en su repositorio.

udondan
fuente
55
Esta es una mala práctica en mi opinión. Por lo general, es más sencillo usar herramientas de administración de dependencias que unir repositorios SCM, especialmente cuando hablamos de submódulos git para SCM.
David Resnick
1
Convenido. De hecho, ya no estoy usando esto. Aún así, es un enfoque válido ya que ansible-galaxy está lejos de ser perfecto. Galaxy no buscará actualizaciones, incluso si se incluye una versión en su archivo de requisitos, si la fuerza a volver a descargar todas las funciones con el --forceindicador indocumentado , no le mostrará si o qué cambió realmente. Es un cuadro negro que solo puede controlar si mantiene los roles de galaxia descargados en SCM. Sin embargo, por otras razones, es una buena idea. Al extraer submódulos, al menos, ve qué roles cambiaron.
udondan
Por cierto, todos los problemas que tienen los submódulos, AFAIK son insignificantes en esta situación porque están relacionados con la modificación de su contenido. Tirar está perfectamente bien por mi experiencia ..
udondan
4

Puede usar un rol Ansible para instalar los roles necesarios utilizando el módulo de comando .

Aquí hay un ejemplo muy básico que se ejecuta ansible-galaxy install:

- name: Install roles from Ansible Galaxy
  command: ansible-galaxy install {{ item.item }}
  with_items:
    - "{{ ansible_roles_list }}"

El ansible_roles_listpuede ser suministrado como una variable o como un parámetro de rol.

Si hace esto en un rol, debe aplicarse antes que cualquier otro rol que desee instalar usándolo, en un libro de jugadas separado. Esto se debe a que Ansible verifica si todos los roles están disponibles antes de ejecutar el libro de jugadas donde los referencia.

Marco Ferrari
fuente
huevo y pollo :)
bazeusz
2

En este momento, hasta donde yo sé, no hay una forma automática de descargar roles en tiempo de ejecución. Su mejor opción es comprometerlos en su propio repositorio o tener una documentación adecuada que enumere todos los requisitos. Incluso podría crear un libro de jugadas previo al vuelo que instale sus roles. :)

Mxx
fuente
3
Puede usar un archivo require.txt para esto. Ver: docs.ansible.com/…
toast38coza
0

Aquí, mis requisitos están en el rol y se usan en install.yml

main.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r {{ role_path }}/requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml
TJVerne
fuente