É possível combinar resultados remotos para um registro local no Ansible?

2

Estou tentando reunir informações em um cluster do mysql para usar em alguma lógica local.

Meu problema é que se eu executar meu comando nos hosts remotos, não terei acesso a esses resultados

- name: get uuids for existing cluster nodes
  shell: mysql -N -B -u {{ db_user }} -p {{ db_user_password }} -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_state_uuid';" | sed 's/\t/,/g' | cut -f2 -d','
  register: maria_cluster_uuids

Isso me dá os dados de que preciso, mas o que eu realmente gosto é de uma lista combinada / dict dos resultados.

Eu poderia tentar:

- name: get uuids for existing cluster nodes
  run_once: true
  shell: mysql -N -B -u {{ db_user }} -h {{ item }} -p {{ db_user_password }} -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_state_uuid';" | sed 's/\t/,/g' | cut -f2 -d','
  register: maria_cluster_uuids
  with_items: play_hosts
  delegate_to: 127.0.0.1

no entanto, o mysql faz um aviso e, para ser honesto, eu não quero impor um requisito da máquina local com um cliente mysql instalado.

Sentimento desagradável eu vou ter que escrever um pouco de python aqui ...

    
por Jason 31.07.2015 / 17:54

2 respostas

7

Use o módulo set_fact e hostvars :

---
- hosts: all
  vars:
    uuids: |
      {%- set o=[] %}
      {%- for i in play_hosts %}
        {%- if o.append(hostvars[i].uuid) %}
        {%- endif %}
      {%- endfor %}
      {{ o }}
  tasks:
    - name: get uuids for existing cluster nodes
      shell: mysql -N -B -u {{ db_user }} -p {{ db_user_password }} -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_state_uuid';" | sed 's/\t/,/g' | cut -f2 -d','
      register: maria_cluster_uuids
    - set_fact:
        uuid: "{{ maria_cluster_uuids.stdout }}"
    - debug:
        var: uuids
      run_once: true
      delegate_to: 127.0.0.1
    
por 16.08.2015 / 05:25
1

Ajudaria a escrever a saída do comando mysql no host local ou host ansible e continuar anexando os resultados de todos os servidores. Uma vez feito isso, você pode analisar esse arquivo dentro do seu playbook, ou até mesmo escrever um script parser e executar se a partir do playbook.

A coleta da saída seria algo como isso -

---
- hosts: production
  tasks:
  - name: get uuids for existing cluster nodes
    shell: mysql -N -B -u {{ db_user }} -p {{ db_user_password }} -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_state_uuid';" | sed 's/\t/,/g' | cut -f2 -d','
    register: maria_cluster_uuids

  - name: Write to local disk
    lineinfile: dest=/tmp/mysqlcluster create=yes line="{{ maria_cluster_uuids.stdout_lines }}"
    delegate_to: 127.0.0.1

Então você pode analisar o arquivo / tmp / mysqlcluster.

    
por 13.08.2015 / 03:31

Tags