Intereting Posts
Какова минимальная возможная реализация Linux? Плагин Nagios для мониторинга всех доступных сервисов на Linux Совместимость с Legacy Xorg fonts.alias больше не работает Если я привяжусь к каталогу, содержимое будет «сохранено», как если бы я был жестко связан с каждым файлом? Является ли «/ etc / issue» распространенным для всех дистрибутивов Linux? Ищите файлы в текущем каталоге, которые не соответствуют шаблону Ошибка Apache2 uncached Exception 500 Просмотр man-страницы в определенном разделе как уменьшить непригодный размер LVM PV до минимума? Поиск вопросительных знаков в человеке Существуют ли настольные почтовые клиенты, которые реализуют просмотр разговора в стиле gmail? Ярлыки замены для `screen` Единая команда для перемещения домена из локальных областей cPanel в файл remotedomains? Почему моя камера не появляется в / dev, хотя она работает в dmesg? (Возможная регрессия Ubuntu.) Что я делаю неправильно, пытаясь написать сценарий bash, который возвращает номер следующего доступного порта?

симулировать ввод ключа в Ansible

Я пытаюсь создать playbook для запуска команды mysql_secure_installation.

Эта команда задает несколько вопросов. Я использую pexpect, но не знаю, как имитировать «ввод». Первый вопрос, который он задает: «введите пароль root». Я не хочу вводить пароль root. Сервер sql будет только локальным.

- name: "Secure MariaDB" expect: command: /bin/mysql_secure_installation responses: Question: - '' #I want to have ansible hit enter - 'n' # Type n - 'y' # Type y - 'y' # Type y - 'y' # Type y - 'y' # Type y 

Я пробовал с ”, командой /bin/bash -c "echo" и даже просто с пустой строкой, и я продолжаю получать ответ ниже.

 FAILED! => {"changed": true, "cmd": "/bin/mysql_secure_installation", "delta": "0:00:30.128184", "end": "2018-08-29 18:54:30.983455", "msg": "non-zero return code", "rc": 1, "start": "2018-08-29 18:54:00.855271", "stdout": "\r\nNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB\r\n SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!\r\n\r\nIn order to log into MariaDB to secure it, we'll need the current\r\npassword for the root user. If you've just installed MariaDB, and\r\nyou haven't set the root password yet, the password will be blank,\r\nso you should just press enter here.\r\n\r\nEnter current password for root (enter for none): ", "stdout_lines": ["", "NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB", " SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!", "", "In order to log into MariaDB to secure it, we'll need the current", "password for the root user. If you've just installed MariaDB, and", "you haven't set the root password yet, the password will be blank,", "so you should just press enter here.", "", "Enter current password for root (enter for none): "]} 

    В соответствии с этим и этим вам нужно только указать пустую строку; Ansible будет автоматически следовать за ним с помощью «enter».

    Если это не сработает, здесь есть другое предложение использовать /bin/bash -c "echo" для ответа.

    Получил это работает. Как выяснилось, некоторые вещи распознавались как специальные символы регулярных выражений.

     - name: "Secure MariaDB" expect: command: /bin/mysql_secure_installation responses: 'Enter current password for root \(enter for none\): ': '' 'Set root password\? \[Y\/n\] ': 'n' 'Remove anonymous users\? \[Y\/n\] ': 'y' 'Disallow root login remotely\? \[Y\/n\] ': 'y' 'Remove test database and access to it\? \[Y\/n\] ': 'y' 'Reload privilege tables now\? \[Y\/n\] ': 'y' echo: yes 

    В соответствии с документацией модуля expect помечается как предварительный просмотр, поэтому может меняться, и модуль очень прост. Может быть более разумно использовать expect сценарий; это позволило бы обнаруживать каждый вопрос и mysql_secure_installation возможность mysql_secure_installation , если вопросы изменятся в какой-то новой версии mysql_secure_installation (или потерпеть неудачу, если кто-то взломал и ввел пароль в root учетную запись mysql, или …)

    Это, однако, требует больше работы, так как может потребоваться установка expect пакета и копирование скрипта в систему. Детали будут различаться в зависимости от используемых портов или системы пакетов и от того, где именно установлены локальные скрипты (надеюсь, что где-то ненадежные локальные пользователи не смогут читай или запускай их …)

     - name: install packages for centos yum: name={{ item }} state=present with_items: - expect ... - name: copy script copy: src=root/bin/do-setup-mysql dest=/root/bin/do-setup-mysql ... - name: initial setup of mysql command: /root/bin/do-setup-mysql args: creates: /todofixme 

    И тогда скрипт do-setup-mysql может запуститься так:

     #!/usr/bin/env expect proc die {msg} { puts stderr $msg; exit 1 } #log_file /root/do-setup-mysql.log spawn -noecho mysql_secure_installation expect "Enter current password for root" send "\r" expect { timeout { die "timeout before response" } "Access denied" { die "root password already set" } "Setting the root password" {} } expect "Change the root password" send "n\r" ... 

    И так далее по остальным вопросам. Сценарий должен создать /todofixme , иначе этот файл может быть чем-то известным, созданным mysql_secure_installation чтобы начальная установка не выполняла каждый запуск.