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


Todos mis libros de jugadas y roles de Ansible están registrados en mi git repo.

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

Incluso es difícil saber de antemano qué roles de Ansible Galaxy se necesitan hasta que Ansible se queja de un rol que falta en el tiempo de ejecución.

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


74
2017-08-10 15:56


origen


Respuestas:


Deberías usar un requirements.yml archivo para este caso de uso. Describa las funciones que necesita, usando cualquiera de una variedad de 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í está un ejemplo de trabajo (instalando OpenDaylight usando Ansible como un proveedor de Vagrant). Ver el documentos relevantes de Ansible para más información.


101
2018-05-11 20:01



Como se sugirió, puede usar la galaxia ansible para esta necesidad.

Ansible tiene una función donde puedes crear un requirements.yml archivo que enumera todos sus roles. Puede encontrarlo aquí: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

Por ejemplo (requirements.yml):

- src: yatesr.timezone

Luego corres ansible-galaxy install -r requirements.yml en este archivo para descargar todos los roles allí enumerados.

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

Por ejemplo (ansible.sh):

./ansibe.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 

34
2018-01-07 23:30



A menudo me encuentro instalando la instalación de un Java JDK. Usar una función hace que ese toque sea más fácil. He intentado un par de formas diferentes (incluidos muchos .gitmodules y submódulos ... Tengo que usar varios sistemas de git para el trabajo y todo se pone feo). Mi mayor exigencia es que no controlo el código de roles en mi proyecto de libro de jugadas, sobre todo para poder mantener todo en un solo lugar.

El contenido de mi archivo 'requirements.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 corro mis roles en cualquier libro de jugadas normalmente. Para mí, el secreto es asegurarme de que Git lo ignore, así que no verifico los roles por error. Además, dado que borro la carpeta cada vez, me aseguro de que no necesito forzar o ignorar los errores.


8
2018-02-10 15:27



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

Uso este comando para agregar automáticamente cualquier rol de Galaxy como un 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

Comprometa los cambios a tu repositorio git. Cuando clones tu repositorio en el futuro, asegúrate de clonarlo con submódulos, p. git clone ... --recursive

Una ventaja de esto es que un submódulo de 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 de Galaxy podría tener errores o funcionar completamente diferente a los anteriores. Con un submódulo de git usted decide si y cuándo actualiza una función a la nueva versión.

Además, no tendrá que encargarse adicionalmente de poner en lista negra los roles de galaxias en su .gitignore para evitar comprometer su código a su repositorio.


5
2018-05-12 09:07



En este momento, hasta donde sé, no hay 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 antes del vuelo que instale sus roles. :)


4
2017-08-11 04:38



Puede usar un rol de Ansible para instalar otros roles necesarios usando el módulo de mando.

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 }}"

los ansible_roles_list puede ser suministrado como una variable o como un parámetro de rol.

Implementé una función para esto, por lo que puede usar Ansible también para configurar (parte de) la máquina de control: https://galaxy.ansible.com/ferrarimarco/install-roles/.

Esta función debe ser aplicada antes de cualquier otro rol que desee instalar usándolo, en un libro de jugadas separado. Esto se debe a que Ansible comprueba si todos los roles están disponibles antes de ejecutar el libro de jugadas donde los referencia.


2
2018-04-04 09:09