将Ansible变量从Unicode转换为ASCII

14

我正在获取远程系统上命令的输出并将其存储在变量中。然后使用它来填充文件模板,该模板会放置在该系统上。

- name: Retrieve Initiator Name
  command: /usr/sbin/iscsi-iname
  register: iscsiname

- name: Setup InitiatorName File
  template: src=initiatorname.iscsi.template dest=/etc/iscsi/initiatorname.iscsi

initiatorname.iscsi.template文件包含:

InitiatorName={{ iscsiname.stdout_lines }}

然而,当我运行它时,我得到了一个包含以下内容的文件:

InitiatorName=[u'iqn.2005-03.org.open-iscsi:2bb08ec8f94']

我想要的是:

InitiatorName=iqn.2005-03.org.open-iscsi:2bb08ec8f94

我做错了什么?

我意识到我可以使用"echo "InitiatorName=$(/usr/sbin/iscsi-iname)" > /etc/iscsi/initiatorname.iscsi"将其写入文件,但这似乎不是按照Ansible的方式进行操作。

提前致谢。


3
方括号表示你有一个列表。如果你只想要列表中的第一行,可以尝试使用 stdout_lines[0] - bobince
谢谢,就是这样了。我应该意识到它是Python。 - Wraezor Sharp
太棒了,谢谢 @bobince - JaseC
3个回答

13

顺便提一句,如果你确实有一个数组:

[u'string1', u'string2', u'string3']

而您希望您的模板/结果不是:

ABC=[u'string1', u'string2', u'string3']

但是你更喜欢:

ABC=["string1", "string2", "string3"]

那么,这将起到作用:

ABC=["{{ iscsiname.stdout_lines | list | join("\", \"") }}"]

(由于我的代码最初是字符串形式,所以有额外的反斜杠.)


2
有一个小错误,应该是:ABC=["{{ iscsiname.stdout_lines | list | join("\", \"") }}"] - Conor Svensson

12

使用过滤器来避免Unicode字符串:

InitiatorName = {{ iscsiname.stdout_lines | to_yaml }}

Ansible Playbook Filters


这确实解决了问题,但掩盖了实际的问题,即输入是一个数组,而不是一个字符串。 - NoUserException
2
注意。根据ansible文档:to_yaml和to_nice_yaml过滤器使用PyYAML库,该库具有默认的80个字符长度限制。这会导致在第80个符号之后出现意外的换行(如果第80个符号后有空格)。为了避免这种行为并生成长行,可以使用width选项: - Tom Lime

1
为避免 PyYAML 的 80 个字符限制,只需使用 to_json 过滤器即可:
InitiatorName = {{ iscsiname.stdout_lines | to_yaml }}

在我的情况下,我想从逗号分隔的列表中创建一个Python数组。因此,a,b,c 应该变成 ["a", "b", "c"]。但是不带'u'前缀,因为我需要来自WebSpher的字符串比较(不含特殊字符)。由于它们似乎没有相同的编码,比较失败。因此,我不能简单地使用var.split(',')
由于字符串不包含特殊字符,我只需使用to_jsonmap(trim)相结合。这解决了 a, b 将成为"a","b"的问题。
restartApps = {{ apps.split(',') | map('trim') | list | to_json }}

由于JSON也支持数组,因此我得到的结果与Python生成的结果相同,但没有u前缀。

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