如何使用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
- ...
但这是很慢的,因为它每个单独的线。
有没有更好的方法?模板没有帮助,因为他们完全覆盖了服务文件,这看起来有点粗鲁。
答
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
不是一个ansible用户,但你可以做这样的事情:1)当且仅当文件'的/ etc/services.stock'不存在,那么'CP/etc/services中的/ etc/services.stock'。 2)'cat /etc/services.stock/path/to/build/services>/etc/services'。 – msandiford