如何将复杂 shell 命令的输出分配给处于盐状态的 Jinja 中的变量

问题描述 投票:0回答:1

我正在编写一个 Salt 状态,其中有以下 shell 命令:

/path/to/directory/java/bin/./java -version 2>&1 | awk -F'java version' '{print $1}' | awk -F'\.' '{print $2; exit}'| tr -d '"'

当我将它作为脚本运行或直接在我的服务器中的 Bash 中运行时,它会起作用(标准输出只是一个像“_021”这样的数字)。我需要将该数字保存在 Jinja 变量中,以便稍后可以将其传递到状态中的函数中,但问题是特殊字符和空格以及其他东西会导致各种转义问题,而 Jinja 或 YAML 不会读取它正确。

我尝试过使用 \ 进行典型的转义,将命令放入

{% raw %}
块中,用三引号将其括起来,使用
| safe
标志,我似乎无法让它工作......

本质上我想做的是:

{% set minorVer = salt['cmd.run']("/path/to/directory/java/bin/./java -version 2>&1 | awk -F'java version' '{print $1}' | awk -F'\.' '{print $2; exit}'| tr -d '"' ")

My Function:
  cmd.run:
    - name: run the command with variable {{ minorVer }}

有什么想法吗?

yaml jinja2 escaping salt-stack
1个回答
0
投票

正确的转义应该是:

'/path/to/directory/java/bin/./java -version 2>&1 | awk -F\'java version\' \'{print $1}\' | awk -F\'\\.\' \'{print $2; exit}\'| tr -d \'"\''

但这一切都可以通过在 jinja 中进行文本处理来避免,例如

{% set version_out = salt["cmd.run"]("${JAVA_HOME}/java -version") %}
{% set version = version_out.splitlines()[0].split(" ")[2] | replace('"', '') %}
{% set minorVersion = version.split(".")[2] %}

另请注意,您的处理不适用于许多 Java 安装。例如,我得到这些输出,其中没有“java版本”或“_xxx”:

openjdk version "11.0.20" 2023-07-18
OpenJDK Runtime Environment (build 11.0.20+8-post-Ubuntu-1ubuntu120.04)
OpenJDK 64-Bit Server VM (build 11.0.20+8-post-Ubuntu-1ubuntu120.04, mixed mode, sharing)
openjdk version "11.0.20" 2023-07-18
OpenJDK Runtime Environment Temurin-11.0.20+8 (build 11.0.20+8)
OpenJDK 64-Bit Server VM Temurin-11.0.20+8 (build 11.0.20+8, mixed mode)
© www.soinside.com 2019 - 2024. All rights reserved.