如何解决如果它是 CLI 与通过状态文件,则 salt cmd.run 的执行具有不同的行为有什么不同?
我正在尝试使用 IMDSv2(AWS 实例元数据)令牌的值设置变量 TOKEN 以获取实例 IP 地址。
通过 salt CLI 执行一组命令会产生预期的结果:这是下面的命令:
salt-ssh 'name.of.host' cmd.run cmd='TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -s -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") && curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/public-ipv4'
但是,我试图通过这样的评估表达式执行相同的命令:
{{ salt["cmd.run"](cmd='TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -s -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") && curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/public-ipv4')}}
并显示以下错误:
FileNotFoundError: [Errno 2] No such file or directory: 'TOKEN=$(curl': 'TOKEN=$(curl'
我的想法是 salt 通过 CLI 评估命令表达式的方式与 jinja esque 评估不同。我也明白空格是 shell 表达式中盐的一个因素。我尝试了将转义字符放在等号、美元和括号后面的不同组合,但没有这样的运气。我仍然认为它与特殊字符有关,但无法确定是什么。
有什么想法吗?非常感谢。
解决方法
根据 documentation,cmd.run
默认不通过 Shell 处理命令。从上面的链接引用“警告”:
除非将 python_shell 标志设置为 True,否则此函数不会通过 shell 处理命令。这意味着任何特定于 shell 的功能,例如“echo”或管道的使用、重定向或 &&,都应该迁移到 cmd.shell 或在此处设置 python_shell=True 标志。
所以有两种选择:
-
不要使用
cmd.run
,而是使用cmd.shell
。例如:{{ salt.cmd.shell('TOKEN=$(curl -X PUT ...)') }}
-
或将
python_shell=True
添加到cmd.run
。例如:{{ salt.cmd.run('TOKEN=$(curl -X PUT ...)',python_shell=True) }}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。