【问题标题】:Saltstack cloud.map with Bash variablesSaltstack cloud.map 与 Bash 变量
【发布时间】:2021-05-22 08:04:16
【问题描述】:

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

【问题讨论】:

    标签: bash salt-stack salt-cloud


    【解决方案1】:

    你有没有尝试过这样的字符串连接:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 就是这样,谢谢!我一定会检查 jsonformatter :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多