我正在尝试使用expect脚本运行ansible来输入密码和其他有用的信息。
#!/usr/bin/expect -f
log_file /tmp/ansible.log
set timeout 120
set playbook [lindex $argv 0]
set host [lindex $argv 1]
set username [lindex $argv 2]
set password [lindex $argv 3]
spawn /usr/bin/ansible-playbook $playbook -l $host -e 'ansible_user=$username' -k -K -vvvv
expect "SSH password:"
send $password\n
expect "SUDO password*"
send $password\n
expect "$"
send "exit\n"
我得到的输出是:
spawn /usr/bin/ansible-playbook /etc/ansible/playbooks/my_playbook.yml -l the_host -e 'ansible_user=ansible_user' -k -K -vvvv
Using /etc/ansible/ansible.cfg as config file
SSH password:
SUDO password[defaults to SSH password]:
然后我回到提示符。没有失败,没有任何东西,/ tmp / ansible.log中没有任何内容也不在我的屏幕上。我在ansible中输出了详细的输出。
我在ansible.cfg中开启了登录,所有这一切都说它是使用/etc/ansible/ansible.cfg作为配置文件。
我的猜测是错误在于我使用expect的无能,除了作为瑞士军刀 - 但我从stackoverflow中偷走了大部分代码,所以它必须正确!
在SLES 11上使用Ansible 2.0
这是我在期望打开调试时获得的(相关位,我认为它与sudo密码正确匹配):
1: expect "SSH password:"
dbg1.10>
Using /etc/ansible/ansible.cfg as config file
SSH password: 1: send $password\n
dbg1.11>
1: expect "SUDO password*"
dbg1.12>
SUDO password[defaults to SSH password]: 1: send $password\n
dbg1.13>
1: expect "$"
dbg1.14>
1: send "exit\n"
dbg1.15>
1: exit 0
dbg1.16>
2: rename _close.pre_expect close
dbg2.17>