Ansible ожидание не работает для нескольких значений запросов.

Вопрос или проблема

Мне нужно установить 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).

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

Оцените материал
Добавить комментарий

Капча загружается...