使用带有冒号的ansible lineinefile

时间:2015-06-08 20:22:40

标签: ansible ansible-playbook

我正在尝试确保在源文件中注释掉某个特定行。

这条线是这样的:

    CFUNCTYPE(c_int)(lambda: None)

如果存在,我想将其评论出来:

    # CFUNCTYPE(c_int)(lambda: None)

如果它不存在,请忽略它。

如果它已存在且已经注释掉,则不执行任何操作。

这是我写的剧本,但它不起作用。

tasks:
  - name: fix ctypes file
    lineinfile: dest='/usr/local/lib/python2.7/ctypes/__init__.py' regexp="^#?CFUNCTYPE(c_int)(lambda: None)" line='# CFUNCTYPE(c_int)(lambda: None)'

错误说:

  

这个看起来容易修复。行中似乎有一个额外的不带引号的冒号   这让解析器感到困惑。只期待找到一个免费的   结肠。解决方案只是在冒号周围添加一些引号,或引用   第一次结肠后的整行。

然而,修复起来并不容易,而且我试着以我能想到的各种方式引用它,但无济于事。

2 个答案:

答案 0 :(得分:0)

我使用了这个引用:

lineinfile: "dest='/usr/local/lib/python2.7/ctypes/__init__.py' regexp='^#?CFUNCTYPE(c_int)(lambda: None)' line='# CFUNCTYPE(c_int)(lambda: None)'"

为了忽略不存在的文件,我使用了以下代码:

- stat: path=/usr/local/lib/python2.7/ctypes/__init__.py
  register: init
- name: fix ctypes file
  replace: "dest='/usr/local/lib/python2.7/ctypes/__init__.py' regexp='^(    CFUNCTYPE.c_int..lambda: None.)' replace='    # CFUNCTYPE(c_int)(lambda: None)'"
  when: init.stat.exists == True
  sudo: yes

我还必须更改lineinfile以替换,因为该行以4个空格为前缀,我无法正确匹配。

答案 1 :(得分:0)

这是YAML的限制;解析器可能想要查看名称,冒号和名称=值对,在行上没有更多冒号,或只是名称,冒号和1引用的字符串值。

lineinfile doc提供了一个示例,表示sudoers提到这个(以及另一个没有提到的工作......)并且它引用了YAML作为问题。这意味着任何时候你需要在一个值中有一个冒号,你可以引用整个参数字符串只是为了节省调试麻烦。