#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
}
}
]
Комментарии:
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()