同步模块失败并成为

4 ansible

我正在尝试使用同步模块将文件从 Ansible 节点复制到远程节点。

我希望这些文件存在于UserB远程节点上,但我无权UserB直接访问。相反,UserA具有 sudo 权限来切换到UserB. 所以我登录为UserA.

我的环境文件说:

ansible_ssh_user=UserA
ansible_ssh_pass=<PassUserA>
ansible_become_method=sudo
ansible_become_user=UserB
ansible_become_pass=<PassUserA>
Run Code Online (Sandbox Code Playgroud)

我的任务是:

- name: Copy and unarchive webapps node.
  synchronize: src=/home/ansible/templates/app/Sprint6/webapps dest=/opt/msdp/ca/app checksum=yes
  become: yes
Run Code Online (Sandbox Code Playgroud)

但是当我运行剧本时,出现错误:

fatal: [5.232.57.247]: FAILED! => {"changed": false, "cmd": "/usr/bin/rsync --delay-updates -F --compress --checksum --archive --rsh 'ssh  -S none -o StrictHostKeyChecking=no -o ControlMaster=auto -o ControlPersist=60s' --rsync-path=\"sudo rsync\" --out-format='<<CHANGED>>%i %n%L' \"/home/ansible/templates/app/Sprint6/webapps\" \"UserA@5.232.57.247:/opt/msdp/ca/app\"", "failed": true, "msg": "sudo: sorry, you must have a tty to run sudo\nrsync: connection unexpectedly closed (0 bytes received so far) [sender]\nrsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]\n", "rc": 12}
Run Code Online (Sandbox Code Playgroud)

在远程节点上,只能UserB写下:/opt/msdp/ca/app

是否有我缺少的配置?

tec*_*raf 7

synchronize模块在控制机上本地执行(而不是在目标节点上),默认情况下它使用那里使用的帐户(SSH 凭据)连接到节点(当前登录的帐户,或在 中定义~/.ssh/config)。

首先,您需要通过添加连接时要考虑的值use_ssh_args的参数来覆盖默认行为:ansible_ssh_*

use_ssh_args使用中指定的 ssh_argsansible.cfg


其次,由于任务是在本地运行的,become指令也只在控制机上有效。ansible_become_*变量不适用于这种情况。

相反,您可以通过参数告诉模块运行sudo rsync以提升目标节点上的权限rsync_path

- name: Copy and unarchive webapps node.
  synchronize:
    src: /home/ansible/templates/app/Sprint6/webapps
    dest: /opt/msdp/ca/app checksum=yes
    use_ssh_args: yes
    rsync_path: "sudo -u UserB rsync"
Run Code Online (Sandbox Code Playgroud)

最后,上面假设 sudoers 设置允许无密码 sudo。如果您确实需要以纯文本形式提供密码,则需要另一种解决方法,例如:

rsync_path: "echo {{ UserA_password }} | sudo -S -u UserB rsync"
Run Code Online (Sandbox Code Playgroud)