Strona 1 z 1

Ansible playbook

: 03 kwie 2019, 17:29
autor: qligowski
Witam, od dwoch tygodni bawie sie w Ansible i trafilem na sciane. Chce stworzyc prosty playbook ktory ustawia hostname z predefiniowanej (jest takie slowo ? :lol: ) zmiennej. Czyli mam zalozmy 100 switchy w hosts file (same IP) i chce zeby mialy ta sama nazwe poza koncowka - np. 660-SW-1, 660-SW-2 etc az do konca petli (czyli az ustawi wszystkie).
KTos wie jak to ugryzc ? PRobowalem ale bez skutku.
---
- hosts: test
gather_facts: no
connection: local


vars:

hostname:
- 660-SW-



tasks:

- name: set hostname
with_items: "{{ hostname }}"
ios_config:
commands:
- hostname "{{ item }}"

Re: Ansible playbook

: 03 kwie 2019, 22:03
autor: drozdov
Hej

Generalnie skladnia byla by taka:

Kod: Zaznacz cały

- hosts: jakas_grupa_hostow
  gather_facts: no
  vars:
    hostname: 660-SW-
  tasks:
  - name: set hostname
     iso_config:
        commands: hostname {{hostname}}-{{item}}
     with_items:
       - {{tu_lista_z_tym_co_chcesz_dodac}}

Pytanie jak te dane wygladaja ({{tu_lista_z_tym_co_chcesz_dodac}})?

Re: Ansible playbook

: 03 kwie 2019, 22:11
autor: drozdov
A ok kumam mniej wiecej ( nie wczytalem sie )

Kod: Zaznacz cały

- hosts: grupa_z_twoimi_ip # to robisz przez inventory
  gather_facts: no
  vars:
    hostname: 660-SW-
  tasks:
  - name: set hostname
     iso_config:
        commands: hostname {{hostname}}-{{item}}
     with_items:
       - {{ansible_host.split('.')[3]}}
Cos takiego powinno byc ok.

Re: Ansible playbook

: 04 kwie 2019, 08:19
autor: qligowski
Wielkie dzieki! Sproboje to dzisiaj, a moglbys tylko wytlumaczyc co [3] znaczy w tej linii?
- {{ansible_host.split('.')[3]}}

Re: Ansible playbook

: 04 kwie 2019, 10:23
autor: drozdov
ansible_host to zmienna ktora trzyma twój IP, funkcja split rozdzieli Ci adres ip na 4 częsci majac '.' jako rozdzielacz ( :) ) a [3] oznacza pole indeksowane od 0 ( czyli x.x.x.X )

Re: Ansible playbook

: 04 kwie 2019, 14:02
autor: martino76
ogolnie

Kod: Zaznacz cały

with_items
nie powinno byc uzywane zostalo zastapione przez funkcje

Kod: Zaznacz cały

loop

Re: Ansible playbook

: 05 kwie 2019, 13:33
autor: qligowski
Dzieki wszystkim, w koncu udalo sie to ugryzc wylaczajac gather_facts: false i zmieniajac ansible_hostname na inventory_hostname.
Oto dzialajacy skrypt:

Kod: Zaznacz cały

---
- hosts: test
  connection: local

  vars:
    hostname: 660-SW
  tasks:

  - name: set hostname
    ios_config:
      commands:
      - hostname {{hostname}}-{{item}}
    loop:
      - "{{ inventory_hostname.split('.')[3] }}"

Re: Ansible playbook

: 06 kwie 2019, 14:04
autor: peper
qligowski pisze: 05 kwie 2019, 13:33 Dzieki wszystkim, w koncu udalo sie to ugryzc wylaczajac gather_facts: false i zmieniajac ansible_hostname na inventory_hostname.
W przypadku urządzeń sieciowych generalnie gather_facts przeszkadza a nie pomaga. Pamiętaj, że z punktu widzenie tego jak Ansible działa jest pewna zasadnicza różnica dt. sposobu wykonania modułu. W przypadku "tradycyjnych" modułów odnoszących sie do operacji związanych z systemem operacyjnym uruchamiasz playbook lokalnie lecz to co się dzieje w tle to połączenie SSH do hosta z inventory, ewentualne podniesienie uprawnień i wykonanie operacji bezpośrednio na hoście opisanym w inventory. Czyli tam musisz mieć odpowiednie narzędzia zainstalowane wymagane przez moduły Ansible. Moduły dla urządzeń sieciowych działają nieco inaczej, gdyż hostem wykonywania modułu jest w większości przypadków localhost, lub ewentuanie inny serwer z dostępem do urządzenia sieciowego, i łączy się on za pomocą SSH, REST API etc. do urządzenia sieciowego aby wykonać operacje. Dlatego inventory jako takie jest traktowane trochę inaczej w tym przypadku.

Re: Ansible playbook

: 06 kwie 2019, 22:08
autor: qligowski
Warto jeszcze dopisac ze hostname_inventory jest zmienna ustawiona w hosts file a ansible_hostname jest ta ktora jest wykrywana przez Ansible bezposrednio na urzadzeniu (dlatego gather facts musi byc true) :D