我正在尝试收集有关 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 文件。