我可以导航来自 Ansible 的 CICS 资源之间的关系吗?

Can I navigate relationships between CICS resouces from Ansible?

我已经开始使用 Ansible Galaxy 上的 CICS collection。我一直在用它来做诸如请求个人资源之类的事情,但我看不到像在 CICS 的 CMCI GraphQL API.

中那样遍历关系的方法

合集有那个能力吗?

不,CICS 集合无法使用 CMCI GraphQL API。它纯粹使用 CMCI REST API,它只处理一种类型的一种资源类型。

然而,这并不意味着您不能使用 CMCI GraphQL API 从 Ansible 到 CICS! API 通常更容易理解,您可以使用 GraphiQL 构建查询而无需特殊集合。然后,您可以使用 Ansible 的内置 uri 模块发送 GraphQL 请求并从响应中获取信息。

简单查询

例如,这是一个简单的剧本和随附的 GraphQL 查询,用于获取 CICSplex 及其 CICS 区域的结构,并打印出结果。重要的部分是 query 键被添加到请求的 body 中。

playbook1.yml:

- hosts: localhost

  tasks:

  - name: Get data from CICS
    register: result
    uri:
      url: https://my.cicsplex:12345/graphql/
      method: POST
      body_format: json
      body:
        query: '{{ lookup("file", "./queries/topology_query.graphql") }}' #  GraphQL query is passed here

  - name: Print out response
    debug:
      msg: '{{ result.json }}'

queries/topology_query.graphql:

{
  cicsplexes {
    name
    regions {
      name
    }
  }
}

向查询添加变量

当然,您可能希望对查询进行参数化。您 可以 使用 Ansible 中的 Jinja 模板来做到这一点。这是一个剧本和随附的 GraphQL 查询,用于在所有连接的 CICSplex 中查找特定区域名称(名为 MYREGION,在 vars 中)。

playbook2.yml:

- hosts: localhost

  vars:
    regionName: MYREGION

  tasks:
  - name: Get data from CICS
    register: result
    uri:
      url: https://my.cicsplex:12345/graphql/
      method: POST
      body_format: json
      body:
        query: '{{ lookup("template", "./templates/single_region_query.graphql.j2") }}' # template instead of plain file

  - name: Print out response
    debug:
      msg: '{{ result.json }}'

templates/single_region_query.graphql.j2:

{
  cicsplexes {
    name
    region(name: "{{ regionName }}") { # this variable will be expanded by Ansible
      name
    }
  }
}

向查询添加变量 - 更好的方法

但是,我对模板有点怀疑。当变量从别处传入时,它似乎很容易出现注入问题,无论是恶意的还是偶然的!即使写上面的例子,我也错过了正确的引号。所以我更愿意使用 GraphQL 的内置变量支持来更好地清理变量。

在 CICS 的 CMCI GraphQL API 中,您可以使用发送给 CICS 的请求正文中的 variables 键以及现有的 query 键来提供变量。

在这里您可以看到正文中提供了 regionName 变量,然后是 GraphQL 查询中提供的相同变量(称为 $regionName)。

playbook3.yml:

- hosts: localhost

  vars:
    regionName: MYREGION

  tasks:

  - name: Get data from plex
    register: result
    uri:
      url: https://my.cicsplex:12345/graphql/
      method: POST
      body_format: json
      body:
        query: '{{ lookup("file", "./queries/single_region_query.graphql") }}' # plain file, not template
        variables:
          regionName: "{{ regionName }}" # variables will get passed to CICS

  - name: Print out response
    debug:
      msg: '{{ result.json }}'

queries/single_region_query.graphql:

query searchForRegion ($regionName: String!) { # query declares used variables
  cicsplexes {
    name
    region(name: $regionName) { # GraphQL expands the variable here at query execution time
      name
    }
  }
}