只有在必要时才能自动询问密码

Pet*_*ons 8 ansible

所以ansible-playbook--ask-pass--ask-sudo-pass.有没有办法在没有密码的情况下首先尝试使用ssh,然后只有在无密码登录失败时才提示输入密码?同样,可以在没有密码的情况下首先尝试sudo然后只提示如果不起作用?

仅供参考我有一个小的shell函数试图通过反复试验来解决这个问题,但是我希望这样的事情能够被纳入ansible.

get_ansible_auth_args() {
  local base_check="ansible all --one-line --inventory-file=deploy/hosts/localhost.yml --args=/bin/true --sudo"
  ${base_check}
  if [[ $? -eq 0 ]]; then
    return;
  fi
  local args="--ask-pass"
  ${base_check} ${args}
  if [[ $? -eq 0 ]]; then
    export ANSIBLE_AUTH_ARGS="${args}"
    return;
  fi
  local args="--ask-pass --ask-sudo-pass"
  ${base_check} ${args}
  if [[ $? -eq 0 ]]; then
    export ANSIBLE_AUTH_ARGS="${args}"
    return;
  fi
}
Run Code Online (Sandbox Code Playgroud)

Kas*_*yap 1

如果您设置了ask_pass并且ssh_args如下所示,那么 ansible 应该在开始时询问您一次密码,并在公钥身份验证不起作用时使用该密码。

[defaults]
ask_pass      = True

[ssh_connection]
ssh_args = -o PubkeyAuthentication=yes -o PasswordAuthentication=yes -o ControlMaster=auto -o ControlPersist=60s
Run Code Online (Sandbox Code Playgroud)

这仍然不是完整的解决方案:捕获(AFAIK)ansible使用sshpass,因此它在开始时从您那里收集的密码将是它使用的唯一密码,如果您对不同的机器有不同的密码,它将不起作用。:-)

我能想到的唯一其他黑客就是用/usr/bin/ssh你自己的脚本替换(或者以ansible使用的openssh的ssh为准),该脚本包含从某个平面文件读取密码的逻辑(如果需要),我怀疑ansible会隐藏tty你的脚本将无法从标准输入“读取”密码。