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

问题描述:

我们的应用程序在/etc/services中创建了很多定义。我们保持一个services文件方便与所有这些定义,以便我们只要管他们进入/etc/services这样的:如何使用Ansible将大量文本附加到文件?

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

不是一个ansible用户,但你可以做这样的事情:1)当且仅当文件'的/ etc/services.stock'不存在,那么'CP/etc/services中的/ etc/services.stock'。 2)'cat /etc/services.stock/path/to/build/services>/etc/services'。 – msandiford

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