Ansible: lineinfile для нескольких строк?

Точно так же есть "lineinfile", чтобы добавить одну строку в файл, есть ли способ добавить несколько строк?

Я не хочу использовать шаблон, потому что вы должны предоставить весь файл. Я просто хочу добавить что-то в существующий файл, не зная, что уже содержит файл, поэтому шаблон не является вариантом.

Ответ 1

Вы можете использовать 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' }

Ответ 2

Вместо этого вы можете использовать blockinfile.

Вы можете сделать что-то вроде

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

Ответ 3

Вот бесшумная версия решения, которое должно использовать with_items:

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

Для каждого элемента, если элемент существует в файле fruit.txt, никаких действий не предпринимается.

Если элемент не существует, он будет добавлен в конец файла.

Easy-Peasy.

Ответ 4

Если вам нужно настроить набор уникальных строк value = 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' }

Ответ 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"

Ответ 6

Я смог сделать это, используя \n в параметре строки.

Это особенно полезно, если файл может быть проверен, а добавление одной строки создает недопустимый файл.

В моем случае я добавлял 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'

Добавление только одного из параметров создает файл, который не выполняет проверку.