with multiple create content blockinfile ansible ansible-playbook

multiple - ansible: lineinfile para varias líneas?



ansible copy (6)

De la misma manera que hay "lineinfile" para agregar una línea en un archivo, ¿hay alguna manera de agregar varias líneas?

No quiero usar una plantilla porque debes proporcionar todo el archivo. Solo quiero agregar algo a un archivo existente sin saber necesariamente qué contiene el archivo, por lo que una plantilla no es una opción.


Aquí hay una versión libre de ruido de la solución que se va a usar con los elementos:

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

Para cada elemento, si el artículo existe en fruits.txt no se realiza ninguna acción.

Si el elemento no existe, se agregará al final del archivo.

Pan comido.


No es ideal, pero puedes hacer múltiples llamadas a lineinfile . Usando eso con insert_after , puede obtener el resultado que desea:

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


Pude hacer eso al usar /n en el parámetro de línea.

Es especialmente útil si el archivo se puede validar, y agregar una sola línea genera un archivo no válido.

En mi caso, estaba agregando AuthorizedKeysCommand y AuthorizedKeysCommandUser a sshd_config , con el siguiente comando:

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

Agregar solo una de las opciones genera un archivo que falla la validación.


Puedes intentar usar blockinfile en blockinfile lugar.

Puedes hacer algo como

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


Puedes usar un loop para hacerlo. Aquí hay un ejemplo con un bucle 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'' }


Si necesita configurar un conjunto de propiedades únicas = líneas de valor, recomiendo un ciclo más conciso. Por ejemplo:

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