ansible:lineinfile几行?

同样的方式有“lineinfile”在文件中添加一行,有没有办法添加几行?

我不想使用模板,因为您必须提供整个文件。 我只想添加一些东西到现有的文件,而不必知道文件已经包含了什么,所以模板不是一个选项。

你可以使用循环来做到这一点。 这是一个使用with_items循环的例子:

 - name: Set some kernel parameters lineinfile:   dest: /etc/sysctl.conf   regexp: "{{ item.regexp }}"   line: "{{ item.line }}" with_items:   - { regexp: '^kernel.shmall', line: 'kernel.shmall = 2097152' }   - { regexp: '^kernel.shmmax', line: 'kernel.shmmax = 134217728' }   - { regexp: '^fs.file-max', line: 'fs.file-max = 65536' } 

你可以尝试使用blockinfile来代替。

你可以做类似的事情

 - blockinfile: | dest=/etc/network/interfaces backup=yes content="iface eth0 inet static address 192.168.0.1 netmask 255.255.255.0" 

以下是使用with_items的解决scheme的无噪声版本:

 - name add lines lineinfile: dest=fruits.txt line='{{item}}' with_items: - 'Orange' - 'Apple' - 'Banana' 

对于每个项目,如果项目在fruits.txt中存在,则不采取任何操作。

如果该项目不存在,它将被追加到文件的末尾。

十分简单。

这不是理想的,但你可以多次调用lineinfile 。 通过insert_after使用,你可以得到你想要的结果:

 - name: Set first line at EOF (1/3) lineinfile: dest=/path/to/file regexp="^string 1" line="string 1" - name: Set second line after first (2/3) lineinfile: dest=/path/to/file regexp="^string 2" line="string 2" insertafter="^string 1" - name: Set third line after second (3/3) lineinfile: dest=/path/to/file regexp="^string 3" line="string 3" insertafter="^string 2" 

如果你需要configuration一组独特的property = value行,我推荐一个更简洁的循环。 例如:

 - name: Configure kernel parameters lineinfile: dest: /etc/sysctl.conf regexp: "^{{ item.property }}=" line: "{{ item.property }}={{ item.value }}" with_items: - { property: 'kernel.shmall', value: '2097152' } - { property: 'kernel.shmmax', value: '134217728' } - { property: 'fs.file-max', value: '65536' } 

我可以通过在参数中使用\n来实现这一点。

如果文件可以被validation,并且添加单行会生成一个无效的文件,这是特别有用的。

在我的情况下,我使用以下命令将AuthorizedKeysCommandAuthorizedKeysCommandUser添加到sshd_config中

 - lineinfile: dest=/etc/ssh/sshd_config line='AuthorizedKeysCommand /etc/ssh/ldap-keys\nAuthorizedKeysCommandUser nobody' validate='/usr/sbin/sshd -T -f %s' 

仅添加其中一个选项会生成validation失败的文件。