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

如何在salt-local中配置多个file-root以兼容主目录与公式目录?

如何为salt-call --local配置多个文件根目录

问题描述

我执行了以下命令:

salt-call --local --file-root="$(git rev-parse --show-toplevel)" --file-root="$(git rev-parse --show-toplevel)/formulas/firewalld-formula" --pillar-root="$(git rev-parse --show-toplevel)/pillar" state.test firewalld

该命令仅能正常调用firewalld-formula目录下的firewalld状态,但原文件根目录会被覆盖,导致原根目录中的其他状态无法被找到。手册页中--file-root参数仅提及单个路径:

--file-root=FILE_ROOT
     Set this directory as the base file root.

尝试将多个路径放在同一个--file-root参数中(用空格分隔),会导致Salt完全无法定位状态文件,例如:

--file-root="$(git rev-parse --show-toplevel) $(git rev-parse --show-toplevel)/formulas/firewalld-formula"

在Salt主节点上,我可以通过配置文件定义多个文件根目录:

file_roots:
  base:
    - /salt/srv
    - /salt/srv/formulas/firewalld-formula

请问如何为salt-call --local实现类似的多文件根配置?

解决方案

方法1:用临时配置文件实现

创建一个临时的minion配置文件(比如命名为minion),写入多文件根的配置:

GIT_ROOT=$(git rev-parse --show-toplevel)
cat > minion << EOF
file_roots:
  base:
    - $GIT_ROOT
    - $GIT_ROOT/formulas/firewalld-formula
pillar_roots:
  base:
    - $GIT_ROOT/pillar
EOF

然后执行salt-call时指定该配置所在的目录(这里用当前目录):

salt-call --local -c . state.test firewalld

执行完后可以删除这个临时的minion文件。

方法2:直接用命令行参数传递配置

Salt支持通过--config-option参数在命令行直接设置配置项,针对多文件根可以用JSON数组格式传递:

GIT_ROOT=$(git rev-parse --show-toplevel)
salt-call --local \
  --config-option "file_roots.base=[\"$GIT_ROOT\", \"$GIT_ROOT/formulas/firewalld-formula\"]" \
  --pillar-root="$GIT_ROOT/pillar" \
  state.test firewalld

这种方式不需要创建临时文件,适合一次性执行的场景。

方法3:通过环境变量设置

也可以用环境变量SALT_FILE_ROOTS传递配置,格式为JSON:

GIT_ROOT=$(git rev-parse --show-toplevel)
export SALT_FILE_ROOTS='{"base": ["'$GIT_ROOT'", "'$GIT_ROOT'/formulas/firewalld-formula"]}'
salt-call --local --pillar-root="$GIT_ROOT/pillar" state.test firewalld

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:25:28