如何插入新行,然后在Ansible中将其追加?

如何插入新行,然后在Ansible中将其追加?,ansible,Ansible,我有一个由多个其他角色作为依赖项导入的角色,导致它们都需要附加到同一行,或者如果该行尚不存在,则创建该行(即,第一个角色创建该行,所有后续角色附加到该行) 具体来说,这条线最终看起来像 post-hook = systemctl restart <service1> <service2> ... <serviceN> 我可以使用附加到已经存在的行,但这不会在最初创建行,因为使用backrefs时 例如 如果我硬编码要重新启动的服务列表,显然有几种方法可以做到

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

具体来说,这条线最终看起来像

post-hook = systemctl restart <service1> <service2> ... <serviceN>
我可以使用附加到已经存在的行,但这不会在最初创建行,因为使用
backrefs

例如


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

我会做一些不同的事情。每个角色只在新文件中放入一行,如:

- name: 'Add service'
  become: true
  lineinfile:
    path: '/etc/letsencrypt/.restart.list'
    regex: "^{{ service }}"
    line: "{{ service }}"
    create: true
当然,还有多行

我想,你有一个不同的角色或任务,在那里,letsencrypt毕竟是被调用的。在这种情况下,您的
slurp
cat
可以将所有行放入一个var,并使用该列表创建一个
lineinfle
任务,如

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

这不好,但可能比正则表达式、backref示例更容易阅读

我会使用
grep
命令查看行是否在那里。同意,这不漂亮,但它可以工作
- name: 'Add service'
  become: true
  lineinfile:
    path: '/etc/letsencrypt/.restart.list'
    regex: "^{{ service }}"
    line: "{{ service }}"
    create: true
- 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'