如何以正确的方式逃避ANible playbook中的字符?

时间:2016-03-14 20:52:07

标签: ansible ansible-playbook

我的Playbook打算通过上传模式文件来扩展LDAP模式。该命令如下所示:

- name: LDAP extend schema
  copy: src={{ 'cn={10}subs.ldif' }} dest={{ '/opt/data/ldap/config/cn=config/cn=schema/cn={10}subs.ldif }} owner=joe group=joe mode=0600
  ignore_errors: True

正如您所看到的,我{{eval}}路径为\ escaping不起作用。架构正确上传,但剧本停止,我想它不能进行校验和测试,因为它无法解决路径。我得到的错误如下:

fatal: [xx.domain.com] => failed to parse: Exception OSError: (2, 'No such file or directory', '/opt/data/ldap/config/cn=config/cn=schema/.ansible_tmp6XkGOucn={10}subs.ldif') in <bound method _TemporaryFileWrapper.__del__ of <closed file '<fdopen>', mode 'w+b' at 0x813660>> ignored
{"src": "/root/.ansible/tmp/ansible-tmp-1457985747.12-41932258379232/source", "md5sum": "651e7b60ebdcad75a95a5ff8e91695a8", "group": "joe", "uid": 498, "dest": "/opt/data/ldap/config/cn=config/cn=schema/cn={11}subs.ldif", "changed": true, "state": "file", "gid": 498, "secontext": "system_u:object_r:usr_t:s0", "mode": "0600", "owner": "joe", "size": 2481}

FATAL: all hosts have already failed -- aborting

我已经完成了一些谷歌搜索,看起来这不是一个错误,这是一个类似的问题:https://github.com/ansible/ansible/issues/8032

我想我做错了,并且有一些简单的方法可以将可逃避的字符作为srcdest传递给anisble的复制模块,但是我没有找到它会是什么。

1 个答案:

答案 0 :(得分:1)

我不确定你想要逃脱哪些角色,但我认为这是等号。

您发布的任务会在Ansible 2中抛出解析器错误,所以我还假设您运行Ansible 1.x,因为您得到了不同的内容。

  

意外异常:分割参数时出错,可能是不平衡的jinja2块或引号

鉴于我的第一个假设是正确的,您可以轻松解决转义问题,而不使用key = value表示法,但使用正确的YAML语法。

- name: LDAP extend schema
  copy:
    src: cn={10}subs.ldif
    dest: /opt/data/ldap/config/cn=config/cn=schema/cn={10}subs.ldif
    owner: joe
    group: joe

还有一个小的副作用,它实际上是可读的。 ;-)

这适用于Ansible 2.如果这不适用于您的Ansible版本,我不知道如果不升级Ansible就无法帮助您。因为这部分错误信息:

  

的/ opt /数据/ LDAP /配置/ CN =配置/ CN =架构/的 .ansible_tmp6XkGOu CN = {10} subs.ldif

显示它在文件名中注入一个唯一的字符串,通常不会在中间发生。所以我猜它在文件名中有一些特殊字符存在问题。无论您如何定义任务(YAML或k = v)

,Ansible 1都可能如此

解决方法是将文件复制到具有不同名称的位置,然后使用shell任务将其移动到所需位置。这应该独立于Ansible版本。

- name: LDAP extend schema
  copy:
    src: cn={10}subs.ldif
    dest: /tmp/ldap.extension
    owner: joe
    group: joe
  register: extension

- shell: "mv /tmp/ldap.extension /opt/data/ldap/config/cn=config/cn=schema/cn={10}subs.ldif"
  when: extension | changed
  creates: /opt/data/ldap/config/cn=config/cn=schema/cn={10}subs.ldif
  removes: /tmp/ldap.extension

但它也很难看......