You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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"}

问题原因

  1. raw模块与模块执行上下文冲突:raw模块直接通过SSH执行命令,绕过Ansible模块框架,连续执行带sudo的raw命令后,SSH会话权限状态异常,导致后续copy模块无法正确获取文件信息,甚至出现路径解析错误(错误中显示的/var/environment与配置的/etc/environment不符,就是会话异常的表现)。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:05:31