Table of Contents

Программируемые опросы 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]