0

我正在尝试使用包装在 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 的问题,但我想知道是否有人可以给我一些关于如何进行的指示?

4

2 回答 2

0

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

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 是否正确。这将帮助您找到诸如缺少引号之类的内容。

于 2021-02-19T12:53:32.583 回答
0

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

salt salt-cloud cloud.map_run map_data='{"PROFILE":[{"'$hostname'":{"folder":"'$folder',"devices":{"network":{"Network adapter 1":{"ip":"'$ip'"}}}}}]}'
于 2021-02-19T12:53:26.417 回答