Могу ли я перемещаться по связям между ресурсами CIC из Ansible?

#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
    }
  }
}