我正在编写一个 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 }}
有什么想法吗?
正确的转义应该是:
'/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)