同一主机不同用户的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
相关产品推荐
相关产品推荐

