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, если оно уже существует в файле.
Что я делаю неправильно?
Ответы
Ответ 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'