Como buscar dados específicos de um módulo em ansible para ser usado sob outro host

1

Aqui está um manual do Linode para girar uma instância do servidor de nuvem:

---
- hosts: 127.0.0.1
  connection: local
  tasks:
   - name: Create Linode Machine
     linode:
      api_key: 'blablabla'
      name: test
      plan: 1
      datacenter: 7
      distribution: 124
      password: 'blabla'
      swap: 768
      wait: yes
      wait_timeout: 600
      state: started
     register: result

Se eu fizer isso, a instância será criada, no entanto, isso não é uma grande vantagem se eu não conseguir obter um ip da saída para passar para outro playbook e automatizar uma build totalmente.

Quando você executar o acima, o módulo não fornecerá nenhuma saída, no entanto, se você executar o playbook com a opção -v, poderá ver que a saída a seguir é relatada. Como posso buscar isso

changed: [127.0.0.1] => {"changed": true, "instance": {"fqdn": "xxxx.members.linode.com", "id": 2342234, "ipv4": "185.x.x.x", "name": "1902695_test", "password": "blabla", "private": [], "public": [{"fqdn": "xxxx.members.linode.com", "ip_id": 324324, "ipv4": "185.x.x.x"}], "status": "Running"}}

Como posso salvar o ipv4 em uma variável para usar em outro playbook?

EDIT: Eu adicionei o seguinte código abaixo do código acima para testar a resposta dada, mas não funcionou:

- hosts: "{{ result['instance']['ipv4'] }}"
  remote_user: root
  tasks:
   - name: "test"
     command: ls -la
   - apt: upgrade=dist update_cache=yes

Recebo a seguinte mensagem de erro:

ERROR! 'result' is undefined

Eu também tentei set_fact e isso também não funcionou.

    
por Ulukai 18.05.2016 / 17:50

1 resposta

1

Você pode registrar a saída de qualquer tarefa como uma variável da seguinte forma:

- name: Create Linode Machine
  linode:
     api_key: 'blablabla'
     ...
  register: result

Agora você tem o resultado das tarefas armazenado na variável result e deve poder acessar o IP via result['instance']['ipv4'] .

Se não, o módulo de depuração é seu amigo e você pode inspecionar o conteúdo da variável:

- debug: var=result

Se você quiser realmente disponibilizá-lo para outro livro de estratégias que não faça parte da execução atual, fato -caching pode ser uma opção para você. Com o cache de fatos ativado, você pode usar set_fact :

- set_fact:
    myInstanceIp: "{{ result['instance']['ipv4'] }}"

Outra complicação é que variáveis / fatos são armazenados por host. No caso acima você armazenou a variável para localhost. Por isso, estará disponível apenas diretamente em tarefas executadas no contexto do host local.

No entanto, a seção de hosts do playbook não é avaliada no contexto de nenhum host, portanto, você não pode acessar diretamente essa variável.

Eu vejo três opções possíveis:

1) Execute a segunda peça também no host local e depois delegue as tarefas para outro host. Desde agora a tarefa é executada no contexto do localhost você deve ser capaz de acessar o result registrado.

- hosts: localhost
  delegate_to: "{{ result['instance']['ipv4'] }}"
  remote_user: root
  tasks:
     ...

De acordo com os documentos delegate_to funcionarão em tarefas, mas eu acho que isso deve funcionar nível de jogo, bem como, em seguida, passá-lo para todas as tarefas contidas. Caso contrário, você precisará adicioná-lo a todas as tarefas.

- hosts: localhost
  remote_user: root
  tasks:
    - name: "test"
      command: ls -la
      delegate_to: "{{ result['instance']['ipv4'] }}"
    - apt: upgrade=dist update_cache=yes
      delegate_to: "{{ result['instance']['ipv4'] }}"

2) Mesmo que não executado no contexto do localhost, você deve ser capaz de acessar os vars relacionados através do hostvars dict :

- hosts: "{{ hostvars['localhost']['result']['instance']['ipv4'] }}"
  remote_user: root
  ...

3) Crie dinamicamente um novo grupo com o módulo add_host :

- add_host:
    name: "{{ result['instance']['ipv4'] }}"
    groups: just_created

E, em seguida, use o grupo just_created na próxima reprodução:

- hosts: just_created
  tasks: ...
    
por 18.05.2016 / 18:00