ssh - 期望脚本运行 Ansible playbook

标签 ssh ansible expect sudo

我编写了一个 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/

相关文章:

java - 通过 ssh 将 java 应用程序作为后台进程运行

linux - 如何在ansible中使用yum模块禁用所有存储库?

perl - 如何使用 Expect 为 Perl 脚本输入密码?

linux - 使用 'expect' 自动发送密码

linux - shell ftp 期望智能地从本地复制文件到ftp服务器

git - 当我使用 ssh 远程登录时,为什么 git push 会导致请求解锁本地机器上的私钥

linux - 在远程服务器上以不同用户身份自动运行脚本

mysql - 使用 Ansible 任务运行 SELECT 查询

shell - Ansible set_fact 不会更改变量值

ssh - 在没有屏幕的情况下启用 SSH Raspberry Pi