我们的应用程序在/etc/services
中创建了许多定义。我们保留一个services
文件,方便所有这些定义,以便我们可以将它们管道化为/etc/services
,如下所示:
cp /etc/services /etc/services.stock
cat /path/to/build/services >> /etc/services
它有效,但它不是幂等的,即重复运行这些命令将导致服务文件再次附加信息。
当我通过我们的Ansible剧本时,我试图弄清楚如何做到这一点。我可以这样:
- command: "cat /path/to/build/services >> /etc/services"
但我不希望每次运行剧本时都要运行。
另一个选择是做这样的事情:
- name: add services
lineinfile:
state: present
insertafter: EOF
dest: /etc/services
line: "{{ item }}"
with_items:
- line 1
- line 2
- line 3
- line 4
- ...
但这确实很慢,因为它会单独执行每一行。
有更好的方法吗?模板没有帮助,因为它们完全覆盖了服务文件,这看起来有点粗鲁。
答案 0 :(得分:2)
blockinfile
是一个本机的幂等模块,用于确保文件中存在(缺少)指定的行集。
示例:
- name: add services
blockinfile:
state: present
insertafter: EOF
dest: /etc/services
marker: "<!-- add services ANSIBLE MANAGED BLOCK -->"
content: |
line 1
line 2
line 3