Ejecute el comando en el host Ansible

247

¿Es posible ejecutar comandos en el host Ansible?

Mi escenario es que quiero realizar un pago desde un servidor git que está alojado internamente (y no es accesible fuera del firewall de la compañía). Luego quiero subir el pago (tarballed) al servidor de producción (alojado externamente).

Por el momento, estoy buscando ejecutar un script que realice el pago, lo tarball y luego ejecute el script de implementación, pero si pudiera integrar esto en Ansible, sería preferible.

Ross
fuente

Respuestas:

347

Sí, puede ejecutar comandos en el host Ansible. Puede especificar que todas las tareas en una jugada se ejecuten en el host de Ansible, o puede marcar tareas individuales para que se ejecuten en el host de Ansible.

Si desea ejecutar una obra completa en el host Ansible, especifique hosts: 127.0.0.1y connection:localen la obra, por ejemplo:

- name: a play that runs entirely on the ansible host
  hosts: 127.0.0.1
  connection: local
  tasks:
  - name: check out a git repository
    git: repo=git://foosball.example.org/path/to/repo.git dest=/local/path

Consulte los Playbooks locales en la documentación de Ansible para obtener más detalles.

Si solo desea ejecutar una única tarea en su host Ansible, puede usarla local_actionpara especificar que una tarea se ejecute localmente. Por ejemplo:

- name: an example playbook
  hosts: webservers
  tasks:
  - ...

  - name: check out a git repository
    local_action: git repo=git://foosball.example.org/path/to/repo.git dest=/local/path

Consulte Delegación en la documentación de Ansible para obtener más detalles.

Editar: puede evitar tener que escribir connection: localsu juego agregando esto a su inventario:

localhost ansible_connection=local

(Aquí usarías "localhost" en lugar de "127.0.0.1" para referirte a la obra).

Editar: en las versiones más recientes de ansible, ya no necesita agregar la línea anterior a su inventario, ansible asume que ya está allí.

Lorin Hochstein
fuente
8
También necesitaba sudo: noen el escenario de la delegación
Danimal el
¿Cómo ejecutar la conexión local como usuario root?
Bilal Usean
@BilalUsean ansible-playbook -K playbook.ymldonde -K para root
Kush
74

He encontrado un par de otras formas en que puedes escribir estas, que son un poco más legibles en mi humilde opinión.

- name: check out a git repository
  local_action: 
    module: git
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

O

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path
Gordon Dickens
fuente
3
Interesante, ¿cómo funcionaría eso con el comando ? Porque, que yo sepa, no podemos usar el parámetro free_form para definir el comando que se ejecutará
Ander
@Ander Lo mismo se aplica al shellmódulo.
ceving
66
para usar con command / shell, lo que quieres es "_raw_params"
mvr
41

Me gustaría compartir que Ansible se puede ejecutar en localhost a través de shell:

ansible all -i "localhost," -c local -m shell -a 'echo hello world'

Esto podría ser útil para tareas simples o para un aprendizaje práctico de Ansible.

El ejemplo de código se toma de este buen artículo:

Ejecutar un libro de jugadas ansible en localhost

mxf
fuente
2
¿Cuál es el significado de la coma (,) después de localhost. Noté que es vital que el comando funcione
Tuomas Toivonen
2
la coma final es definir un inventario simple con señalar un archivo. Es una especie de truco indocumentado, y podría desaparecer (iirc).
senorsmile
19

Puede utilizar delegate_topara ejecutar comandos en su host Ansible (host de administrador), desde donde está ejecutando su juego Ansible. Por ejemplo:

Elimine un archivo si ya existe en el host Ansible:

 - name: Remove file if already exists
   file:
    path: /tmp/logfile.log
    state: absent
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

Cree un nuevo archivo en el host Ansible:

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1
c_agrawal
fuente
1
Esta parece ser la solución más limpia de cualquier respuesta hasta ahora.
pollitos
1
De acuerdo. Menos nueva sintaxis, más flexible (delegar en otro lugar también). Un elemento a tener en cuenta: si becomees verdadero para la tarea, se quejará de sudo y tal. Eso podría suceder directamente en la tarea o ser heredado por otro lado.
JL Peyret
4

Ampliando la respuesta de @gordon, aquí hay un ejemplo de sintaxis legible y argumento que pasa con el módulo de shell / comando (estos difieren del módulo git en que hay argumentos obligatorios pero de forma libre, como señaló @ander)

- nombre: "se genera el lanzamiento del tarball"
  acción_local:
    módulo: shell
    _raw_params: archivo git --format zip --output release.zip HEAD
    chdir: "archivos / clones / webhooks"
mvr
fuente
2

De la documentación de Ansible :

Delegación Esto no es realmente una actualización continua, pero aparece con frecuencia en esos casos.

Si desea realizar una tarea en un host con referencia a otros hosts, use la palabra clave 'delegate_to' en una tarea. Esto es ideal para colocar nodos en un grupo de carga equilibrada o eliminarlos. También es muy útil para controlar ventanas de interrupción. Tenga en cuenta que no tiene sentido delegar todas las tareas, depurar, agregar_host, incluir, etc. siempre se ejecutan en el controlador. Usar esta opción con la palabra clave 'serial' para controlar el número de hosts que se ejecutan al mismo tiempo también es una buena idea:

---

- hosts: webservers
  serial: 5

  tasks:

  - name: take out of load balancer pool
    command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

  - name: actual steps would go here
    yum:
      name: acme-web-stack
      state: latest

  - name: add back to load balancer pool
    command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

Estos comandos se ejecutarán en 127.0.0.1, que es la máquina que ejecuta Ansible. También hay una sintaxis abreviada que puede usar por tarea: 'local_action'. Aquí está el mismo libro de jugadas que el anterior, pero usando la sintaxis abreviada para delegar a 127.0.0.1:

---

# ...

  tasks:

  - name: take out of load balancer pool
    local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

  - name: add back to load balancer pool
    local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}

Un patrón común es utilizar una acción local para llamar a 'rsync' para copiar archivos de forma recursiva a los servidores administrados. Aquí hay un ejemplo:

---
# ...
  tasks:

  - name: recursively copy files from management server to target
    local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/

Tenga en cuenta que debe tener claves SSH sin frase de contraseña o un agente ssh configurado para que esto funcione; de ​​lo contrario, rsync deberá solicitar una frase de contraseña.

Control de Android
fuente
0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

El módulo predeterminado es el módulo de comando, por lo tanto, commandno se requiere una palabra clave.

Si necesita emitir algún comando con privilegios elevados, use -bal final del mismo comando.

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b
Deepak kumar
fuente