Estoy tratando de insertar una línea en un archivo de propiedades utilizando ansible.
Quiero añadir algunos bienes si no existen, pero no sustituir, si dicha propiedad ya existe en el archivo.

Puedo agregar a mi ansible papel

- name: add couchbase host to properties
  lineinfile: dest=/database.properties regexp="^couchbase.host"  line="couchbase.host=127.0.0.1"

Pero esto reemplaza el valor de la propiedad de vuelta a 127.0.0.1 si ya existe en el archivo.

Lo que estoy haciendo mal?

OriginalEl autor Pavel Bernshtam | 2015-03-16

5 Comentarios

  1. 22

    La lineinfile módulo hace lo que se supone que: garantiza la línea como se define en line está presente en el archivo y la línea se identifica por su regexp. Así que no importa lo que el valor de su configuración ya tiene, será reemplazado por el nuevo line.

    Si usted no desea reemplazar la línea de primera necesidad para probar el contenido y, a continuación, aplicar esa condición en el lineinfile módulo. No hay ningún módulo para probar el contenido de un archivo de modo que usted probablemente necesita para ejecutar grep con un shell comando y comprobar la .stdout para el contenido. Algo como esto (no probado):

    - name: Test for line
      shell: grep "^couchbase.host" /database.properties
      register: test_grep
    

    Y, a continuación, aplicar la condición a su lineinfile tarea:

    - name: add couchbase host to properties
      lineinfile:
        dest: /database.properties
        line: couchbase.host=127.0.0.1
      when: test_grep.stdout != ""
    

    La regexp, a continuación, puede ser eliminado ya que aseguró que la línea no existe, por lo que nunca podrían coincidir.

    Pero tal vez usted está haciendo las cosas de atrás a delante. ¿De dónde viene esa línea en el archivo? Cuando usted administrar su sistema con Ansible no debe haber otros mecanismos que interfieren con los mismos archivos de configuración. Tal vez usted puede evitar esto mediante la adición de un default valor a su papel?

    Necesito agregar una nueva propiedad a mi entorno de implementación. Esto incluye la producción y simulación de los servidores. Mi ansible se ejecuta en el cron y en el servidor de inicio (I crear la simulación de los servidores de una imagen en la demanda) El valor predeterminado para la propiedad es localhost, pero en algunos servidores me va a cambiar manualmente más tarde. Pensé que ansible es bueno para la manipulación de cambio
    Ansible podrán a disposición de sus nuevos servidores, y configurar así. Es sólo que en su playbook donde se utiliza lineinfile módulo, usted ha especificado ansible para tener siempre una línea couchbase.host=127.0.0.1 y escribir sobre el valor anterior. Que trata de cómo se hayan configurado.
    Trate de usar la cláusula when como @udondan mencionado
    creo que en ansible soy testigo de un problema con este enfoque. su multa si grep encuentra algo. pero si grep reurns nada, me sale «msg»: «la no-cero código de retorno», «rc»: 1, «start»: «2019-03-09 00:50:15.184315», «stderr»: «», «stderr_lines»: [], «stdout»: «», «stdout_lines»: []}
    Eso es porque grep devuelve un exitcode 1 en ningún partido. Ansible asume de salida distinto de cero códigos son errores de la secuencia de comandos/comando, y por lo tanto se anula. Yo lo que hice fue: shell: 'grep "my_pattern" some_file -c || true' para la verificación y, a continuación, when: test_grep.stdout == "0" para la condición.

    OriginalEl autor udondan

  2. 5

    Esta es la única manera en que yo era capaz de conseguir que esto funcione.

    - name: checking for host
      shell: cat /database.properties | grep couchbase.host | wc -l
      register: test_grep
    
    - debug: msg="{{test_grep.stdout}}"
    
    - name: adding license server
      lineinfile: dest=/database.properties line="couchbase.host=127.0.0.1"
      when: test_grep.stdout == "0"
    
    shell: grep -c couchbase.host /database.properties, menos binarios.

    OriginalEl autor kmjackson788

  3. 3

    Por un largo camino de «los Ensayos y errores» he venido a esta:

    - name: check existence of line in the target file
      command: grep -Fxq "ip addr add {{ item }}/32 dev lo label lo:{{ app | default('app') }}" /etc/rc.local
      changed_when: false
      failed_when: false
      register: ip_test
      with_items:
        - "{{ list_of_ips }}"
    
    - name: add autostart command
      lineinfile: dest=/etc/rc.local 
                  line="ip addr add {{ item.item }}/32 dev lo label lo:{{ app | default('app') }}"
                  insertbefore="exit 0"
                  state=present
      when: item.rc == 1
      with_items:
        - "{{ ip_test.results }}"
    

    OriginalEl autor user2658174

  4. 1

    Misma idea que aquí se presenta : https://stackoverflow.com/a/40890850/7231194

    Pasos son:

    • Intente reemplazar la línea.
    • Si reemplazar mod cambiar, restaurar
    • Si reemplazar mod no cambia, agregue la línea

    Ejemplo

    # Vars
    - name: Set parameters
      set_fact:
        ipAddress    : "127.0.0.1"
        lineSearched : "couchbase.host={{ ipAddress }}"
        lineModified : "couchbase.host={{ ipAddress }} hello"
    
    # Tasks
    - name: Try to replace the line
      replace:
        dest    : /dir/file
        replace : '{{ lineModified }} '
        regexp  : '{{ lineSearched }}$'
        backup  : yes
     register  : checkIfLineIsHere
    
    # If the line not is here, I add it
    - name: Add line
      lineinfile:
      state   : present
      dest    : /dir/file
      line    : '{{ lineSearched }}'
      regexp  : ''
      insertafter: EOF
    when: checkIfLineIsHere.changed == false
    
    # If the line is here, I still want this line in the file, Then restore it
    - name: Restore the searched line.
      lineinfile:
        state   : present
        dest    : /dir/file
        line    : '{{ lineSearched }}'
        regexp  : '{{ lineModified }}$'
      when: checkIfLineIsHere.changed
    

    OriginalEl autor Je.Go

  5. 0

    Ok, aquí está la mía ingenuo solución… probablemente no es una cruz-plataforma y de los nativos Ansible (acabo de empezar a utilizar esta herramienta y aprender), pero definitivamente más corto:

    - name: Update /path/to/some/file
      shell: grep -q 'regex' /path/to/some/file && echo exists || echo 'text-to-append' >> /path/to/some/file
      register: result
      changed_when: result.stdout.find('exists') == -1
    

    OriginalEl autor zaufi

Dejar respuesta

Please enter your comment!
Please enter your name here