如何使用Ansible将大量文本附加到文件中?

时间:2016-09-16 00:49:48

标签: linux ansible devops

我们的应用程序在/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
   - ...

但这确实很慢,因为它会单独执行每一行。

有更好的方法吗?模板没有帮助,因为它们完全覆盖了服务文件,这看起来有点粗鲁。

1 个答案:

答案 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