it-swarm.com.de

ansible: lineinfile für mehrere zeilen?

Auf die gleiche Weise gibt es ein Modul lineinfile, um eine Zeile in eine Datei einzufügen. Gibt es eine Möglichkeit, mehrere Zeilen einzufügen?

Ich möchte keine Vorlage verwenden, da Sie die gesamte Datei bereitstellen müssen. Ich möchte einfach etwas zu einer vorhandenen Datei hinzufügen, ohne unbedingt zu wissen, was die Datei bereits enthält, sodass eine Vorlage keine Option darstellt.

144
Michael

Sie können eine Schleife verwenden, um dies zu tun. Hier ist ein Beispiel mit einem with_items loop:

- 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' }
198
Ben Whaley

Sie können stattdessen versuchen, blockinfile zu verwenden.

Sie können so etwas tun

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

Wenn Sie eine Reihe eindeutiger property = value-Zeilen konfigurieren müssen, empfehle ich eine präzisere Schleife. Zum Beispiel:

- 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' }

Verwenden eines von Alix Axel vorgeschlagenen Diktats und Hinzufügen des automatischen Entfernens übereinstimmender auskommentierter Einträge,

- 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
15

Hier ist eine rauschfreie Version der Lösung, die mit_items verwendet werden soll:

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

Wenn der Artikel in fruits.txt vorhanden ist, wird für jeden Artikel keine Aktion ausgeführt.

Wenn das Element nicht vorhanden ist, wird es an das Ende der Datei angehängt.

Kinderleicht.

14
Rick O'Shea

Ich konnte das mit \n im Zeilenparameter.

Es ist besonders nützlich, wenn die Datei validiert werden kann und das Hinzufügen einer einzelnen Zeile eine ungültige Datei erzeugt.

In meinem Fall habe ich AuthorizedKeysCommand und AuthorizedKeysCommandUser mit dem folgenden Befehl zu sshd_config hinzugefügt:

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

Wenn Sie nur eine der Optionen hinzufügen, wird eine Datei generiert, deren Validierung fehlschlägt.

4
Penz

Es ist nicht ideal, aber Sie können lineinfile mehrfach aufrufen. Verwenden Sie das mit insert_after, Sie können das gewünschte Ergebnis erhalten:

- 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