Назад | Перейти на главную страницу

Можно ли объединить удаленные результаты с локальным регистром в Ansible?

Я пытаюсь собрать информацию о кластере mysql, чтобы затем использовать в некоторой локальной логике.

Моя проблема в том, что если я запускаю свою команду на удаленных хостах, у меня не будет доступа к этим результатам.

- 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: 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

однако mysql выдает предупреждение, и, честно говоря, я не хочу навязывать требование, чтобы на локальной машине был установлен клиент mysql.

Дурное предчувствие, что мне придется написать здесь какой-нибудь питон ...

Использовать set_fact модуль и 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

Помогло бы записать вывод команды mysql на локальном или доступном хосте и продолжать добавлять результаты со всех серверов. После этого вы можете проанализировать этот файл в своей книге воспроизведения или даже написать сценарий парсера и выполнить его из книги воспроизведения.

Сбор вывода будет выглядеть примерно так -

---
- 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

Затем вы можете проанализировать файл / tmp / mysqlcluster.