我编写了一个 Ansible playbook,它提示我交互式输入 SSH 和 SUDO 的密码,如下所示。
$ ansible-playbook -i test --limit dev app_name.yml -vv --tags=stop
SSH password:
SUDO password[defaults to SSH password]:
Ansible 有多种可用选项,例如在 group_vars 下的 ansible_ssh_password 中定义密码,但它似乎对我不起作用,因为我无法在目标服务器中安装 sshpass,也不允许我对 sudoers 进行任何更改文件。
我尝试从下面的一个小期待脚本执行 ansible-playbook
#!/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 进程不是由预期产生的。有没有人尝试过这种方法并取得成功。请建议。谢谢。
最佳答案
您的expect脚本的问题是您实际上并没有在那里运行ansible命令(或任何与此相关的命令)。
你使用
send "ansible-playbook -i test --limit $where_to_execute $which_app_to_execute -vv --tags=$what_to_execute \r"
据我所知,将该字符串发送到...任何地方。它无处可去。
您想要要做的是生成
该ansible命令,然后使用expect与其通信。
类似这样的事情:
spawn ansible-playbook -i test --limit $where_to_execute $which_app_to_execute -vv --tags=$what_to_execute
如果 ansible 命令需要一段时间,您可能还需要设置 timeout
值(以防止 expect
在返回速度不够快时杀死它) )。
关于ssh - 期望脚本运行 Ansible playbook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34932013/