Ansible,命令行变量中的空格

20

我即将更新许多本地开发的 Debian 软件包的更改日志。我正在使用 'Ansible' 调用 devscripts 软件包中的 'dch' 工具。我选择使用 Ansible 是因为我已经在 Ansible 变量中列出了软件包的子版本路径。我希望能够将实际的更改日志消息作为命令行变量输入,但似乎 ansible 无法解析命令行中输入的变量中的空格。

我已经尝试过:

ansible-playbook tag_changelog_on_packages.yml -e changelog_message="testing testing"
ansible-playbook tag_changelog_on_packages.yml -e changelog_message='testing testing'
ansible-playbook tag_changelog_on_packages.yml -e changelog_message=testing\ testing
ansible-playbook tag_changelog_on_packages.yml -e changelog_message="testing\ testing"
在所有情况下,我只得到了第一个“testing”。最后一次尝试会导致ansible崩溃,出现“ValueError: No escaped character”错误,可能是因为空格被剥离了。 我有遗漏什么吗?祝好。
1个回答

33
那是因为它首先由shell处理,它会吃掉您使用的引号和反斜杠。您可以将整个参数括在单引号中,告诉shell不要触碰内部内容。然后,变量的值可以用双引号括起来,这将保留给ansible。
```

那是因为它首先由shell处理,它会吃掉您使用的引号和反斜杠。

您可以将整个参数括在单引号中,告诉shell不要触碰内部内容。然后,变量的值可以用双引号括起来,这将保留给ansible。

ansible-playbook tag_changelog_on_packages.yml -e 'changelog_message="testing testing"'

编辑:正如Ken Pronovici在评论中指出的那样,颠倒引号更有意义,因为它允许使用shell vars:

-e "name='${NAME}'"

```

7
对于其他希望使用包含空格的shell变量方式的人,这个基本原则仍然有效,但你需要反转双引号和单引号的使用,例如 -e "name='${NAME}'" - Ken Pronovici
1
非常感谢!我已经花了几个小时在这上面,但是一直无法让它工作。 - user1943442
1
我刚刚为了那个狗屎问题浪费了1.5小时...真是谢了! - ferdy
我之前也遇到了类似的问题,不过这个方法解决了它,谢谢。我在一个变量中提供了一个包含多个空格分隔参数的脚本,因为传递给脚本的是这样的格式,但实际上只传递了该文字的第一部分。以下是测试案例: ansible-playbook .... --extra-var dnslist="8.8.8.8 8.8.4.4" 它只传递了8.8.8.8。加上引号后就可以了。例如: ansible-playbook .... --extra-var 'dnslist="8.8.8.8 8.8.4.4"' - xCovelus
mitroo,建议您更新您的答案,加入@KenPronovici的评论-这将使解决方案更通用。谢谢! - Gonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接