我如何插入一个新的行,然后在Ansible追加到它?



我有一个角色,它是由多个其他角色作为依赖导入的,导致它们都需要添加到同一行,或者如果该行还不存在,则创建该行(即第一个角色创建该行,所有后续角色都添加到该行)。

具体来说,这一行最终看起来像

post-hook = systemctl restart <service1> <service2> ... <serviceN>

& lt; service1>…& lt; serviceN>是要重新启动的服务的名称。

过程类似于

  • 初始行不存在
  • 当第一个角色被处理时,它看起来像post-hook = systemctl restart apache2
  • 当第二个角色被处理时,它看起来像post-hook = systemctl restart apache2 postfix
  • 为每个额外的角色重复此操作。

我知道我最初可以使用lineinfile模块添加行,但是每次处理另一个角色时,该行都会被替换,只留下列表中最新的服务。

- name: 'Update service when new certificate installed'
  become: true
  lineinfile:
    path: '/etc/letsencrypt/cli.ini'
    regex: 'post-hook = systemctl restart*'
    line: 'post-hook = systemctl restart {{ service }}'
    state: 'present'

我可以添加到已经存在的行使用正则表达式,反向refs和负查找,但这不会最初创建行,因为当backrefs被使用时,如果正则表达式不匹配,文件将保持不变。

- name: 'Update service when new certificate installed'
  become: true
  lineinfile:
    path: '/etc/letsencrypt/cli.ini'
    backrefs: true
    regex: '^(post-hook = systemctl restart(?!.*b{{ service }}b).*)$'
    line: '1 {{ service }}'
    state: 'present'

如果我硬编码我想重新启动的服务列表,显然有几种方法可以做到这一点,但我真的希望找到一种方法,允许我添加新的角色,而不必编辑依赖的角色。

我会做得有点不同。每个角色只在新文件中添加一行,例如:

- name: 'Add service'
  become: true
  lineinfile:
    path: '/etc/letsencrypt/.restart.list'
    regex: "^{{ service }}"
    line: "{{ service }}"
    create: true

当然,还有多行

我假设,您有一个不同的角色或任务,其中letsencrypt毕竟被调用。在这种情况下,可以将slurpcat所有行放入var中,并使用该列表创建单个lineinfile任务,如

- name: "Read restat list"
  command: "cat /etc/letsencrypt/.restart.list"
  changed_when: false
  register: restartList
- name: 'Update service when new certificate installed'
  become: true
  lineinfile:
    path: '/etc/letsencrypt/cli.ini'
    backrefs: true
    regex: '^post-hook = systemctl restart'
    line: 'post-hook = systemctl restart {{ restartList.stdout_lines | join(" ") }}'
    state: 'present'

它不是很好,但可能比regex更容易阅读,backref example

相关内容

最新更新