Ansible regexp

Fórumok

Sziasztok!

Regexp szakik, segítsetek!

Konfigurációban szeretném cserélni, ha a változómnak nem az az értéke, amit én szeretnék.

logsize = 800M

Ha kikommenteléssel kezdődik, az meg van; a végével vagyok gondban. A (800M)$ oké, de hogy negálom a keresett sztringet?

Vagyis amit szeretnék, mindensor, ami kezdődik log_size (space vagy tab) = (space vagy tab) és a vége nem 800M

Tudom template egyszerűbb lenne, de pár értéket csak bizonyos esetben szeretnék módisítani, a már konfigurált szolgáltatáson.

 

Köszi!

K

Hozzászólások

Szerkesztve: 2022. 05. 08., v – 14:51

Én ezt úgy szoktam, hogy minden ami logsizével kezdődik, azt cserélje, pl.:

s/^logsize =.*/logsize = 800M/

Ki nem próbáltam, de valami ilyesmi. Aztán lehet cicomázni whitespace-ekkel, van/nincs, ha kell. Ha nagyon katyvasz a környezet, akkor kell, egyébként meg ajánlott.

Szóval akkor:
 

  - name: replace text
    become: yes
    ansible.builtin.replace:
      path: /tmp/example.cfg
      regexp: '^[ ]{0,}logsize[ ]{0,}=[ ]{0,}.*$'
      replace: 'logsize = 800M'

Előtte:

##
##
# logsize = 45433
logsize = 45433
 logsize = 45433
log size = 45664
 logsize=7777

Utána:

##
##
# logsize = 45433
logsize = 800M
logsize = 800M
log size = 45664
logsize = 800M

Lehet még ügyeskedni a regex szigorúbbá tételére, mondjuk hogy muszáj számoknak lennie benne, meg a szóköz bővíthető tabbal is, ízlés szerint. Meg gondolom van még legalább 10 másféle megoldás.

 

Update: és ha nem nézem be, ez csak akkor tol replace-t, ha nem 800M:
 

      regexp: '^([ ]{0,}logsize[ ]{0,}=[ ]{0,})(?![ ]{0,}800M).*$'
      replace: 'logsize = 800M'

Ennek mondjuk akkor látom a legtöbb értelmét, hogy ha csak akkor indítja újra a valamit, ha változás volt a konfigban :)

Ha nagyon biztos vagy abban hogy pontosan egy sor illeszkedik akkor oké lehet, ellenkező esetben azért ez játék a tűzzel

^logsize[ \t]=[ \t](?!800M).+$

(De nem értem, miért kell ennyire elbonyolítani, ennyi erővel kikeresed a logsize kezdetű sorokat, és kicseréled "logsize = 800M"-re, mert ha az volt benne előtte, és ugyanarra cseréled, mi lesz?)

    - name: set logsize
      lineinfile:
        path: /path/to/file.conf
        regexp: '^logsize\s+=\s+[0-9].*$'
        line: 'logsize = 800M'

így csinálnám, nem törődve a tabokkal.

Az eddigi válaszoknál szerintem jobb lesz ezt használni:

https://docs.ansible.com/ansible/latest/collections/community/general/i…

Felteszem valami ini/cfg jellegű fájlban van a bejegyzés. Pl.:

- name: Ensure that the necessary PHP options are set
  ini_file:
    dest: /etc/php.ini
    section: "{{ item.section }}"
    option: "{{ item.key }}"
    value: "{{ item.value }}"
    backup: yes
  with_items:
    - { section: 'PHP', key: 'cgi.fix_pathinfo', value: '0' }
    - { section: 'PHP', key: 'memory_limit', value: '2G' }
    - { section: 'PHP', key: 'max_execution_time', value: '1800' }
    - { section: 'PHP', key: 'zlib.output_compression', value: 'On' }
    - { section: 'Session', key: 'session.save_path', value: '"/var/lib/php/session"' }

(Amúgy miért nincs yaml a kódbeillesztéskor syntax highlight-ra?)

szeretném cserélni, ha a változómnak nem az az értéke, amit én szeretnék

Ansible esetén "ha a változómnak nem az az értéke, amit én szeretnék" egy fölösleges gondolat. A deklaratív moduljai úgy vannak megírva, hogy te leírod, hogy mi legyen az eredmény, a modul meg felismeri, hogy kell-e változtatni ehhez. Ha nem, akkor nem változtat. Ezért szeretjük ezeket a deklaratív modulokat. Persze ha imperatív megoldást választasz (pl. egy shell parancsot írsz rá), akkor ezt neked kell leprogramoznod. Ami általában szopacs. Ezért ezt el szokás kerülni.