因此ansible-playbook具有--ask-pass--ask-sudo-pass。有没有办法让ansible先尝试不带密码的ssh,然后在无密码登录失败的情况下仅提示输入密码?同样,ansible是否可以先尝试不带密码的sudo,然后仅在不起作用时提示您?

仅供引用,我有一个小shell函数来尝试通过反复试验来解决这个问题,但是我希望这样的事情可以解决。

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
}

最佳答案

如果您按如下所示设置ask_passssh_args,那么ansible应该在开始时要求您输入一次密码,并在公钥认证不起作用时使用该密码。

[defaults]
ask_pass      = True

[ssh_connection]
ssh_args = -o PubkeyAuthentication=yes -o PasswordAuthentication=yes -o ControlMaster=auto -o ControlPersist=60s

这仍然不是完整的解决方案:捕获(AFAIK)ansible使用sshpass,因此它从一开始就从您收集的密码将是它将使用的唯一密码,并且如果您为不同的计算机使用不同的密码,则该密码将无法使用。 :-)

我能想到的唯一其他技巧是用自己的脚本替换/usr/bin/ssh(或ansible使用的openssh的ssh),该脚本包装了从平面文件读取密码的逻辑(如果需要),我怀疑ansible会隐藏tty这样您的脚本将无法从标准输入中“读取”密码。

关于ansible - 可以仅在必要时自动输入密码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21892636/

10-16 17:36