ansible:几行的lineinfile?

问题描述 投票:136回答:6

同样有一个模块lineinfile在文件中添加一行,有没有办法添加几行?

我不想使用模板,因为您必须提供整个文件。我只是想在现有文件中添加一些东西而不必知道文件已包含的内容,因此模板不是一个选项。

ansible
6个回答
193
投票

你可以使用loop来做到这一点。这是使用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' }

156
投票

您可以尝试使用blockinfile

你可以做点什么

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

14
投票

这是一个使用with_items的解决方案的无噪声版本:

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

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

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

十分简单。


14
投票

如果需要配置一组唯一的property = value行,我建议使用更简洁的循环。例如:

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

使用Alix Axel建议的dict并添加自动删除匹配的注释输入条目,

- name: Configure IPV4 Forwarding
  lineinfile:
    path: /etc/sysctl.conf
    regexp: "^#? *{{ item.key | regex_escape() }}="
    line: "{{ item.key }}={{ item.value }}"
  with_dict:
    'net.ipv4.ip_forward': 1

4
投票

这不是理想的,但你可以多次拨打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"

4
投票

我能够通过在line参数中使用\n来做到这一点。

如果可以验证文件,则特别有用,添加单行会生成无效文件。

在我的例子中,我使用以下命令将AuthorizedKeysCommandAuthorizedKeysCommandUser添加到sshd_config:

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

仅添加其中一个选项会生成无法验证的文件。

© www.soinside.com 2019 - 2024. All rights reserved.