【问题标题】:Ansible synchronize prompts passphrase even if already entered at the beginningAnsible 同步提示密码,即使在开头已经输入
【发布时间】:2014-09-05 22:50:57
【问题描述】:

Ansible (v1.6.5) 的同步模块会提示输入密码(Enter passphrase for key)即使我在开始运行 playbook 时已经输入了

知道为什么吗?

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

-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]

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

    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 选项运行您的剧本。作为解决方法,您可以启动 ssh-agent 并使用 ssh-add 添加缓存您的 SSH 密钥。有关详细信息,请参阅他们的手册页。

    synchronize 模块的额外注意事项:

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

    这取自我的任务文件:

    - 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...
    

    【讨论】:

    • 好的,所以我遇到的是“正常”行为,这不仅仅是我的情况的问题。使用 ssh-agent 有效还是建议尝试一下?
    • 这是“正常”行为,但不希望 rsync 不使用 Ansible 的控制套接字,这应该避免重新验证的需要。 ssh-agent 确实有效,这是我(可能还有其他大多数人)所做的。 docs.ansible.com/intro_getting_started.html 上也提到过
    • @YAmikep 错误来自sudo,表示SSH命令成功。我是否已经提到我发现 synchronize 是 ansible 中最糟糕、未集成的部分?
    • 是的,我同意,这个模块现在不是最好的。我不能使用复制模块,它需要太多时间,所以我所做的工作是在使用同步之前更改远程文件夹的所有权和权限。我用我的解决方案回答了我的问题。你怎么看?
    【解决方案2】:

    我认为默认同步是在 rsync 命令上显式设置用户名 - 您可以防止这种情况并允许 rsync 从您的 ssh 配置文件中工作。

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

    set_remote_user 将 user@ 用于远程路径。如果您有自定义 ssh 配置来为与清单用户不匹配的主机定义远程用户,则应将此参数设置为“no”。

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

    【讨论】:

      【解决方案3】:

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

      #
      # 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. 将目标远程文件夹的所有权和权限更改为我正在使用的用户

        2. 在不使用 sudo 的情况下使用同步

        3. 将目标远程的所有权和权限设置为我之前想要的

        【讨论】:

        • 如果同步失败,(3) 将不会执行,这可能会导致您的部署处于损坏状态。这可以通过添加ignore_errors: True 并在register: sync_result 之后添加额外的检查来解决,但这也是不理想的。也许有人已经在 Ansible 错误跟踪器上报告了这一点?
        • @Lekensteyn 有一个关于“在 playbook 运行期间同步模块要求输入密码”的错误报告github.com/ansible/ansible/issues/7071
        【解决方案5】:

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

        【讨论】:

        • 考虑到许多远程容器服务(例如 EC2)技术上已经支持 root 登录(通过 ssh ec2-user@node; sudo su),这可能过早地被否决了。因此,将密钥复制到 root 并不是真正的安全风险。如果有的话,它会让生活变得更简单。
        • synchronize 完成后从远程根用户中删除密钥会将安全风险限制在一个狭窄的时间窗口内。
        猜你喜欢
        • 2014-08-21
        • 2015-10-25
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 2015-07-28
        • 1970-01-01
        相关资源
        最近更新 更多