Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam

Ahoj,

mam tu prvni pripad, kdy se na jednom serveru potkaji dve sluzby stejneho typu v apache2. Takze konfigurace je asi takto:
Kód: [Vybrat]
#/env/prod/group_vars/project1:
project_uid: "1"

#/env/prod/group_vars/project2:
project_uid: "2"

#/env/prod/hosts
[project1]
fqdn

[project2]
fqdn

Na "fqdn" jsou tedy vhosty projekt1 a projekt2. Kdyz zavolam:
Kód: [Vybrat]
ansible-playbook -i /env/prod/ -l project1 apache2.ymlplaybook se provede spravne. Kdyz ale zavolam
Kód: [Vybrat]
ansible-playbook -i /env/prod/ -l project2 apache2.ymlpromenne jsou stale z group_vars/project1.

Kde je chyba a jak to zmenit, aby to fungovalo samostatne i "sdilene"?

Diky.


Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #1 kdy: 05. 08. 2019, 20:59:05 »
vidim 2 veci:

1.) apache2.yml ma nadefinovany "hosts: group1"
2.) ujisti se, ze si nekde ty promenny spatne neprepisujes, "-i /env/prod" ti bere default "-i /env/prod/hosts" mozna tam mas jinej soubor jeste

nicmene snad tady najdes odpoved: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #2 kdy: 06. 08. 2019, 10:15:45 »
Dival jsem se na to.

ad 1] je to role, je v ni nadefinovano:

Kód: [Vybrat]
project1.yml
- hosts: project1

project2.yml
- hosts: project2

Takze tady to nebude.

ad 2] Kdyz jsem zakomentoval project1 sekci v /env/prod/hosts, tak to chytlo parametry pro project2. Ty parametry jsou identicke...

Zatim me napada jedine reseni a to, proste presunout ty parametry z group_vars do samostatneho var souboru a ten includovat v tom playbooku...

Ale pockam, zda nekoho napadne, v cem mam chybu.

ETNyx

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #3 kdy: 06. 08. 2019, 12:59:55 »
Nebyl by odkaz někam na git kde by se na to dalo kouknout jako na celek?

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #4 kdy: 06. 08. 2019, 19:25:24 »
Role neni playbook. Playbook neni inventory.

apache2.yml je playbook a ne role (jasne zalezi co mas vevnitr), ale playbook mit musis v nem definujes na kterou grupu se pusti a z toho to bere promeny.

Jak jsem ti psal si myslim, ze mas nekde nadefinovano v playbooku:

hosts: group1

Neco jako tady: https://github.com/ansible/test-playbooks/blob/master/sleep.yml

kde je hosts: all

snad uz ti to dava smysl. Zmen si v apache2.yml

hosts na group2 a pujde ti to

chces dve sluzby?

v playbooku apache2.yml nadefinuj dve grupy

hosts: grup1
roles: apache2

hosts: grup2
roles: apache2

pak kdyz pustis

ansible-playbook -i myhosts -l grup1 apache2.yml
ansible-playbook -i myhosts -l grup2 apache2.yml

tak to udela to co chces. Prijde mi ze michas jablka s hruskama. Protoze to co ve skutecnosti chces jsou grupy pod playbookem, precti si tu inheritance/var precedense jeste jednou.


Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #5 kdy: 12. 08. 2019, 17:04:23 »
ETNyx a tripplezero, poslal jsem vam zpravu, kde najdete zdrojaky...

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #6 kdy: 12. 08. 2019, 19:37:41 »
Ahoj Czechsys,

poslal jsem ti zpravu zpatky.

pro ostatni

-l project1 je ten problem

       -l 'SUBSET', --limit 'SUBSET'
          further limit selected hosts to an additional pattern

neboli v hosts:

[project1]
prod-anicka
dev-marenka

--limit prod-*

ale rozhodne ne

--limit project1 jelikoz ten mate definovanej v playbooku project1.yml

hosts: project1
...
..

Ze mi to nedoslo driv ^_^

ETNyx

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #7 kdy: 13. 08. 2019, 12:06:04 »
Pomohlo to nebo na to mám taky hodit ještě očko?

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #8 kdy: 13. 08. 2019, 12:27:00 »
Pomohlo to nebo na to mám taky hodit ještě očko?

Mam od tripplezero slibeno, ze mi jeste neco ukaze. Kazdopdane, nemyslim si, ze je tohle zrovna spatne nebot bezne pouzivam playbook takto:

project1.yml:
Kód: [Vybrat]
- hosts: project1-db
  ...
  roles:
  ...

- hosts: project1-web
  ...
  roles:
  ...

Tak kdybys na to hodil oko, budu rad, zatim jsem se z toho nedostal. Variantu s includovanim vars_file pro dany projekt jiz mam odzkousene, ale udela to pak trochu slozitejsi strukturu, kdyz vars budou jednou v inventory, jednou nekde jinde...

ETNyx

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #9 kdy: 13. 08. 2019, 17:49:12 »
Trošku jsem se v tom pošťoural a jestli jsem to pochopil správně, tak moje odpověď bude podobná jako od kolegy tripplezero.

Kauzule limit nefunguje tak jak předpokládáte, pouze vytváří průnik existujících cílů (tj. strojů kde pustit tu magii)

Na daném příkladu
Kód: [Vybrat]
ansible-playbook -i /env/prod/ -l project1 apache2.yml
ansible-playbook -i /env/prod/ -l project2 apache2.yml

Kód: [Vybrat]
-l project1
-l project2
vlastně říká všechno co je ve skupine projektX takže v obouch případech fqdn

takže stejnej výsledek dostanete pokud (při těchto jednoduchých skupinách) použijete
Kód: [Vybrat]
-l fqdn
pokud by například v project1 bylo fdqn2 eqivalent by byl
Kód: [Vybrat]
-l fdqn,fdqn2
Z toho by mělo být patrné že --limit neovlivňuje/nepracuje se skupinou a tedy tímto způsobem ji nemůžete definovat. (respektivě skupina pro --limit funguje jako zástupný znak za x-y strojů abych jich po čárce nemusel vypisovat 10-ky nebo 100-ky)


Moje řešení tohoto problému by bylo předělat project1 a 2 na role. Případně za současné konstelace proměné z "group_vars" presunout do "play var" (tj do /apache2.yml respektivě z toho co bylo v PM do v rootu /projekt1.yml)

Odobně mi přijde řešení v rolích lepší neb proměné v "play vars" uz težko budete přepisovat. Snad jsem to pochopil dobře a trošku rozumě předal dal :-)
« Poslední změna: 13. 08. 2019, 17:52:46 od ETNyx »

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #10 kdy: 14. 08. 2019, 09:46:52 »
Stale to kazdy vidime jinak (resp. nevidim to jak vy).

project1.yml:
Kód: [Vybrat]
---
- hosts: project1-db
  become: yes
  become_method: sudo
  roles:
   - { role: "common", tags: "common" }
   - { role: "postgresql", tags: "postgresql" }
   - { role: "pgbouncer", tags: "pgbouncer" }

- hosts: project1-web
  become: yes
  become_method: sudo
  roles:
   - { role: "common", tags: "common" }
   - { role: "tmpfiles", tags: "tmpfiles" }
   - { role: "nfs-client", tags: "nfs-client" }
   - { role: "createuser", tags: "createuser" }
   - { role: "nginx", tags: "nginx" }
   - { role: "nginx-vhost", tags: "nginx-vhost" }
   - { role: "php", tags: "php" }
   - { role: "redis", tags: "redis" }
   - { role: "postgresql-client", tags: "postgresql-client" }

env/prod/group_vars/project1:
Citace
project_uid="1"

/env/prod/hosts:
Kód: [Vybrat]
[project1:children]
project1-db
project1-web

[project1-db]
fqdn1

[project1-web]
fqdn2

Tohle spusti playbook s rolema pro cely projekt (takze -db a -web):
Kód: [Vybrat]
ansible-playbook -i /env/prod/ project1.yml
Tohle spusti playbook s rolema, ale limituju to na web servery (takze jen -web)
Kód: [Vybrat]
ansible-playbook -i /env/prod/ -l project1-web project1.ymlTakze vytvarim ten prunik stroju, kde spustit. V tom to funguje jak pisete oba.

Pokud teda pustim:
Kód: [Vybrat]
ansible-playbook -i /env/prod/ -l project1-web project1.ymlNacte to parametry z group_vars/project1 - proc? Protoze se to dostane az na uroven [project1:children] a z toho vezme ten group_vars/project1? Proc to pak nefunguje pro project2, kdyz by se to pak melo dostat na [project2:children] a z toho vzit group_vars/project2?

ETNyx

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #11 kdy: 14. 08. 2019, 13:39:46 »
Popravdě jak vesměs cpu všechno přes role tak se mi nikdy nepodařilo do toho takhle zamotat ve skupinách :-D takže je to pro mě taky škola.

V podstatě jste si odpověděl, pokud je fdqn součástí dvou skupin tak samozřejmě pro fdqn musí existovat jen jeden project_uid takže na úrovni skupin ansible koukne do první skupiny a přepíše proměnou, koukne do druhý skupiny a přepíše proměnou. Poslední kam koukne vyhrává.

viz: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

Ještě když kouknu co říká dokumentace o hosts v playbooku (https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#basics a následně proklik na https://docs.ansible.com/ansible/latest/user_guide/intro_patterns.html).
Pokud si to vykládám správně tak hosts je vlastně obdobou kauzule --limit takže pokud play má hosts:projekt1 tak najde fdqn a o fdqn ví že je ve dvouch skupinách a jsme zase na začátku.

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #12 kdy: 15. 08. 2019, 12:11:55 »
Je to mozne. Nakonec jsem to prozatim vyresil tak, ze group_vars jsem presunul do samostatneho var adresare a projektove parametry si pripojim pres vars_file.

Zajimal by me ten Vas role pristup. To delate tak, ze mate definovany server jako playbook a v nem si definujete role? Nebo jak?

ETNyx

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #13 kdy: 16. 08. 2019, 11:30:26 »
Dělám to takto, v hosts souboru přiřazuji stroje do skupin a ty definují jaký aplikace na stroji mají běžet
Kód: [Vybrat]
#production/hosts
[xibo]
fdqn
playbook pak obsahuje jednotlivé play, které spouštějí role, zatím používám jeden playbook trošku se bojím, že bych několika playbooky snížil přehlednost a navíc mohl vytvořil stavy, kdy by jeden přepisoval co udělal druhej.
Kód: [Vybrat]
#site.yml
- hosts: xibo
  roles:
    - xibo

- hosts: wordpress
  pre_tasks:
    - import_tasks: roles/wordpress/tasks/pre.yml
  roles:
    - generic/apache
    - generic/mariadb
    - wordpress
  post_tasks:
    - import_tasks: roles/wordpress/tasks/post.yml

první příklad s xibo používá pro role dedičnosti, tedy sama role ví že si má použít jiné role (docker, databaze a webserver). V druhým příkladu wordpress s dědičností nepracuje takže musím potřebný role zavolat ručně.

Proměný mají definované role většinou nějaké defaultní, které se pak přepisují nejčastějí v rámci host_vars
Kód: [Vybrat]
#production/host_vars/fdqn
xibo_instances:
  - xibo_server_name: admin.fdqn
    xibo_path: /opt/xibo/
    xibo_version: 2.0.4
    xibo_web_port: 127.0.0.1:8080
    xibo_xmr_port: 9505
  - xibo_server_name: test.fdqn
    xibo_path: /opt/xibo_test/
    xibo_version: 2.1.0.rc1
    xibo_web_port: 127.0.0.1:8081
    xibo_xmr_port: 9506

Tady na fdqn mi role připraví dvě instance ty aplikace. Co se týká skupin tak u nich ještě používám group_vars/all.yml a pak skupiny "geolokační" který vesměs slouží k nastavení repozitářů.

Asi největší nevýhoda/výhoda tohodle systému je, že role který jsou "dole" třeba apache musí být dost univerzálně napsaný tak aby je bez problému mohli používat ostatní role. Například když jsem dělal apache tak jsem hodně okoukal a naučil se tady https://github.com/geerlingguy/ansible-role-apache

Re:Ansible - group_vars a host_vars - mam jine parametry, nez ocekavam
« Odpověď #14 kdy: 16. 08. 2019, 14:27:12 »
Od toho geerlingguy jsem uvazoval dost prevzit, resp. na galaxy jsem narazil, az kdyz jsem mel dost playbooku napsanych, tak uz jsem to tak nechal. Mam tam totiz nejake speciality, coz je duvod, proc jsem to nebral i z debops.

Takze pokud dobre chapu, delate i aplikacni skupiny napr.:
Kód: [Vybrat]
[wordpress]
fqdn1
fqdn2

To bych sice taky mohl, ale pak bych mel problem s nastavenim skupinovych parametru (napr. sjednoceny uid/gid na X serverech kvuli php/www) - psat to staticky do kazdyho host_vars/fqdn bych se zblaznil - zrovna treba i z vaseho prikladu ta "xibo_server_name", tu mam definovanou skupinove, ale pak staci jeden server bez te url v dane skupine a zase se mi to rozbije...Asi potrebuju nejakou dynamickou variantu inventory jiz...