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,并且添加单行会生成一个无效的文件,这是特别有用的。
在我的情况下,我使用以下命令将AuthorizedKeysCommand
和AuthorizedKeysCommandUser
添加到sshd_config中 :
- lineinfile: dest=/etc/ssh/sshd_config line='AuthorizedKeysCommand /etc/ssh/ldap-keys\nAuthorizedKeysCommandUser nobody' validate='/usr/sbin/sshd -T -f %s'
仅添加其中一个选项会生成validation失败的文件。