Saltstack cloud.map 与 Bash 变量

问题描述

我正在尝试使用包装在 bash 脚本中的 Salt Cloud 在 VMWare 中配置 Windows 虚拟机,以便我可以对其进行参数化,但我在转义 map_data 时遇到了问题。

我的命令是:

#!/bin/bash
salt salt-cloud cloud.map_run map_data='{"PROFILE":[{"HOSTNAME":{"folder":"FOLDER","devices":{"network":{"Network adapter 1":{"ip":"MYIP"}}}}}]}'

这很好用,但是我希望 HOSTNAME、FOLDER 和 MYIP 是变量($hostname $folder 和 $ip),并且我在转义方面有点挣扎,以便变量被扩展并正确传递给 salt。

我尝试将变量内联到命令中:

salt salt-cloud cloud.map_run map_data='{"PROFILE":[{"$hostname":{"folder":"$folder,"devices":{"network":{"Network adapter 1":{"ip":"$ip"}}}}}]}'

这可以在使用关于可变元素不正确的 vmware 错误轰炸之前复制配置文件中的模板

我还尝试将整个地图数据封装在一个变量中,转义双引号并传递它,例如

data="'{\"PROFILE\":[{\"$hostname\":{\"folder\":\"$folder\",\"devices\":{\"network\":{\"Network adapter 1\":{\"ip\":\"$ip\"}}}}}]}'"

如果我将它回显出来,这似乎可以正确扩展,但是当我将它添加到我的命令中时:

salt salt-cloud cloud.map_run map_data=$data

我收到以下错误

Passed invalid arguments to cloud.map_run: map_run() takes at most 1 argument (10 given)

我知道这可能不是严格意义上的 Salt 的问题,但我想知道是否有人可以给我一些关于如何进行的指示?

解决方法

您是否尝试过这样的字符串连接:

salt salt-cloud cloud.map_run map_data='{"PROFILE":[{"'$hostname'":{"folder":"'$folder',"devices":{"network":{"Network adapter 1":{"ip":"'$ip'"}}}}}]}'
,

我自己不使用云应用程序,因此无法对其进行测试,只能查看您给出的第一个命令:

salt salt-cloud cloud.map_run map_data='{"PROFILE":[{"$hostname":{"folder":"$folder,"devices":{"network":{"Network adapter 1":{"ip":"$ip"}}}}}]}'

因为变量是单引号,所以不会展开。所以这行不通。

您给出的第二个命令:

data="'{\"PROFILE\":[{\"$hostname\":{\"folder\":\"$folder\",\"devices\":{\"network\":{\"Network adapter 1\":{\"ip\":\"$ip\"}}}}}]}'"

看起来正确,它会扩展变量,但与第一个命令相比,它还会在字符串中添加单引号(我认为您忘记删除它们了?)。

同样在您的第一个命令中, $folder 之后似乎缺少 "。

修复这些错误给了我命令:

salt salt-cloud cloud.map_run map_data="{\"PROFILE\":[{\"$hostname\":{\"folder\":\"$folder\",\"devices\":{\"network\":{\"Network adapter 1\":{\"ip\":\"$ip\"}}}}}]}"

我认为这会起作用。如果您将 echo 放在您的命令前面,并且只是复制您的 json,您可以将其复制/粘贴到一个 json 格式化程序中,例如 https://jsonformatter.curiousconcept.com/,它会告诉您您使用的 json 是否正确。这将帮助您找到缺少引号之类的东西。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...