使用ansible mysql_query模块运行SQL查询后,如何提取返回的数据?

bakd9h0s  于 2023-08-02  发布在  Mysql
关注(0)|答案(1)|浏览(188)

我有一个从测试数据库中检索数据的剧本,但我无法弄清楚如何提取从数据库返回的行。
该练习的全部目的是从KVP中提取值并将其添加到报告中,因此最终的输出将类似于:
| 主机名|服务器状态|服务器类型|联合控制器| associated_controller |
| --|--|--|--| ------------ |
| ATT_DELL|向上|节点|123.456.78.901| 123.456.78.901 |
| 史蒂夫_Ubuntu|向上|控制器|不适用| NOT APPLICABLE |

- name: Sample playbook
  gather_facts: True
  hosts: sql_server
  tasks:
    - name: Retrieve data from database
      tags: always
      community.mysql.mysql_query:
        login_host: "{{ login_host }}"
        login_db: "{{ login_db }}"
        login_user: "{{ login_user }}"
        login_password: "{{ login_password }}"
        query: select * from test_db
      register: mysql_result

    - name: output query results
      tags: always
      debug:
        msg: "{{ item }}"
      loop:  "{{ mysql_result.query_result }}"

个字符
我尝试了以下方法:

- name: output query results
      tags: never
      debug:
        msg: "{{ item[0] }}"
      loop:  "{{ mysql_result.query_result | items2dict }}"


这导致了下面的结果,但我需要循环遍历每个列表项,从每个kvp中提取单独的值,以便在报告中使用。

ok: [servername] => (item=[{u'datetime': None, u'hostname': u'steve_ubuntu', u'associated_controller': u'NOT APPLICABLE', u'server_type': u'controller', u'server_status': u'Up'}, {u'datetime': None, u'hostname': u'ATT_DELL', u'associated_controller': u'NOT APPLICABLE', u'server_type': u'controller', u'server_status': u'Up'}]) =>
  msg:
    associated_controller: NOT APPLICABLE
    datetime: null
    hostname: steve_ubuntu
    server_status: Up
    server_type: controller


我已经尝试了很多其他的事情,比如将列表转换为字典,但我收到了下面的错误。我需要保持输入动态,但我不知道将从数据库中检索多少项。
fatal:[servername]:失败!=> msg:'在({{ mysql_result.query_result}上发生意外的模板类型错误|items2dict}}):列表索引必须是整数,而不是str'
我不只是在寻找我的问题的答案,而是我需要通读关于ansible的哪些基本原理来更好地理解返回值的基本原理以及如何提取它们?我已经阅读了Ansible的在线文档,但这并不是了解他们产品的最佳文档。

q3qa4bjr

q3qa4bjr1#

使用Jinja模板例如,给定数据

mysql_result:
    query_result:
      - - associated_controller: NOT APPLICABLE
          datetime: null
          hostname: steve_ubuntu
          server_status: Up
          server_type: controller
        - associated_controller: NOT APPLICABLE
          datetime: null
          hostname: ATT_DELL
          server_status: Up
          server_type: controller

字符串
声明密钥

qr_keys:
    - - - datetime
        - hostname
        - server_status
        - server_type
        - associated_controller


注意:如果您接受订单,您可以动态获取密钥

qr_keys: "{{ mysql_result.query_result|
               map('json_query', '[].keys(@)') }}"


决定您想要存储数据的格式并创建模板。例如,尝试CSV

- debug:
        msg: |
          {% for query in mysql_result.query_result %}
          {% set keys=qr_keys[loop.index0][0] %}
          {{ keys|join(';') }}
          {% for i in query %}
          {% for key in keys %}
          {{ i[key]|d('null', true) }}{% if not loop.last %};{% endif %}{% endfor %}

          {% endfor %}
          {% endfor %}


给予

msg: |-
    datetime;hostname;server_status;server_type;associated_controller
    null;steve_ubuntu;Up;controller;NOT APPLICABLE
    null;ATT_DELL;Up;controller;NOT APPLICABLE


如果这是您想要的,请在控制器上创建文件

- copy:
        dest: "/tmp/query_result-{{ inventory_hostname }}.csv"
        content: |
          {% for query in mysql_result.query_result %}
          {% set keys=qr_keys[loop.index0][0] %}
          {{ keys|join(';') }}
          {% for i in query %}
          {% for key in keys %}
          {{ i[key]|d('null', true) }}{% if not loop.last %};{% endif %}{% endfor %}

          {% endfor %}
          {% endfor %}
      delegate_to: localhost


将创建文件

shell> cat /tmp/query_result-sql_server.csv 
datetime;hostname;server_status;server_type;associated_controller
null;steve_ubuntu;Up;controller;NOT APPLICABLE
null;ATT_DELL;Up;controller;NOT APPLICABLE


用于测试的完整剧本示例

- hosts: sql_server

  vars:

    mysql_result:
      query_result:
        - - associated_controller: NOT APPLICABLE
            datetime: null
            hostname: steve_ubuntu
            server_status: Up
            server_type: controller
          - associated_controller: NOT APPLICABLE
            datetime: null
            hostname: ATT_DELL
            server_status: Up
            server_type: controller

    qr_keys:
      - - - datetime
          - hostname
          - server_status
          - server_type
          - associated_controller
    # qr_keys: "{{ mysql_result.query_result|
    #              map('json_query', '[].keys(@)') }}"

  tasks:

    - debug:
        msg: "{{ item }}"
      loop: "{{ mysql_result.query_result }}"
      loop_control:
        label: "{{ item|json_query('[].hostname') }}"

    - debug:
        msg: |
          {% for query in mysql_result.query_result %}
          {% set keys=qr_keys[loop.index0][0] %}
          {{ keys|join(';') }}
          {% for i in query %}
          {% for key in keys %}
          {{ i[key]|d('null', true) }}{% if not loop.last %};{% endif %}{% endfor %}

          {% endfor %}
          {% endfor %}

    - copy:
        dest: "/tmp/query_result-{{ inventory_hostname }}.csv"
        content: |
          {% for query in mysql_result.query_result %}
          {% set keys=qr_keys[loop.index0][0] %}
          {{ keys|join(';') }}
          {% for i in query %}
          {% for key in keys %}
          {{ i[key]|d('null', true) }}{% if not loop.last %};{% endif %}{% endfor %}

          {% endfor %}
          {% endfor %}
      delegate_to: localhost

相关问题