2016-01-21 2 views
2

Я написал игру Ansible, в которой мне предлагается ввести пароль в интерактивном режиме для SSH и SUDO, как показано ниже.Ожидайте сценария для запуска Ansible playbooks

$ ansible-playbook -i test --limit dev app_name.yml -vv --tags=stop 
SSH password: 
SUDO password[defaults to SSH password]: 

Существуют различные варианты с анзибль как определение пароля в ansible_ssh_password под group_vars, но это не похоже на работу для меня, так как я не могу быть sshpass установлен на моем целевом сервере, ни я имею право делать какие-либо изменения в файле sudoers.

Я попытался выполнить анзибль-пьесы из немного ожидать сценарий ниже

#!/usr/bin/expect -f 
set password PASSWORD 
set where_to_execute [lindex $argv 0] 
set which_app_to_execute [lindex $argv 1] 
set what_to_execute [lindex $argv 2] 

send "ansible-playbook -i test --limit $where_to_execute $which_app_to_execute -vv --tags=$what_to_execute \r" 
expect "SSH password:" 
send "$password \r" 
expect "SUDO password*" 
send "$password \r" 
expect "$" 
send "exit \r" 

К сожалению, это тоже не работает, может быть, потому что процесс SSH не порожден ожидать. Кто-нибудь пробовал этот метод и заработал. Пожалуйста, предложите. Благодарю.

+0

Не могли бы вы предоставить свой код для воспроизведения? –

+0

Спасибо, что посмотрели. Это просто не происходит с playbook, даже если я хочу выполнить некоторые команды adhoc через Ansible, он подскажет мне пароль, который ожидается, и что я хочу автоматизировать ввод пароля через ожидание –

+0

Пожалуйста, скажите мне, если вы не знакомы с python. Я могу дать вам небольшую дополнительную помощь, чтобы перевести ваш сценарий ожидания на pexpect –

ответ

3

Проблема с Ожидайте сценариев является то, что вы на самом деле не работает в анзибль команду там (или любую команду по этому вопросу).

используется

send "ansible-playbook -i test --limit $where_to_execute $which_app_to_execute -vv --tags=$what_to_execute \r" 

который посылает эту строку в ... нигде, насколько я знаю. Некуда идти.

Что вы хотите делать spawn Выполнение этой команды ansible, а затем использование возможности связи с ней.

Что-то вроде этого:

spawn ansible-playbook -i test --limit $where_to_execute $which_app_to_execute -vv --tags=$what_to_execute 

Вы также можете установить значение timeout если анзибль команда может занять некоторое время (чтобы предотвратить expect убить его, когда он не возвращается достаточно быстро).

+0

Это сработало! благодаря –

1

Он работает для меня, используя реализацию python. pexpect

установить pexpect с помощью пип: pip install pexpect

Вы можете использовать этот код в качестве временного решения для вашего сценария ожидать:

#!/usr/bin/python 
import pexpect 

def main(args): 

    #Setup variables 
    password, where, which, what = args 

    cmd = "ansible-playbook -i test --limit %s %s -vv --tags=%s" % (where, which, what) 

    child = pexpect.spawn(cmd) 
    child.sendline(password) 
    child.expect('SSH password:') 
    child.sendline(password) 
    child.expect('SUDO password*') 
    child.expect(pexpect.EOF) 

    print child.before 


if __name__ == '__main__': 
    main(sys.argv[1:]) 

Это самый простой пример, но он работает хорошо для меня.

./myscript.py mypassword dev app_name.yml stop

Как @Etan Рейснер отметил, основное отличие между кодом, который не работает и мой pexpect кодом является анзиблем команды spawn. Приведенный выше код на ожидают также отлично работает:

#!/usr/bin/expect -f 
spawn /usr/bin/ansible -m ping myserver --ask-pass 
expect "SSH password:" 
send "mypassword\r" 
expect "$ " 
+0

Вы создаете недоступную команду, которой нет в OP. Это, наверное, разница. –

+0

Да, ты прав. Просто попробовал сценарий ожидания, используя 'spawn' вместо' send' –

+0

Он работает! Благодарю. –