将Ansible变量从Unicode转换为ASCII

Wra*_*arp 10 unicode ansible

我在远程系统上获取命令的输出并将其存储在变量中.然后它用于填写放置在系统上的文件模板.

- 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
Run Code Online (Sandbox Code Playgroud)

initiatorname.iscsi.template文件包含:

InitiatorName={{ iscsiname.stdout_lines }}
Run Code Online (Sandbox Code Playgroud)

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

InitiatorName=[u'iqn.2005-03.org.open-iscsi:2bb08ec8f94']
Run Code Online (Sandbox Code Playgroud)

我想要的是:

InitiatorName=iqn.2005-03.org.open-iscsi:2bb08ec8f94
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

我意识到我可以使用"echo"InitiatorName = $(/ usr/sbin/iscsi-iname)"> /etc/iscsi/initiatorname.iscsi"将其写入文件,但这似乎是一种不可接受的方式.

提前致谢.

小智 8

FWIW,如果你真的有一个数组:

[u'string1', u'string2', u'string3']
Run Code Online (Sandbox Code Playgroud)

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

ABC=[u'string1', u'string2', u'string3']
Run Code Online (Sandbox Code Playgroud)

但你更喜欢:

ABC=["string1", "string2", "string3"]
Run Code Online (Sandbox Code Playgroud)

然后,这将做的伎俩:

ABC=["{{ iscsiname.stdout_lines | list | join("\", \"") }}"]
Run Code Online (Sandbox Code Playgroud)

(由于我的代码最初是在字符串中而产生的额外反斜杠.)

  • 轻微错字,应该是:`ABC = ["{{iscsiname.stdout_lines | list | join("\",\"")}}"] (2认同)

ind*_*man 7

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

InitiatorName = {{ iscsiname.stdout_lines | to_yaml }}
Run Code Online (Sandbox Code Playgroud)

Ansible Playbook过滤器

  • 谨防。根据 ansible 文档:`to_yaml 和 to_nice_yaml 过滤器使用 PyYAML 库,该库默认有 80 个符号字符串长度限制。这会导致第 80 个符号后出现意外换行(如果第 80 个符号后有空格)为了避免这种行为并生成长行,可以使用 width 选项:` (2认同)