首页 > 解决方案 > Jinja 通过 Ansible URI 模块模板化 Json GraphQL 查询

问题描述

我正在尝试使用 ansible uri 模块通过他们的API查询 AuditLog Github 提供的内容,并且难以在 ansible 中围绕 JSON 格式进行思考。

所以我有这个工作的 GraphQL 查询,但我想将“created:”查询转换为我可以每天/每小时更改的变量。

  organization(login: "my_org_here") {
    auditLog(last: 100, query: "created:>=2019-07-22") {
      edges {
        node {
          ... on AuditEntry {
            action
            actorLogin
          }
        }
      }
    }
  }
}

但我无法理解如何以 ansible yaml 格式编写它。这是我尝试过的:

  uri:
    url: https://api.github.com/graphql
    headers:
      Authorization: 'Bearer MY_TOKEN_HERE'
      Accept: 'application/vnd.github.audit-log-preview+json'
    method: POST
    body: " {{ lookup('template','files/auditlog.json.j2') }}"
    body_format: json

auditlog.json.j2 的内容:

query:
  organization:
    login: my_org_here
    auditlog:
      last: 100
      query: {{ query_variable }}

本质上,我希望能够真正逐项拆分整个 GraphQL 查询并参数化每个组件。但我一直试图通过 ansible 重新创建 GraphQL JSON。这是一个有效的 JSON 示例(在我希望获得的详细信息中包含更多字段):

"query": "{\n  organization(login: \"my_org_here\") {\n    auditLog(last: 100, query: \"created:>=2019-07-20\") {\n      edges {\n        node {\n          ... on AuditEntry {\n            action\n            actorLogin\n            \n            createdAt\n            actorIp\n            userLogin\n            user {\n              name\n              email\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"

标签: jsonansiblegraphqljinja2uri

解决方案


GitHub GraphQL 查询请求的主体是一个带有query键的 JSON 对象,其值为字符串形式的 GraphQL 查询。query在您的示例中,您缺少的是body. 以这个任务为例:

- name: Get data from Github
  uri:
    url: https://api.github.com/graphql
    method: POST
    headers:
      Authorization: 'bearer {{ github_token }}'
    body_format: json
    body:
      query: '{{ lookup("template", "./templates/github_query.graphql") }}'

./templates/github_query.graphql我的文件在哪里:

query {
  repository(owner:"{{ owner }}", name:"{{ repository_name }}") {
    issues(last:{{ last_issues }}, states:{{ states }}) {
      edges {
        node {
          title
          url
          labels(first:{{ labels_count }}) {
            edges {
              node {
                name
              }
            }
          }
        }
      }
    }
  }
}

我可以通过修改 、 和 变量来修改查询ownerrepository_name工作方式last_issueslabels_count


推荐阅读