Как добавить слово или ловкость в сток с помощью Ansible

#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, может быть, я не пробовал, потому что это кажется сложнее, чем простой пользовательский фильтр..