是否可以将远程结果合并到 Ansible 中的本地寄存器中?

是否可以将远程结果合并到 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 客户端。

感觉很糟糕,我必须在这里写一些 python......

答案1

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

答案2

将 mysql 命令的输出写入本地主机或 ansible 主机,并继续附加来自所有服务器的结果,这是否有帮助。完成后,您可以在剧本中解析该文件,甚至可以编写解析器脚本并从剧本中执行它。

收集输出看起来像这样 -

---
- 主办方:生产
  任务:
  - name:获取现有集群节点的 uuid
    外壳:mysql -N -B -u {{ db_user }} -p {{ db_user_password }} -e “显示类似'wsrep_cluster_state_uuid'的全局状态;”| sed's/\t/,/g' | cut -f2 -d','
    注册:maria_cluster_uuids

  - 名称:写入本地磁盘
    lineinfile:目标= / tmp / mysqlcluster创建=yes line =“{{maria_cluster_uuids.stdout_lines}}”
    委托给:127.0.0.1

然后您可以解析 /tmp/mysqlcluster 文件。

相关内容