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

同一主机不同用户的Ansible Play间变量传递问题

问题原因与解决建议

问题根源

第二个Play的remote_user属于Play的连接级参数,Ansible会在Play开始执行之前就解析这个参数的值。而第一个Play中通过register得到的process_user变量,是在第一个Play运行过程中才被写入hostvars的,所以解析第二个Play的remote_user时,该变量还未存在,导致“未定义”错误。

解决步骤

1. 调整第一个Play:将进程用户保存为可缓存的主机变量

在第一个Play中,获取到进程用户后,用set_fact配合cacheable: yes将变量持久化到Ansible缓存中,确保第二个Play解析时能读取到:

- name: 获取进程运行的用户名
  hosts: all
  tasks:
    - name: 提取进程所属用户名
      shell: ps -eo uname:20,cmd | grep process_name | grep -v grep | head -1 | awk '{print $1}'
      register: process_user_raw

    - name: 保存进程用户到可缓存的主机变量
      set_fact:
        process_user: "{{ process_user_raw.stdout }}"
      cacheable: yes

2. 修改第二个Play:直接引用持久化后的变量

第二个Play的remote_user直接使用{{ process_user }}即可,此时变量已存在于缓存中,能被正确解析:

- name: 以进程用户身份执行修改操作
  hosts: all
  remote_user: "{{ process_user }}"
  tasks:
    - name: 修改目标文件
      lineinfile:
        src: somefile
        dest: "{{ ansible_env.HOME }}/process_name/somefile"

额外注意事项

  • 确保主Ansible用户有权限执行ps命令并获取到目标进程的信息;
  • 确认目标用户的SSH密钥已正确配置,主Ansible用户能无密码登录到该用户;
  • ps命令的head -1会取第一个匹配的进程用户,若存在多个同名进程,需根据实际需求调整逻辑。

内容的提问来源于stack exchange,提问作者Kirill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:39:52