Вопрос или проблема
Мне нужно установить nginx agent для openam с помощью ansible.
во время установки nginx_agent он задает множество вопросов при запуске скрипта,
************************************************************************
Добро пожаловать в OpenSSO Policy Agent для NGINX
************************************************************************
Введите URL, по которому работает сервер OpenAM.
Пожалуйста, включите URI развертывания как показано ниже:
(http://opensso.sample.com:58080/opensso)
**URL сервера OpenSSO: sss**
Введите имя профиля агента
**Имя профиля агента: sss**
Введите пароль, используемый для идентификации агента.
*ЭТО НЕ ФАЙЛ С ПАРОЛЕМ*
**Пароль агента:**
-----------------------------------------------
РЕЗЮМЕ ВАШИХ ОТВЕТОВ
-----------------------------------------------
URL сервера OpenSSO : sss
Имя профиля агента : sss
Пароль агента: sss
**Продолжить установку?
[y/N]: y**
Я использовал модуль expect в ansible:
- expect:
command: sh /opt/nginx_agent/bin/agentadmin.sh
responses:
OpenSSO server URL: "http://openam.test.mobi:8080/openam"
Agent Profile Name: "nginx"
Agent Password: "test.mobi2"
(^Con[^\n]*\n+[^\n]*)+: "y"
Но, это Продолжить установку?
[y/N]:
принимает, URL сервера OpenSSO: значение смотрите,
Ссылка:
"stdout_lines": [
"************************************************************************",
"Добро пожаловать в OpenSSO Policy Agent для NGINX",
"************************************************************************",
"",
"Введите URL, по которому работает сервер OpenAM.",
"Пожалуйста, включите URI развертывания как показано ниже:",
"(http://opensso.sample.com:58080/opensso)",
"URL сервера OpenSSO: Введите имя профиля агента",
"Имя профиля агента: Введите пароль, используемый для идентификации агента.",
"*ЭТО НЕ ФАЙЛ С ПАРОЛЕМ*",
"Пароль агента: ",
"-----------------------------------------------",
"РЕЗЮМЕ ВАШИХ ОТВЕТОВ",
"-----------------------------------------------",
"URL сервера OpenSSO : http://openam.test.mobi:8080/openam",
"Имя профиля агента : nginx",
"Пароль агента: test.mobi2",
"Продолжить установку?",
"[y/N]: http://openam.test.mobi:8080/openam",
"test.mobi2"
]
Что я пропустил в этой конфигурации?
Я бы попробовал игнорировать Продолжить установку?
и просто сопоставить строку [y/N]
.
замените (^Con[^\n]*\n+[^\n]*)+: "y"
на 'y/N' : 'y'
Ansible использует модуль pexpect, который не всегда работает так, как вы ожидаете. Например, EOL – это '\r\n'
, а не '\n'
.
Смотрите документацию здесь.
Вот быстрый тест:
/root/junk.sh
echo 'Enter the Agent profile name'
read -p "Agent Profile Name: " AGENT_PROFILE_NAME
echo $AGENT_PROFILE_NAME > junk.dat
echo "Продолжить установку"
read -p "[y/N] : " CONFIRM
echo $CONFIRM >> junk.dat
play:
- expect:
command: sh /root/junk.sh
responses:
'Profile Name' : "oook"
'y/N' : 'y'
Вот более простой способ сделать это без использования expect.
Если вы посмотрите сценарий agentadmin.sh, вы увидите, что ответы на все вопросы хранятся в переменных окружения, т.е.
while [ -z ${OPENAM_URL} ]; do
Если вы определите их все в разделе окружения вашего плейбука, скрипт должен сработать без какого-либо вмешательства пользователя. Нет необходимости в использовании expect.
Что-то вроде:
environment:
OPENAM_URL: whatever_1
AGENT_PROFILE_NAME: whatever_2
AGENT_PASSWORD: whatever_3
CONFIRM: y
- shell: /opt/nginx_agent/bin/agentadmin.sh
Работает для ansible 2.7.7
и ubuntu 18.04
:
---
- name: Install pexpect 4 Ubuntu
when:
- ansible_distribution == 'Ubuntu'
become: yes
block:
- apt:
name:
- python-pexpect
- python3-pexpect
- python-setuptools
# https://stackoverflow.com/a/51998238
- python-pip
state: latest
install_recommends: yes
tags:
- linux
- ubuntu
- python
- pip
- expect
- apt
- name: Install pexpect using pip
when:
- ansible_system == 'Linux'
pip:
name: pexpect
state: latest
tags:
- linux
- python
- pip
- expect
Ответ или решение
Конфигурация Ansible не работает должным образом для множественного ввода, поскольку скрипт не корректно распознаёт ответы на итоговые вопросы установки. В данной ситуации предполагается использовать модуль expect
в Ansible для автоматизации ввода данных во время установки nginx агента для OpenAM. Однако проблемы возникают, когда expect
неправильно ассоциирует вводимые данные с соответствующими запросами ввода.
Основная Причина Проблемы
Проблема связана с тем, что регулярное выражение, используемое для определения окончания строки, может не подходить для всех случаев, так как Ansible использует модуль pexpect, где завершение строки обозначается как '\r\n'
, а не '\n'
. Это может привести к некорректной парсингу строк.
Решение Проблемы
Подход 1: Регулярное Выражение
Самым простым и действенным решением будет игнорирование определенной строки и работа с непосредственным текстом [y/N]
. Чтобы исправить проблему, необходимо заменить выражение (^Con[^\n]*\n+[^\n]*)+: "y"
на 'y/N' : 'y'
. Это позволит Ansible корректно обрабатывать последний запрос перед подтверждением установки.
Подход 2: Использование Окружающей Среды
Упрощает устроение установки за счет предварительного определения всех необходимых переменных окружения в environment
секции playbook:
environment:
OPENAM_URL: "http://openam.test.mobi:8080/openam"
AGENT_PROFILE_NAME: "nginx"
AGENT_PASSWORD: "test.mobi2"
CONFIRM: "y"
- shell: /opt/nginx_agent/bin/agentadmin.sh
Определив переменные окружения, вы сможете избежать необходимости в использовании expect
, автоматизировав установку без пользовательского вмешательства.
Дополнительные Рекомендации
-
Обновление Зависимостей: Убедитесь, что установлены все необходимые зависимости для работы с pexpect на всех целевых узлах:
- name: Install pexpect 4 Ubuntu apt: name: - python-pexpect - python3-pexpect - python-setuptools - python-pip state: latest install_recommends: yes
-
Версии: Убедитесь, что используете корректные версии Ansible и операционной системы, совместимые с вышеописанными рекомендациями (например, ansible 2.7.7 и Ubuntu 18.04).
Благодаря представленной информации, ваше решение станет более адаптированным и надежным. Учитывайте, что использование переменных окружения может значительно упростить процесс автоматизации и минимизировать ошибки, связанные с небезопасными парсингами строк.