raffienficiaud.ansible_atlassian_bambooagent_role

Rol de Ansible Atlassian BambooAgent

Este rol realiza lo necesario para ejecutar un agente remoto de Atlassian Bamboo en una máquina objetivo.

El rol lleva a cabo las siguientes acciones:

  • crea el usuario que ejecuta el agente de Bamboo,
  • instala el certificado del servidor de Bamboo para que sea posible descargar el archivo jar del agente de Bamboo directamente desde el servidor sin eludir ninguna seguridad (opcional).
  • crea los scripts de inicio para el agente de Bamboo, completa rutas adicionales (herramientas de construcción) y opciones adicionales (ya sea del sistema como CUDA_VISIBLE_DEVICES o configuraciones adicionales del agente de Bamboo).
  • registra el script de inicio del agente de Bamboo para que se inicie al arrancar el sistema.
  • registra un servicio de inicio automático en el sistema operativo.
  • completa las capacidades del agente.
  • cambia la carpeta de construcción y el nombre del agente.

Requisitos

Java debe estar instalado en el sistema operativo de destino. Considera usar el rol ansible-atlassian-bambooagent-oracle-java para esto.

Variables del rol

Las siguientes variables deben establecerse para el rol.

variable predeterminado significado
bamboo_server_url "" (cadena vacía) Indica la URL de tu instancia de Bamboo. Debe establecerse.
bambooagent_user bambooagent el usuario que ejecuta el agente de Bamboo
bambooagent_group bambooagent_grp el grupo al que pertenece el usuario del agente de Bamboo
bambooagent_service_name bambooagent el nombre del servicio que ejecuta el agente de Bamboo. Esto aparecerá como el servicio para comandos de inicio y apagado del administrador
bambooagent_install_root /home/{{ bambooagent_user }} la carpeta raíz donde se instalarán todos los programas/scripts del agente (iniciadores, otros programas locales). Esta puede ser la carpeta de inicio del agente, aunque contendrá la carpeta de construcción bajo bambooagent_agent_root.
bambooagent_agent_root {{ bambooagent_install_root }}/bamboo-agent-home la carpeta raíz para los archivos específicos para ejecutar el agente de Bamboo (el archivo .jar, el envoltorio, etc).
bambooagent_version 5.11.1.1 la versión del agente
bamboo_java_jar_file "" (cadena vacía) El archivo .jar del lanzador del agente de Bamboo. Si está vacío (predeterminado), el rol intentará obtener este archivo directamente del servidor de Bamboo. Ten en cuenta que esto se refiere al que tiene el envoltorio del servicio.
bambooagent_jar_filename atlassian-bamboo-agent-installer-{{ bambooagent_version }}.jar el archivo jar en el agente remoto
bambooagent_jar_filename_full_path {{ bambooagent_install_root }}/{{ bambooagent_jar_filename }} la ubicación completa del archivo jar en el agente remoto
bambooagent_capability_file {{ bambooagent_agent_root }}/bin/bamboo-capabilities.properties la ubicación del archivo de capacidades en el remoto
bambooagentjava_additional_options
  • -Djava.awt.headless=true
  • -Dbamboo.home={{ bambooagent_agent_root }}
opciones adicionales pasadas a la máquina virtual de Java. Esta debe ser una lista
bambooagent_additional_environment [] (lista vacía) variables de entorno adicionales establecidas antes de ejecutar el agente de Bamboo (por ejemplo, CUDA_VISIBLE_DEVICES=1). Esta debe ser una lista
certificate_files [] Lista de definición de certificados (ver abajo).
bamboo_verify_certificates True verifica los certificados del servidor al obtener el archivo JAR de este.

Java

La versión del agente debe funcionar bien con el Java instalado. Por ejemplo, la versión 5.11 del agente de Bamboo requiere Java 8. El JAVA_HOME se establece automáticamente en OSX durante el inicio del agente.

Capacidad de Bamboo

Una capacidad específica puede ser declarada automáticamente por el agente utilizando una característica de Atlassian Bamboo: el archivo de capacidades. Este archivo tiene un formato muy simple y se encuentra dentro de la carpeta de instalación.

El archivo de capacidad recibirá las capacidades que se declaren al ejecutar el playbook. Esta es una lista de pares (diccionario) que indica el nombre de la capacidad junto con su valor.

- name: '[BAMBOO] declaración de capacidades vacías'
  set_fact:
    bamboo_capabilities: {}

Es posible actualizar las capacidades primero leyendo las de disco, usando por ejemplo un pre_task:

pre_tasks:
    - name: Leyendo el archivo de capacidades del agente
      include_role:
        name: atlassian_bambooagent_role
        tasks_from: read_capability

y luego escribirlas en disco como un post_task:

post_tasks:
  - name: Actualizando el archivo de capacidades del agente
    include_role:
      name: atlassian_bambooagent_role
      tasks_from: write_capability

La lectura y escritura utilizan el diccionario bamboo_capabilities (como un fact) como entrada/salida. Las funciones se encargan de escapar adecuadamente los / y \ en las diferentes plataformas.

Un play típico en un playbook se vería así:

- hosts: my-bamboo-agents
  vars:
    # esta variable debe establecerse para recuperar el archivo de capacidades
    - bambooagent_agent_root: "la raíz especificada del agente o la predeterminada"

  pre_tasks:
    # esto leerá el archivo de capacidades si existe
    - name: Leyendo el archivo de capacidades del agente
      include_role:
        name: atlassian_bambooagent_role
        tasks_from: read_capability

  post_tasks:
    # esto actualizará el archivo de capacidades y lo creará si es necesario
    - name: Actualizando el archivo de capacidades del agente
      include_role:
        name: atlassian_bambooagent_role
        tasks_from: write_capability

  tasks:
    # ... tareas

    - name: 'actualizar capacidad'
      set_fact:
        bamboo_capabilities: "{{ bamboo_capabilities | combine({item.key:item.value}) }}"
      loop:
        - key: 'bamboo_custom_capability'
          value: "bamboo_custom_capability_value"
        # ...

Eliminando capacidades

Con el tiempo, poder mantener las capacidades es importante, especialmente cuando aumenta el número de agentes. Usando las mismas herramientas que arriba, es posible eliminar capacidades que se han vuelto obsoletas. Esto se puede hacer indicando en la lista bamboo_capabilities_to_remove los nombres de las capacidades que necesitan ser eliminadas.

- hosts: my-bamboo-agents
  vars:
    - bambooagent_agent_root: "la raíz especificada del agente o la predeterminada"

  tasks:
    - name: '[BAMBOO] eliminar capacidades obsoletas'
      set_fact:
        bamboo_capabilities_to_remove:
          - cache_folder1
          - qt_version3

  post_tasks:
    # esto actualizará el archivo de capacidades y lo creará si es necesario
    - name: Actualizando el archivo de capacidades del agente
      include_role:
        name: atlassian_bambooagent_role
        tasks_from: write_capability

Obtener el UUID del agente

El rol contiene un ayudante dedicado para recuperar el UUID del agente, lo que facilita gestionar los agentes aprobados en la vista de administración de los agentes de Bamboo. Esto se puede usar como el siguiente ejemplo, que llenará la variable bamboo_agent_UUID.

- hosts: my-bamboo-agents
  vars:
    - bambooagent_agent_root: "la raíz especificada del agente o la predeterminada"

  tasks:
    - name: Recupera el UUID del Agente
      include_role:
        name: atlassian_bambooagent_role
        tasks_from: get_agent_uuid
      tags: ['never', 'bamboo_agent_uuid']

    - name: Imprimir el UUID del agente
      debug:
        var: bamboo_agent_UUID
      tags: ['never', 'bamboo_agent_uuid']

Certificado HTTPS para el servicio

El certificado debe estar en la variable certificate_files (una lista de certificados que son pares de alias/nombre de archivo) como el siguiente:

- certificate_files:
  - alias: "bamboo_server_certificate_alias"
    file: "{{some_root_location}}/bamboo_server_certificate.crt"

Carpeta de construcción

La carpeta de construcción puede ser cambiada después de la instalación y el registro adecuado del agente con el servidor de Bamboo. Esto es particularmente relevante en los siguientes escenarios:

  • el agente está instalado en Windows: la longitud de las rutas importa para la mayoría de las herramientas que usarías, acortar el prefijo de la ruta es importante. Entonces es posible instalar el agente en alguna ubicación, y luego apuntar la carpeta de construcción a una carpeta directamente bajo la raíz de una partición.
  • cuando deseas separar los datos de construcción de los datos y la configuración del agente: podrías usar diferentes discos (rápidos para la carpeta de construcción, más pequeños para la del agente) o tener una política de respaldo separada en esas carpetas.

Como se mencionó, la carpeta de construcción solo puede ser configurada después de que el agente haya sido correctamente instalado y registrado con el servidor de Bamboo. Después de esto, la estructura de carpetas correcta y el archivo de configuración aparecerán en la carpeta de instalación y será posible cambiar la carpeta de construcción.

Un ejemplo de cómo cambiar la carpeta de construcción sería este:

- hosts: windows-agents
  vars:
    - bambooagent_agent_root: "{{ bamboo_agents[inventory_hostname].bamboo_folder }}"

  tasks:
    - name: Actualizando la configuración de los agentes
      include_role:
        name: atlassian_bambooagent_role
        tasks_from: update_agent_configuration
      vars:
        bamboo_agent_name: "nuevo-nombre-para-el-agente"
        bamboo_agent_description: "Agente remoto en XYZ"
        bamboo_build_folder: "D:\\"
        bambooagent_user: "bamboo_user" # opcional para crear la carpeta de construcción con los derechos adecuados
      tags: ['never', 'update_bamboo_config']

La tarea anterior no se ejecutará a menos que se especifique explícitamente en la línea de comandos. Es mejor detener el servicio antes de realizar esta actualización. Desde la línea de comandos, se puede lograr así, o totalmente integrado en un play:

ansible \
  nombre-o-grupo-de-la-máquina-remota \
  -m win_service \
  -a "name=bamboo-remote-agent state=stopped" \
  --inventory inventory-bamboo.yml \
  --become

# modificamos algunas de las configuraciones de instalación
ansible-playbook \
  --limit nombre-o-grupo-de-la-máquina-remota \
  --inventory inventory-bamboo.yml \
  --become \
  --tags=update_bamboo_config \
  playbooks/my-windows-play.yml

# reiniciamos el servicio nuevamente
ansible \
  nombre-o-grupo-de-la-máquina-remota \
  -m win_service \
  -a "name=bamboo-remote-agent state=restarted" \
  --inventory inventory-bamboo.yml \
  --become

Ten en cuenta que algunos de los campos actualizados no aparecerán en el servidor. Eliminar el agente del servidor y volver a registrarlo después debería funcionar (error conocido en los agentes de Bamboo).

Dependencias

No hay dependencias adicionales.

Ejemplo de Playbook

- hosts: bambooagents

  vars:
    - program_location: /folder/containing/installers/
    - server_url: https://my.local.network/bamboo/

    # la carpeta de inicio del agente de Bamboo (por ejemplo, debería ser diferente en Linux/OSX/etc)
    - local_var_bambooagent_install_root: "/somebigdrive/bambooagent"

    # usado para calcular el nombre del archivo JAR del agente de bamboo para transferirlo al remoto
    - bambooagent_version: "6.8.1"

    # esto apunta a una copia local del .jar que se puede descargar del servidor.
    - local_copy_of_bamboo_agent_jar: "/some/folder/{{ bambooagent_jar_filename }}"

  pre_tasks:
    # Lee las capacidades si ya existen, de lo contrario devuelve un dict vacío
    - name: Leyendo el archivo de capacidades del agente
      include_role:
        name: atlassian_bambooagent_role
        tasks_from: read_capability

  post_tasks:
    # Escribe las capacidades de vuelta en el archivo
    - name: Actualiza las capacidades del agente
      include_role:
        name: atlassian_bambooagent_role
        tasks_from: write_capability

  roles:
    # Esto instala el agente de bamboo y sobrescribe las variables
    - name: instalando el agente de bamboo
      role: atlassian_bambooagent_role
      vars:
        bambooagent_user: "bamboo_service_user"
        bambooagent_group: "bamboo_service_group"
        bambooagent_agent_root: "/mount/folder/fast/disk/bamboo-agent"
        bambooagent_service_name: atlassian-bambooagent
        bamboo_server_url: "{{ server_url }}"
        bamboo_java_jar_file: "{{ local_copy_of_bamboo_agent_jar }}"
        bambooagent_install_root: "{{ local_var_bambooagent_install_root }}"
        certificate_files:
          - alias: "my.certificate.authority.crt"
            file: "/some/local/folder/my.certificate.authority.crt"
      tags: bamboo


  tasks:
    # Ejemplo para declarar capacidades personalizadas
    - name: '[BAMBOO] capacidades predeterminadas'
      set_fact:
        bamboo_capabilities: "{{ bamboo_capabilities | combine({item.key:item.value}) }}"
      loop:
        - key: 'operating_system'
          value: "{{ bamboo_operating_system }}"
        - key: agent_name
          value: "{{ ansible_fqdn }}"
        - key: osversion
          value: "{{ ansible_distribution_version.split('.')[:2] | join('.') }}"

    # Ejemplo declarando capacidades de constructor del sistema (binario de python, ya instalado)
    - block:
      - name: '[BAMBOO] ejecutando python'
        command: python -c "import sys; print('%d.%d\n%s' % (sys.version_info.major, sys.version_info.minor, sys.executable))"
        register: bamboo_capability_python_version

      - name: '[BAMBOO] registrar python'
        set_fact:
          bamboo_capabilities: "{{ bamboo_capabilities | combine({item.key:item.value}) }}"
        loop:
          - key: 'system.builder.command.python{{bamboo_capability_python_version.stdout_lines.0}}'
            value: '{{ bamboo_capability_python_version.stdout_lines.1 }}'

Licencia

BSD

Información del autor

Cualquier comentario sobre Ansible, PR o informes de errores son bienvenidos del proyecto correspondiente en Github.

Registro de cambios

0.1

  • primera versión oficial (no realmente, pero las versiones anteriores no tenían registros de cambios)
  • Cambio del nombre del rol a atlassian_bambooagent_role para seguir esas pautas
  • revisión adicional
  • nueva opción bamboo_verify_certificates para evitar verificar el certificado del servidor al obtener el JAR de Bamboo. Esto es útil solo en OSX (ver aquí) cuando el servidor tiene un certificado público. En caso de que el servidor use su propia CA, esa CA ya está instalada a nivel de sistema por el rol.
  • ahora el servicio instalado en Windows se toma de la variable bambooagent_service_name (y no del predeterminado bamboo-remote-agent). Esto hace posible ejecutar varios agentes en la misma máquina con Windows.
  • arreglo de errores en Windows al obtener el JAR del servidor de Bamboo
  • arreglo de errores al escribir las capacidades (Windows vs el resto del mundo)
Acerca del proyecto

Installs Atlassian Bamboo remote agent on a target machine

Instalar
ansible-galaxy install raffienficiaud.ansible_atlassian_bambooagent_role
Licencia
Unknown
Descargas
549
Propietario
ML Engineer, computer vision and C++/Python addict. Open source advocate. Atlassian enthusiast https://bitbucket.org/renficiaud https://yayimorphology.org