即使已经在开头输入,Ansible同步提示密码

时间:2014-07-15 16:22:29

标签: ansible ansible-playbook

Ansible(v1.6.5)的同步模块会提示输入密码(输入密钥的密码),即使我已经在运行该剧本的开头。

知道为什么吗?

我使用以下选项运行我的剧本:

-u myuser --ask-sudo-pass --private-key=/path/to/id_rsa

这是我的同步任务:

- name: synchronize source files in src location
  sudo: yes
  synchronize: src={{local_src}} dest={{project_dirs.src}} archive=yes delete=yes rsync_opts=["--compress"]
  when: synchronize_src_files

使用ssh-agent更新

根据Lekensteyn的建议,我尝试使用ssh-agent。 我没有提示,但任务失败了。我错过了什么?

eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa

错误:

TASK: [rolebooks/project | synchronize source files in src location] **********
failed: [10.0.0.101] => {"cmd": "rsync --delay-updates -FF --compress --delete-after --archive --rsh 'ssh -i /home/vagrant/.ssh/id_rsa -o StrictHostKeyChecking=no' --rsync-path=\"sudo rsync\" [--compress] --out-format='<<CHANGED>>%i %n%L' /projects/webapp mike@10.0.0.101:/var/local/sites/project1/src", "failed": true, "rc": 12}
msg: sudo: no tty present and no askpass program specified
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.0]

5 个答案:

答案 0 :(得分:11)

synchronize命令(至少是Ansible 1.6.6)似乎忽略了Ansible打开的普通SSH控制套接字。您的任务可以扩展到以下内容:

{
    "cmd": "rsync --delay-updates -FF --compress --archive
        --rsh 'ssh  -o StrictHostKeyChecking=no'
        --out-format='<<CHANGED>>%i %n%L'
        /home/me/src/ user@host:/dest/",
    "failed": true,
    "rc": 23
}

要获取这些详细信息,请使用-v选项运行您的Playbook。作为解决方法,您可以启动ssh-agent并使用ssh-add添加SSH密钥缓存。有关详细信息,请参阅其手册页。

synchronize模块的额外警告:

  • 当使用sudo: yes运行时,ansible将以--rsh 'sudo ssh'运行,如果远程sudo配置需要密码和/或TTY,它将中断。解决方案:在任务定义中设置sudo: no
  • 登录远程计算机的用户是SSH用户(ansible_ssh_user),而不是sudo用户。我还没有找到覆盖此用户的方法(除了通过其中一个选项(-o User?)与dest_port="22 -o User=your_user"组合使用set_remote_user=yes选项覆盖用户的未经测试的方法。

这取自我的任务文件:

- name: sync app files
  sudo: no
  synchronize: src={{app_srcdir}}/ dest={{appdir}}/
               recursive=yes
               rsync_opts=--exclude=.hg
# and of course Ubuntu 12.04 does not support --usermap..
#,--chown={{deployuser}}:www-data
# the above goes bad because ansible_ssh_user=user has no privileges
#  local_action: command rsync -av --chown=:www-data
#                 {{app_srcdir}}
#                 {{deployuser}}@{{inventory_hostname}}:{{appdir}}/
#  when: app_srcdir is defined
# The above still goes bad because {{inventory_hostname}} is not ssh host...

答案 1 :(得分:5)

我认为默认情况下,synchronize是在rsync命令上显式设置用户名 - 你可以阻止这种情况并允许rsync在你的ssh配置文件中工作。

http://docs.ansible.com/synchronize_module.html

set_remote_user 将user @放入远程路径。如果您有自定义ssh配置来定义与库存用户不匹配的主机的远程用户,则应将此参数设置为&#34; no&#34;。

我在ssh配置中配置了一个远程用户,需要添加set_remote_user=no以使同步工作,否则它会尝试使用错误的用户名,ssh密钥和密码都不起作用。

答案 2 :(得分:2)

我尝试使用复制模块,但这需要花费太多时间。 因此,为了使同步模​​块工作,我将执行以下操作。它并不完美,但至少它有效。

  1. 将目标远程文件夹的所有权和权限更改为我正在使用的用户

  2. 使用不带sudo的同步

  3. 之前将目标遥控器的所有权和权限设置为我想要的

答案 3 :(得分:2)

在远程计算机上禁用tty_tickets中的/etc/sudoers可以解决此问题(以降低安全性为代价)。如,

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset,!tty_tickets
# ...

答案 4 :(得分:1)

解决此问题的最佳方法是将root用户的ssh authorized_keys安装到远程服务器上。