Executar comando no host Ansible

247

É possível executar comandos no host Ansible?

Meu cenário é que quero fazer um checkout de um servidor git hospedado internamente (e não acessível fora do firewall da empresa). Quero fazer o upload do checkout (tarballed) para o servidor de produção (hospedado externamente).

No momento, estou olhando para executar um script que faz o checkout, tarballs e depois executa o script de implantação - mas se eu pudesse integrar isso ao Ansible, seria preferível.

Ross
fonte

Respostas:

347

Sim, você pode executar comandos no host Ansible. Você pode especificar que todas as tarefas em uma reprodução sejam executadas no host Ansible ou pode marcar tarefas individuais para serem executadas no host Ansible.

Se você deseja executar uma reprodução inteira no host Ansible, especifique hosts: 127.0.0.1e connection:localna reprodução, por exemplo:

- 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 Playbooks locais na documentação Ansible para obter mais detalhes.

Se você quiser apenas executar uma única tarefa no host Ansible, poderá local_actionespecificar que uma tarefa deve ser executada localmente. Por exemplo:

- 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 Delegação na documentação Ansible para obter mais detalhes.

Editar: você pode evitar ter que digitar connection: localseu jogo adicionando isso ao seu inventário:

localhost ansible_connection=local

(Aqui você usaria "localhost" em vez de "127.0.0.1" para se referir à peça).

Editar: nas versões mais recentes do ansible, você não precisa mais adicionar a linha acima ao seu inventário, o ansible supõe que ele já esteja lá.

Lorin Hochstein
fonte
8
Eu também precisava sudo: nono cenário de delegação #
Danimal 17/03
como executar a conexão local como usuário root?
Bilal Usean
@BilalUsean ansible-playbook -K playbook.ymlonde -K para root
Kush
74

Eu encontrei algumas outras maneiras pelas quais você pode escrever estas que são um pouco mais legíveis no IMHO.

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

OU

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path
Gordon Dickens
fonte
3
Interessante, como isso funcionaria com o comando ? Porque tanto quanto eu sei que não podemos usar o param free_form para definir o comando que será executado
Ander
@ O mesmo se aplica ao shellmódulo.
ceving 26/01
6
para uso com o comando / shell, o que você quer é o "_raw_params"
MVR
41

Eu gostaria de compartilhar que o Ansible pode ser executado no localhost via shell:

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

Isso pode ser útil para tarefas simples ou para um aprendizado prático do Ansible.

O exemplo de código é retirado deste bom artigo:

Executando o manual ansible no localhost

mxf
fonte
2
Qual é o significado da vírgula (,) após o host local. Notei que é vital para o comando para o trabalho
Tuomas Toivonen
2
a vírgula à direita é definir um inventário simples apontando para um arquivo. É uma espécie de hack não documentado e pode desaparecer (IIRC).
Senorsmile
19

Você pode usar delegate_topara executar comandos no host Ansible (host do administrador), de onde você está executando o jogo Ansible. Por exemplo:

Exclua um arquivo se ele já existir no 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

Crie um novo arquivo no 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
fonte
1
Esta parece ser a solução mais limpa de qualquer resposta até agora.
pintos
1
Aceita. Menos nova sintaxe, mais flexível (delegar em outros lugares também). Um item a ser observado - se becomefor verdadeiro para a tarefa, ele se queixará de sudo e tal. Isso pode acontecer diretamente na tarefa ou ser herdado para outro lugar.
JL Peyret
4

Expandindo a resposta de @gordon, aqui está um exemplo de sintaxe e argumento legíveis que passam com o módulo shell / comando (eles diferem do módulo git por haver argumentos obrigatórios, mas de forma livre, conforme observado por @ander)

- nome: "liberar tarball é gerado"
  local_action:
    módulo: shell
    _raw_params: git archive --format zip --output release.zip HEAD
    chdir: "arquivos / clones / webhooks"
mvr
fonte
2

Da documentação Ansible :

Delegação Na verdade, isso não é específico para atualizações contínuas, mas é frequente nesses casos.

Se você deseja executar uma tarefa em um host com referência a outros hosts, use a palavra-chave 'delegate_to' em uma tarefa. Isso é ideal para colocar nós em um pool de carga equilibrada ou removê-los. Também é muito útil para controlar janelas de interrupção. Esteja ciente de que não faz sentido delegar todas as tarefas, depurar, adicionar_host, incluir etc. sempre ser executado no controlador. Usar isso com a palavra-chave 'serial' para controlar o número de hosts em execução ao mesmo tempo também é uma boa idéia:

---

- 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

Esses comandos serão executados no 127.0.0.1, que é a máquina executando o Ansible. Há também uma sintaxe abreviada que você pode usar por tarefa: 'local_action'. Aqui está o mesmo manual acima, mas usando a sintaxe 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 }}

Um padrão comum é usar uma ação local para chamar 'rsync' para copiar recursivamente os arquivos nos servidores gerenciados. Aqui está um exemplo:

---
# ...
  tasks:

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

Observe que você deve ter chaves SSH sem senha ou um agente ssh configurado para que isso funcione; caso contrário, o rsync precisará solicitar uma senha.

Controle Android
fonte
0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

O módulo padrão é o módulo de comando, portanto, a commandpalavra-chave não é necessária.

Se você precisar emitir qualquer comando com privilégios elevados, use -bno final do mesmo comando.

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

você pode tentar assim

omi
fonte