Ejecutar el comando en el host Ansible


¿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 empresa). Luego quiero subir el checkout (tarballed) al servidor de producción (alojado externamente).

En este momento, estoy viendo ejecutar un script que hace el checkout, lo descarga y luego ejecuta el script de implementación, pero si pudiera integrar esto en Ansible, eso sería preferible.

Author: Ross, 2013-09-19

6 answers

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

Si desea ejecutar una reproducción completa en el host Ansible, especifique hosts: 127.0.0.1 y connection:local en la reproducción, 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

Ver Libros de jugadas locales en la documentación de Ansible para más detalles.

Si solo desea ejecutar una sola tarea en su host Ansible, puede usar local_action para especificar que una tarea debe ser ejecutada 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

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

Editar: Puedes evitar tener que escribir connection: local en tu juego agregando esto a tu inventario:

localhost ansible_connection=local

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

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

 282
Author: Lorin Hochstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-09 23:19:45

He encontrado un par de otras formas de 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
 58
Author: Gordon Dickens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-07 22:17:45

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

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

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

El ejemplo de código está tomado de este buen artículo:

Ejecutar ansible playbook en localhost

 22
Author: mxf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-18 08:08:33

Puede usar delegate_to para ejecutar comandos en su host Ansible (host admin), desde donde está ejecutando su Ansible play. Por ejemplo:

Eliminar 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

Crear 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
 8
Author: c_agrawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-29 12:26:29

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

- name: "release tarball is generated"
  local_action:
    module: shell
    _raw_params: git archive --format zip --output release.zip HEAD
    chdir: "files/clones/webhooks"
 4
Author: mvr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 02:17:13
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

El módulo predeterminado es command module, por lo tanto no se requiere la palabra clave command.

Si necesita emitir cualquier comando con privilegios elevados use -b al final del mismo comando.

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b
 0
Author: Deepak kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-20 14:28:36