【问题标题】:Using ansible lineinefile with colon in line使用带有冒号的 ansible lineinefile
【发布时间】:2015-06-09 09:02:25
【问题描述】:

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

行是这样的:

    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)'

错误提示:

这个看起来很容易修复。该行中似乎有一个额外的未加引号的冒号 这使解析器感到困惑。只希望能找到一个免费的 冒号。解决方案是在冒号周围添加一些引号,或者引用 第一个冒号后的整行。

但是,它并不容易修复,我尝试了各种我能想到的方式引用它,但无济于事。

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

    我使它与这个引用一起工作:

    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 个空格为前缀,我无法正确匹配。

    【讨论】:

      【解决方案2】:

      这是 YAML 限制;解析器可能希望看到名称、冒号和名称=值对,行中没有更多的冒号,或者只是名称、冒号和 1 个带引号的字符串值。

      lineinfile 文档有一个示例供 sudoers 提到这一点(还有一个更远的不工作的示例......),它引用 YAML 作为问题。这意味着任何时候你需要在一个值中有一个冒号,你也可以引用整个参数字符串,只是为了省去调试的麻烦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-31
        • 2018-04-18
        • 1970-01-01
        • 2015-07-08
        • 2015-08-18
        • 2012-03-26
        • 2011-09-11
        • 2017-04-17
        相关资源
        最近更新 更多