Подтвердить что ты не робот

Ansible: Вставить строку, если она не существует

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

Я добавляю к моей важной роли

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

Но это заменяет значение свойства обратно на 127.0.0.1, если оно уже существует в файле.

Что я делаю неправильно?

4b9b3361

Ответ 1

Модуль lineinfile делает то, что должен: он гарантирует, что строка, как определено в line, присутствует в файле, и строка идентифицируется вашим regexp. Поэтому независимо от того, какое значение уже имеет ваша настройка, она будет переопределена вашей новой line.

Если вы не хотите переопределять строку, вам сначала нужно протестировать содержимое, а затем применить это условие к модулю lineinfile. Не существует модуля для проверки содержимого файла, поэтому вам, вероятно, нужно запустить grep с помощью команды shell и проверить содержимое .stdout. Примерно так (не проверено):

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

И затем примените условие к вашей задаче lineinfile:

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

Затем regexp можно удалить, поскольку вы уже убедились, что строка не существует, поэтому она никогда не будет совпадать.

Но, может быть, вы делаете вещи обратно на фронт. Откуда эта строка в файле? Когда вы управляете своей системой с помощью Ansible, не должно быть никаких других механизмов, которые мешали бы тем же файлам конфигурации. Может быть, вы можете обойти это, добавив значение по default для вашей роли?

Ответ 2

Это единственный способ, которым я смог заставить это работать.

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

Ответ 3

В долгий путь "Испытания и ошибки" я прихожу к этому:

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

Ответ 4

Те же идеи, которые представлены здесь: fooobar.com/questions/240000/...

Шаги:

  • Попробуйте заменить строку.
  • Если заменить модификацию мода, восстановите
  • Если замена мода не изменяется, добавьте строку

Пример

# 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

Ответ 5

Хорошо, вот мое наивное решение... наверное, не кросс-платформенный и родной Ansible (я только начал использовать этот инструмент и все еще его изучать), но определенно короче:

- 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

Ответ 6

- name: add couchbase.host to properties, works like add or replace
  lineinfile: 
    state: present
    dest: /database.properties 
    regexp: '^couchbase.host'
    line: 'couchbase.host=127.0.0.1'