ansible:几行的lineinfile?

Mic*_*ael 153 ansible

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

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

Ben*_*ley 212

您可以使用循环来执行此操作.这是一个使用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' }
Run Code Online (Sandbox Code Playgroud)

  • 这可能是在Ansible 2.0之前投票的.现在有一个更好的答案:/sf/answers/1981460351/ (5认同)
  • @kkurian如果您需要在json文件中添加一些行并且不需要任何标记,则blockinfile解决方案将不起作用.虽然您可以将标记设置为"",但是ansible blockinfile仍将查找标记,而不是查找任何标记,并再次插入块.因此,没有标记的blockinfile不是幂等的,带有循环的lineinfile是. (4认同)
  • @kkurian 当然只有当你插入时,而不是当你替换时? (2认同)

Soi*_*shi 166

您可以尝试使用blockinfile.

你可以做点什么

- blockinfile: |
    dest=/etc/network/interfaces backup=yes
    content="iface eth0 inet static
        address 192.168.0.1
        netmask 255.255.255.0"
Run Code Online (Sandbox Code Playgroud)

  • Blockinfile需要标记.这有时是没有选择的. (10认同)
  • 得票最高的答案可能在Ansible 2.0之前,但现在这是更正确的答案. (9认同)
  • 每次我选择使用它时,`blockinfile`模块都能很好地解决.我特别喜欢`insertafter` /`insertbefore`选项的直观行为. (8认同)
  • 很好的链接,但例子很糟糕 (3认同)

Ric*_*hea 16

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

- name: add lines
  lineinfile: 
    dest: fruits.txt
    line: '{{ item }}'
  with_items:
    - 'Orange'
    - 'Apple'
    - 'Banana' 
Run Code Online (Sandbox Code Playgroud)

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

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

十分简单.


Nic*_*kin 16

如果需要配置一组唯一的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' }
Run Code Online (Sandbox Code Playgroud)

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

- 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
Run Code Online (Sandbox Code Playgroud)

  • 如果使用with_dict,它将更加简洁。 (2认同)

Ram*_*nte 5

这并不理想,但是允许您多次调用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"
Run Code Online (Sandbox Code Playgroud)

  • 是的,但一次仍是一行。如果我有15行,我宁愿只用一条命令添加它们。似乎不可能。 (5认同)

Pen*_*enz 5

通过使用\nline参数,我能够做到这一点。

如果可以验证文件,并且添加一行会生成一个无效文件,这将特别有用。

就我而言,我是使用以下命令将AuthorizedKeysCommand和添加AuthorizedKeysCommandUsersshd_config

- lineinfile: dest=/etc/ssh/sshd_config line='AuthorizedKeysCommand /etc/ssh/ldap-keys\nAuthorizedKeysCommandUser nobody' validate='/usr/sbin/sshd -T -f %s'
Run Code Online (Sandbox Code Playgroud)

仅添加一个选项会生成一个验证失败的文件。

  • 每次运行剧本时,这都会额外创建一条线-无法正确识别该线已经存在。至少在Ansible 1.7.1上我就是这种情况 (12认同)