Программируемые опросы AWX
Программируемые опросы используются для удобного заполнения значений переменных для плейбуков ansible.
В данный момент - опросы могут быть заполнены только с помощью tower-cli.
Все запросы на эту фичу стекаются сюда: https://github.com/ansible/awx/issues/20
Для того, чтобы динамически формировать выпадающий список опроса (dynamic entries in multi-choice survey drop-down menu) умный человек запилил хак: https://github.com/ansible/awx/pull/1408 , но этот вариант применим не ко всем версиям AWX
Вот тут есть немного полезного: https://groups.google.com/forum/#!topic/awx-project/cuDsbk3lFA4
Псевдо динамический вариант опроса
Управлять спецификацией опроса можно через API.
Вот по такому пути https://awx.domain_local/api/v2/job_templates/12/survey_spec/ можно получить доступ к спецификации опроса, прочитать ее, изменить и записать с помощью POST HTTP-реквеста. Теоретически. В веб-интерфейсе есть для этого всё.
Также, можно воспользоваться tower-cli.
Мне нужно автоматически заполнять список файлов бекапа, из которых пользователь выберет нужный и восстановит базу, запустив плейбук.
Так как список файлов обновляется не часто, то я могу написать скрипт, который будет исполняться по таймеру, опрашивать папку и при обновлении списка файлов - вносить изменения в спецификацию опроса.
настройка tower-cli
https://docs.ansible.com/ansible-tower/latest/html/towerapi/tower_cli.html
Устанавливаем:
sudo pip3 --proxy=http://192.168.104.94:3130 install ansible-tower-cli
Настраиваем tower-cli
sudo mkdir /etc/tower/ sudo tower-cli config --global host https://awx.rdleas.ru sudo tower-cli config --global username admin sudo tower-cli config --global password __passwd__ sudo tower-cli config --global verify_ssl false
В результате, параметры доступа к AWX попадут в файл /etc/tower/tower_cli.cfg, доступный только для чтения root.
Проверяем:
sudo tower-cli user list
https://github.com/ansible/tower-cli/blob/master/docs/source/cli_ref/usage/SURVEYS.rst
Смотрим текущее состояние survey для данного job_template:
tower-cli job_template survey -n 'job template name'
Сохранение спецификации survey в файл:
tower-cli job_template survey --name="survey jt" > s.json
Загрузка job survey из файла:
tower-cli job_template modify --name="another jt" --survey-spec=@s.json --survey-enabled=true
Вот скрипт на питоне, который заполняет поля мультичойса для заданного вопроса:
#!/usr/bin/python import json import os import random import string ###################### smb_creds='/etc/tower/smbcredentials.conf' backup_share_path='\\\\\\\\backup01\\\\sql' backup_folder='\\\\SRV-NAV18-SQL\\\\ASR_PROD\\\\' survey_name='SBL Deploy ASOR Test Environment' survey_question='DataBase backup file path' ##################### cmd = 'smbclient ' + backup_share_path + ' -D ' + backup_folder + ' -A ' + smb_creds + ' -c ls 2>/dev/null | awk \'{print $1}\' | grep -e \'^\..*$\' -v | grep \'.bak\'' choices = "" for file in os.popen(cmd).readlines(): choices = choices + '\n' + backup_share_path + backup_folder + file.rstrip() choices = choices[2:] choices = choices.replace('\\\\','\\') cmd = 'tower-cli job_template survey -n "' + survey_name + '"' survey_content = os.popen(cmd).read() survey_obj = json.loads(survey_content) for question in survey_obj['spec']: if question["question_name"] == survey_question: question["choices"] = choices filename='/tmp/' + ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(5)) + '.json' f = open(filename, "w") f.write(json.dumps(survey_obj, sort_keys=True, indent=4)) f.close() cmd = 'tower-cli job_template modify -n "' + survey_name + '" --survey-spec=@' + filename + ' --survey-enabled=true' survey_mod = os.popen(cmd).read() os.remove(filename)
Вот скрипт, который берет данные с Windows-хоста, используя PowerShell и помещает результат в поля AWX Survey.
#!/usr/bin/python2 from __future__ import print_function import winrm import json import os import random import string survey_name='SBL Navision Instance Automation' survey_question='Select Navision Instance' nav_server_list = [ 'srv-nav2017-dev', 'srv-nav2017-tst' ] win_user = 'web_nav_develop@RDLEAS.RU' win_pass = 'n2n?yJ76cn!CvLMX' winrm_transport='ntlm' ps_script = """ Import-Module "C:\Program Files\Microsoft Dynamics NAV\\110\Service\NavAdminTool.ps1" *>&1 | out-null foreach ($instance in $(Get-NAVServerInstance)) { Write-Host "$env:computername - $(($instance.ServerInstance).ToString().Split('$')[1]) - $($instance.State.ToString())" } """ choices = "" for nav_server in nav_server_list: win_host = 'http://'+ nav_server + ':5985/wsman' s = winrm.Session(win_host, auth=(win_user, win_pass), transport=winrm_transport) r=s.run_ps(ps_script) #print (r.status_code) #print (r.std_err) if r.status_code == 0: for instance in r.std_out.splitlines(): choices = choices + '\n' + instance choices = choices[1:] cmd = 'tower-cli job_template survey -n "' + survey_name + '"' survey_content = os.popen(cmd).read() survey_obj = json.loads(survey_content) for question in survey_obj['spec']: if question["question_name"] == survey_question: question["choices"] = choices filename='/tmp/' + ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(5)) + '.json' f = open(filename, "w") f.write(json.dumps(survey_obj, sort_keys=True, indent=4)) f.close() cmd = 'tower-cli job_template modify -n "' + survey_name + '" --survey-spec=@' + filename + ' --survey-enabled=true' survey_mod = os.popen(cmd).read() os.remove(filename)
Подготовка хоста для исполнения текущих скриптов для динамических опросов AWX
sudo apt-get install gcc python3-dev python-dev libkrb5-dev
Проверить, что в файлике /usr/bin/pip2 используется в качестве интерпретатора указан python2
sudo pip3 --proxy=http://192.168.104.94:3130 install pywinrm pyjson pyrandom sudo pip2 --proxy=http://192.168.104.94:3130 install pywinrm pyjson pyrandom sudo pip2 --proxy=http://192.168.104.94:3130 install pywinrm[kerberos] sudo pip3 --proxy=http://192.168.104.94:3130 install pywinrm[kerberos]
Discussion