使用Ansible部署EC2 Ubuntu22.04时复制文件到/etc/environment失败求助
问题:Ansible复制文件到/etc/environment失败,报错"Failed to get information on remote file /etc/environment"
问题详情
使用Ansible创建Ubuntu 22.04 EC2实例时,尝试将本地文件复制到远程/etc/environment路径,即便配置了become权限,仍报错"Failed to get information on remote file /etc/environment"。
Playbook代码
- name: deploy everything hosts: all remote_user: ubuntu become: yes become_method: sudo gather_facts: no vars: ansible_python_interpreter: /usr/bin/python3 DEBIAN_FRONTEND: noninteractive pre_tasks: - name: 'update' raw: sudo apt-get -y update - name: 'upgrade' raw: sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade - name: 'install Python3 part 1' raw: sudo apt-get -y update && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y python3-simplejson - name: 'Install Python3 part 2' raw: test -e /usr/bin/python3 || (apt-get update -y && apt-get install -y python3-minimal) - name: 'Configure environment' copy: src: environment dest: /etc/environment
完整错误信息
{"type":"log", "content":"fatal: [IP]: FAILED! => {\"msg\": \"Failed to get information on remote file (/var/environment): Shared connection to *IP* closed.\\r\\n\"} "}, {"type":"log", "content":"\\tto retry, use: --limit @/var/tmp/sysadmin/architecture/64887bcd740cc/launch.retry\n\nPLAY RECAP *********************************************************************\nIP: ok=4 changed=4 unreachable=0 failed=1"}
问题原因
- raw模块与模块执行上下文冲突:raw模块直接通过SSH执行命令,绕过Ansible模块框架,连续执行带
sudo的raw命令后,SSH会话权限状态异常,导致后续copy模块无法正确获取文件信息,甚至出现路径解析错误(错误中显示的/var/environment与配置的/etc/environment不符,就是会话异常的表现)。 - gather_facts关闭导致环境检测缺失:关闭
gather_facts后,Ansible无法自动检测远程主机的Python环境和系统信息,即便手动安装了Python,也可能存在环境变量或权限传递问题。
解决方案
方案1:重构Playbook,优先使用Ansible原生模块
尽量避免大量使用raw模块,先通过raw安装最小Python环境,再切换到apt模块完成系统更新,最后执行复制操作:
- name: deploy everything hosts: all remote_user: ubuntu become: yes become_method: sudo gather_facts: no vars: ansible_python_interpreter: /usr/bin/python3 DEBIAN_FRONTEND: noninteractive pre_tasks: # 先确保Python3及依赖安装完成 - name: Install minimal Python3 environment raw: > test -e /usr/bin/python3 || (apt-get update -y && apt-get install -y python3-minimal python3-simplejson) args: executable: /bin/bash # 安装完成后收集系统信息,确保模块执行上下文正常 - name: Gather system facts setup: # 使用apt模块更新缓存 - name: Update apt package cache apt: update_cache: yes # 使用apt模块升级系统包 - name: Upgrade all system packages apt: upgrade: dist dpkg_options: "force-confdef,force-confold" environment: DEBIAN_FRONTEND: "{{ DEBIAN_FRONTEND }}" tasks: - name: Copy environment file to /etc/environment copy: src: environment dest: /etc/environment owner: root group: root mode: '0644'
方案2:确保copy模块的权限传递
如果需要保留现有raw模块结构,可在copy模块中显式指定become参数,同时确认本地文件路径正确:
- name: 'Configure environment' copy: src: ./environment # 显式指定本地文件路径,避免路径解析错误 dest: /etc/environment owner: root group: root mode: '0644' become: yes become_method: sudo
额外检查项
- 确认本地
environment文件存在于Playbook执行目录下,或使用绝对路径指定src。 - 检查EC2实例安全组是否允许稳定的SSH连接,避免会话中途关闭。
- 查看远程主机
/var/log/auth.log,确认sudo权限是否正常生效。
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

