#ansible #yaml #jitsi
Вопрос:
У меня есть код
- name: Ansible replace string example
replace:
path: /etc/jitsi/videobridge/sip-communicator.properties contains
regexp: 'shard'
replace: "shard-1"
Но это не работает 🙁
У меня инсульт:
org.jitsi.videobridge.xmpp.user.shard.HOSTNAME=localhost
org.jitsi.videobridge.xmpp.user.shard.DOMAIN=auth.jc.name.com
org.jitsi.videobridge.xmpp.user.shard.USERNAME=name
org.jitsi.videobridge.xmpp.user.shard.PASSWORD=Hfr*7462
org.jitsi.videobridge.xmpp.user.shard.MUC_JIDS=JvbBredjoy@internal.auth.jc.name.com
org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME=7896aee5-fgre-4b02-4569-0bcc75ed1d0d
в файле /etc/jitsi/videobridge/sip-communicator.properties
Я должен добавить после слова shard
символ «-» и число (1, 2, 3) и т.д. Например org.jitsi.videobridge.xmpp.user.shard-1.HOSTNAME=localhost
Перед этим я должен проверить — если строка org.jitsi.videobridge.xmpp.user.shard-1.HOSTNAME=localhost
содержит слово shard-1
, то мы переименовываем в shard-2
и т. Д.
Комментарии:
1. у вас есть осколок по всем линиям?
2. Вы намеревались включить «содержит» в конце вашего
path:
?3. У меня есть другие строки в том же файле, но в них нет слова «осколок».
Ответ №1:
чтобы ответить на вашу проблему, я бы использовал плагин пользовательского фильтра для создания нового значения, которое заменяет старые значения:
вы создаете папку filter_plugins в своей папке playbook (я назвал файл myfilters.py и значение построения фильтра)
фильтр: чтобы избежать утечки памяти, используйте » с » для открытия файла (благодаря @mdaniel)
#!/usr/bin/python
import re
class FilterModule(object):
def filters(self):
return {
'buildvalue': self.buildvalue
}
def buildvalue(self, nfile, srch):
found = False
with open(nfile, 'r') as f:
lines = f.readlines()
for line in lines:
x = re.search(srch '-*[0-9]*', line)
if x != None:
found = True
break
if found:
rep = srch ('-1' if '-' not in x.group() else '-' str((int(x.group().split('-')[1]) 1)))
else:
rep = srch
return rep
сборник пьес:
tasks:
- name: replace
ansible.builtin.replace:
path: "{{ filename }}"
regexp: "{{ search }}-*[0-9]*"
replace: "{{ newvalue }}"
vars:
filename: 'files/fileregex.txt'
search: 'shard'
newvalue: "{{ filename | buildvalue(search) }}"
Комментарии:
1. Круто! Не могли бы вы, пожалуйста, сказать мне, как это будет работать, когда у меня будут строки по умолчанию, например org.jitsi.videobridge.xmpp.user.shard. ИМЯ ПОЛЬЗОВАТЕЛЯ=имя (без каких-либо цифр)
2. Без числа новое значение будет равно shard-1
3. Спасибо. Еще один вопрос. Например, у меня есть 2 сервера (или более), и мне нужно, чтобы на одном из них была строка
org.jitsi.videobridge.xmpp.user.shard.HOSTNAME=localhost org.jitsi.videobridge.xmpp.user.shard.DOMAIN=auth.jc.name.com etc on other server:
org.jitsi.videobridge.xmpp.user.shard-1.ИМЯ хоста=локальный хост org.jitsi.videobridge.xmpp.user.shard-1.DOMAIN=auth.jc.name.com и т.д. Могу ли я сделать это с помощью вашего кода? И я должен делать это только с python, могу ли я сделать это только с помощью кода Ansible?4. если я правильно понял ваш вопрос, на первом сервере осколок становится осколком-1, на втором сервере осколок-1 становится осколком-2 .. это работа, выполняемая моим пользовательским фильтром. Делать это только с Ансиблем, что вы имеете в виду? ansible содержит множество фильтров, написанных на python, вы делаете это с фильтрами, уже включенными в ansible, может быть, я не пробовал, потому что это кажется сложнее, чем простой пользовательский фильтр..