Спецификация обследования башни Ansible

#ansible #ansible-tower

#ansible #ansible-tower

Вопрос:

Я пытаюсь получить информацию из обзоров башни и работаю в дорожном блоке. У меня есть следующий код.

 - name: Gather all Job Templates
  shell: awx job_templates list -f human --filter 'Id' --all --survey_enabled true | tail -n  3
  register: job_templates_all
  when: update_all is 'True'

- name: Gather survey of templates
  uri:
    url: "https://{{ tower_env }}.fqdn.com/api/v2/job_templates/{{ item }}/survey_spec/"
    method: GET
    return_content: yes
    user: "{{ tower_username }}"
    password: "{{ tower_password }}"
    force_basic_auth: yes
    body_format: json
    validate_certs: no
  register: survey
  when: update_all is 'True'
  with_items: "{{ job_templates_all.stdout }}"
  

Мне нужно получить список всех шаблонов заданий с определенной парой ключ: значение в опросе, а затем просмотреть этот список и предоставить мне новый список шаблонов заданий на основе идентификатора.

Вот пример зарегистрированной переменной опроса

  "json": {
        "description": "",
        "name": "",
        "spec": [
            {
                "question_description": "",
                "min": null,
                "default": "",
                "max": null,
                "required": true,
                "choices": "foobar",
                "variable": "account",
                "question_name": "Account",
                "type": "multiplechoice"
            },
            {
                "question_description": "",
                "min": null,
                "default": "us-east-1",
                "max": null,
                "required": true,
                "choices": "us-east-1nus-west-2",
                "new_question": true,
                "variable": "region",
                "question_name": "Region",
                "type": "multiplechoice"
            },
  

Если он найдет «переменную»: «учетная запись», мне нужно получить все шаблоны заданий, которые имеют это.

Ответ №1:

Если вы используете python (3.6 или выше), я думаю, это будет легко.
Например, вот так.

 #!/usr/bin/env python
import requests
import urllib3
urllib3.disable_warnings()
import json

tower_ip = ''
tower_usre = 'admin'
tower_pass = ''
page_size = 100 # is total template number you want to get

def main():
    template_list = []

    url = "https://%s/api/v2/job_templates?page_size=%s" % (tower_ip, page_size)
    r = requests.get(url,
                     auth=(tower_usre, tower_pass),
                     verify=False)
    all_templates = json.loads(r.text)['results']

    for template in all_templates:
        url = "https://%s%s" % (tower_ip, template['related']['survey_spec'])
        r = requests.get(url,
                         auth=(tower_usre, tower_pass),
                         verify=False)
        all_survey = json.loads(r.text)
        if all_survey:
            for survey in all_survey['spec']:
                if 'variable' in survey and survey['variable'] == 'account':
                    template_list.append({
                        'name': template['name'],
                        'survey': survey
                    })

    if template_list:
        print(json.dumps(template_list, indent=2))
    else:
        print("Not found template")

if __name__ == "__main__":
    main()

  

В запросе page_size можно указать максимальный размер шаблона, который вы хотите получить.
В приведенном выше скрипте переменная page_size установила значение 100, поэтому она может получить максимум 100 шаблонов.
Для этого скрипта требуется библиотека запросов, поэтому, пожалуйста, установите следующую процедуру.

 $ pip install requirests
  

Следующий пример результата после выполнения вышеупомянутого скрипта.

 $ ./sample.py
[
  {
    "name": "example01",
    "survey": {
      "question_name": "Account",
      "question_description": "",
      "required": true,
      "type": "multiselect",
      "variable": "account",
      "min": null,
      "max": null,
      "default": "",
      "choices": "hogenfuga"
    }
  },
  {
    "name": "test-8862287",
    "survey": {
      "question_name": "Account",
      "question_description": "",
      "required": true,
      "type": "multiselect",
      "variable": "account",
      "min": null,
      "max": null,
      "default": "",
      "choices": "abcndef",
      "new_question": true
    }
  }
]
  

https://docs.ansible.com/ansible-tower/latest/html/towerapi/api_ref.html#/Job_Templates/Job_Templates_job_templates_list

Комментарии:

1. Спасибо за это, но я пытался оставаться родным для tower. Кроме того, похоже, что он просто печатает имя шаблона и нуждается в идентификаторе. «template_list.append({ ‘name’: template[‘name’], « Может ли это быть идентификатором шаблона?

2. Я добавил комментарий по этому поводу.

3. Хорошо, у меня получилось, но для запуска требуется очень много времени. Не уверен, что это было бы полезно, поскольку у нас много шаблонов заданий. Есть ли какой-нибудь способ ускорить его.

Ответ №2:

По шаблону [‘id’], добавляемому в template_list, вы можете получить идентификатор шаблона.
Например, вот так.

 #!/usr/bin/env python
import requests
import urllib3
urllib3.disable_warnings()
import json

tower_ip = ''
tower_usre = 'admin'
tower_pass = ''
page_size = 100 # is total template number you want to get

def main():
    template_list = []

    url = "https://%s/api/v2/job_templates?page_size=%s" % (tower_ip, page_size)
    r = requests.get(url,
                     auth=(tower_usre, tower_pass),
                     verify=False)
    all_templates = json.loads(r.text)['results']

    for template in all_templates:
        url = "https://%s%s" % (tower_ip, template['related']['survey_spec'])
        r = requests.get(url,
                         auth=(tower_usre, tower_pass),
                         verify=False)
        all_survey = json.loads(r.text)
        if all_survey:
            for survey in all_survey['spec']:
                if 'variable' in survey and survey['variable'] == 'account':
                    template_list.append({
                        'name': template['name'],
                        'template_id': template['id'],
                        'survey': survey
                    })

    if template_list:
        print(json.dumps(template_list, indent=2))
    else:
        print("Not found template")

if __name__ == "__main__":
    main()