【问题标题】:Ansible - Append variable in lineAnsible - 在行中附加变量
【发布时间】:2017-04-08 16:22:36
【问题描述】:

我想将属性附加到文件,而不是在新行上替换或设置它。

文件内容:

PATH = "/a/path"

文件中必须附加属性的变量:

"{{ key.values() | map(attribute='hi') | list | join(' ') }}"

变量的输出为:

/hi1 /hi2 /hi3 

尝试使用lineinfile 追加,但参数insertafter 将属性放在新行上,而不是同一行。

- lineinfile:
    dest: /file
    state: present
    insertafter: 'PATH = "'
    line: "{{ mounts.values() | map(attribute='mountpoint') | list | join(' ') }}"

预期结果:

PATH = "/a/path /hi1 /h2 /hi3"

实际结果:

PATH = "/a/path"
/hi1 /hi2 /hi3

如果我使用这里描述的方法会收到语法错误:Ansible: insert a single word on an existing line in a file

对于这个特定的用例,我应该使用哪个模块?

使用 Ansible v2.1.2.0


编辑

backrefs 选项给出了相同的结果,这是意料之外的:

 - lineinfile:
     dest: /file
     backrefs: yes
     regexp: 'PATH = "'
     line: "{{ key.values() | map(attribute='hi') | list | join(' ') }}"

【问题讨论】:

  • 当你使用反向引用时,你的正则表达式必须有捕获组才能工作。请参阅下面的示例。

标签: ansible


【解决方案1】:

感谢您帮助@Mir。 最终解决方案:

 - lineinfile:
    dest: /file
    backrefs: yes
    regexp: '(^PATH\s+\=\s+)(?:")([\w+\s/]+)(?<!{{ hi }})(?:")'
    line: '\1"\2 {{ hi }}"'

hi 是变量。

【讨论】:

    【解决方案2】:

    Lineinfile 模块有 backrefs 选项,它与 regexp 选项配对,允许您匹配现有行并仅更改其中的一部分。

    类似的东西(未测试)

    - lineinfile:
      [...]
      regexp: ^PATH = "(.*)"$
      line: PATH="\1 {{ your_variable_here}}"
      backrefs: yes
    

    可能是你需要的。

    【讨论】:

    • 得到了同样的结果。因为“如果正则表达式匹配,最后匹配的行将被扩展行参数替换。”它取代了整行。
    • @Kevin 它替换了该行,但您可以使用反向引用将现有行的部分(或全部)保留在行中,因此可用于将部分添加到现有字符串中。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2017-08-30
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多