ansible - 如何插入一个新行,然后在 Ansible 中附加到它?
问题描述
我有一个角色被多个其他角色作为依赖项导入,这导致它们都需要附加到同一行或如果该行尚不存在则创建该行(即第一个角色创建该行,所有后续角色追加给它)。
具体来说,这条线最终看起来像
post-hook = systemctl restart <service1> <service2> ... <serviceN>
其中 <service1> ... <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'
我可以使用正则表达式、反向引用和负前瞻追加到已经存在的行,但这最初不会创建行,因为如果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。在这种情况下,您可以将您的行slurp
或cat
所有行放入一个 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'
这不是很好,但可能比正则表达式更容易阅读,backref 示例
推荐阅读
- python - 将值写入新字段,Python GDAL OGR,不确定如何提交更改,为什么我的字段仍然为空?
- php - 如何在 php 数组中检索工作日的日期?
- python - 使用 Keras 的模型类将 Tensorflow 1.x 代码迁移到 Tensorflow 2.x
- java - 获取二维数组中正方形的平均值
- graphql - 从 Prisma2 的辅助表中获取数据
- javascript - 谷歌折线图日期格式
- javascript - 如何记录仅在 .call() 中使用的函数
- jquery - 将两个带有输入字段的数组合并在一起
- android - 在webview android中缓存一组网页
- sql-server - 使一列的数据类型成为另一列的类型?