#ansible #graphql #cics
#ansible #graphql #cic
Вопрос:
Я начал работу с коллекцией CIC в Ansible Galaxy. Я использовал его для выполнения таких действий, как запрос отдельных ресурсов, но я не вижу способа обхода отношений, как вы бы делали в CMCI GraphQL API CICS.
Есть ли у коллекции такая возможность?
Ответ №1:
Нет, коллекция CICS не имеет возможности использовать CMCI GraphQL API. Он использует исключительно CMCI REST API, который имеет дело только с одним типом ресурса для типа.
Однако это не означает, что вы не можете использовать CMCI GraphQL API для CIC из Ansible! Этот API, как правило, немного более понятен, и вы можете создавать запросы с помощью GraphiQL, не требуя специальной коллекции. Затем вы можете использовать встроенный uri
модуль Ansible для отправки запросов GraphQL и получения информации из ответа.
Простой запрос
Вот, например, простой справочник и сопутствующий запрос GraphQL, чтобы получить структуру CICSplex с его областями CIC и распечатать результат. Важной частью является 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
}
}
}
Добавление переменных в запрос
Конечно, вы, вероятно, захотите параметризовать запрос. Вы можете сделать это, используя шаблоны Jinja в Ansible. Вот учебное пособие и сопутствующий запрос GraphQL для поиска определенного имени региона (именованного MYREGION
в vars
) во всех подключенных CICSplexes.
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 для лучшей очистки переменных.
В CMCI GraphQL API CICS вы можете указывать переменные, используя variables
ключ в теле запроса, который вы отправляете в CICS, наряду с существующим query
ключом.
Здесь вы видите regionName
переменную, указываемую в теле, а затем ту же переменную (называемую как $regionName
) в запросе GraphQL.
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
}
}
}