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

AWX中role_path变量识别失败问题求助

AWX中使用role_path动态生成角色vars文件失败的解决办法

问题背景

在AWX运行带Ansible角色的任务时,试图通过role_path变量动态生成角色的vars/main.yml文件,避免硬编码项目目录,但执行时报错找不到目标路径。相关代码及错误信息如下:

Playbook代码片段

- name: Running script
  script: generate_t0_vars.sh {{ t0_count }} "{{ role_path }}"
  register: output

- include_vars: "{{ role_path }}/vars/main.yml"

生成vars的Bash脚本generate_t0_vars.sh

#!/bin/bash
t0_count=$1
role_path=$2
t0_name=()
for i in $(seq -f "%02g" 1 $t0_count); do t0_name+=(T0_GW_$i); done

echo -n "" > "$role_path/vars/main.yml"
echo "vars_t0:" >> "$role_path/vars/main.yml"

for i in $(seq 0 $((${#t0_name[@]} - 1)))
do
        echo "  - t0_name: ${t0_name[$i]}" >> "$role_path/vars/main.yml"
done

报错信息

"/home/user/.ansible/var/tmp/ansible-tmp-1669894315.1132782-31686-208889357499252/generate_t0_vars.sh: 
 /tmp/awx_2484_zvvoz0dl/project/roles/t0_create/vars/main.yml: No such file or directory"

已尝试修改ansible.cfg的roles_path、配置remote_tmp,均无效果;仅硬编码项目目录时任务可正常运行。

核心原因

问题出在**script模块的执行逻辑**:script模块会把控制节点(AWX服务器)上的脚本复制到远程目标节点的临时目录中执行,此时脚本接收的role_path是AWX控制节点上的项目路径,但远程节点并没有这个目录结构,因此会触发"文件不存在"的错误。

解决方法

方法一:用Ansible原生逻辑替代Bash脚本

直接用Ansible模块完成vars文件的生成,所有操作在AWX控制节点执行,能正确识别role_path:

- name: 生成T0名称列表
  set_fact:
    t0_name_list: "{{ range(1, t0_count|int + 1) | map('format', 'T0_GW_%02d') | list }}"

- name: 确保vars目录存在
  file:
    path: "{{ role_path }}/vars"
    state: directory

- name: 生成vars/main.yml文件内容
  copy:
    content: |
      vars_t0:
      {% for t0_name in t0_name_list %}
        - t0_name: {{ t0_name }}
      {% endfor %}
    dest: "{{ role_path }}/vars/main.yml"

- include_vars: "{{ role_path }}/vars/main.yml"

方法二:修改脚本执行方式,在控制节点运行

如果必须保留Bash脚本,改用command/shell模块并指定在控制节点执行:

- name: 在控制节点执行生成脚本
  command: "{{ role_path }}/generate_t0_vars.sh {{ t0_count }} {{ role_path }}"
  delegate_to: localhost
  register: output

- name: 确保vars目录存在(可选,防止目录缺失)
  file:
    path: "{{ role_path }}/vars"
    state: directory
    delegate_to: localhost

- include_vars: "{{ role_path }}/vars/main.yml"

注意:需确保generate_t0_vars.sh具备可执行权限,且AWX运行用户能访问该脚本路径。

额外提示

  • 避免在script模块中使用控制节点特有的路径变量,该模块的执行上下文是远程节点。
  • 若涉及文件操作,优先用Ansible原生模块(如copy、file),减少跨节点路径问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:55:18