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'
Добавление только одного из параметров создает файл, который не выполняет проверку.