我可以导航来自 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
}
}
}
我已经开始使用 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
}
}
}