Úprava výstupu z hostnamectl

Úprava výstupu z hostnamectl
« kdy: 13. 08. 2021, 14:39:28 »
zdravím.
Standardní výstup z pc:
 
Kód: [Vybrat]
Static hostname: ubuntuserver
         Icon name: computer-vm
           Chassis: vm
        Machine ID: dc9ba6f6ac344d5d8240e87cf0c436f1
           Boot ID: 9f11ecf7227146be9616046e66800565
    Virtualization: kvm
  Operating System: Ubuntu 20.04.2 LTS
            Kernel: Linux 5.4.0-81-generic
      Architecture: x86-64
Dalo by se nějak přesměrovat výstup do souboru ale jen ve formátu:
Static hostname: ubuntuserver, Operating System: Ubuntu 20.04.2 LTS, Kernel: Linux 5.4.0-81-generic, Architecture: x86-64
« Poslední změna: 13. 08. 2021, 16:12:52 od Petr Krčmář »


Re:Úprava výstupu z hostnamectl
« Odpověď #1 kdy: 13. 08. 2021, 16:32:46 »
Něco ve smyslu

Kód: [Vybrat]
hostnamectl | grep -E "(Static hostname:|Operating System:|Kernel:|Architecture:)" | sed -e 's/^ \+//g' -e 's/$/, /g' | tr -d $'\n'
Výrazem v grepu si vyberete řádky, co chcete, první příkaz v sedu odstraní leading whitespace, druhý příkaz dá na konce řádků čárky, a nakonec se to prožene příkazem tr, který smaže newlines. Jediná deviace je, že i za posledním polem je ", "

Re:Úprava výstupu z hostnamectl
« Odpověď #2 kdy: 14. 08. 2021, 07:05:26 »
Tohle
Kód: [Vybrat]
hostnamectl | sed -e 's/^ \+//g' | grep -E "(Static hostname:|Operating System:|Kernel:|Architecture:)" | sed '$!s/$/,/' | tr '\n' ' ' | grep -v '\['mi vraci
Kód: [Vybrat]
Static hostname: localhost.localdomain, Operating System: blabla, Kernel: Linux 5.x86_64, Architecture: x86-64

Re:Úprava výstupu z hostnamectl
« Odpověď #3 kdy: 15. 08. 2021, 13:04:41 »
nebo jenom v perlu
Kód: [Vybrat]
hostnamectl | perl -nle 's/^\s+//; push @x, $_ if /^(Static hostname|Operating System|Kernel|Architecture):/;' -e 'END { print join ",", @x }'

k3dAR

  • *****
  • 3 071
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Úprava výstupu z hostnamectl
« Odpověď #4 kdy: 15. 08. 2021, 16:15:53 »
nebo bez hostnamectl ;-)
Kód: [Vybrat]
echo "Static hostname: $(hostname), Operating System: $(lsb_release -ds), Kernel: $(uname -sr), Architecture: $(arch)"


Re:Úprava výstupu z hostnamectl
« Odpověď #5 kdy: 16. 08. 2021, 08:26:53 »
PARÁDA. Moc děkuji všem. Vše funguje.

Re:Úprava výstupu z hostnamectl
« Odpověď #6 kdy: 16. 08. 2021, 10:54:53 »
Z uvedených možností jsem vybral jednu a připravil script pro ansible. Účelem je postit ho nad sítí a vycucnout z ní co je za podřízená distra, v jaké architektuře apod. Takový script se pustí jen jednou. Hodí se tam kde těch počítačů jsou desítky.
Nicméně stále tápu a mám tam jednu banální chybu:
Kód: [Vybrat]
---
- hosts: all
  remote_user: spravce
  become: yes
  become_method: sudo
  tasks:
  - name: Vytvor vycuc z hostname
    shell: 'echo "IP address: $(hostname -I)Static hostname: $(hostname), Operating System: $(lsb_release -ds), Kernel: $(uname -sr), Architecture: $(arch)" >> /home/spravce/$(hostname).txt'
 
  - name: Zmena prav k souboru
    file:
      path: '/home/spravce/$(hostname).txt'
      owner: spravce
      group: spravce
      mode: '0644'
     
  - name: Odeslani logu na ridici server
    fetch:
       src: '/home/spravce/$(hostname).txt'
       dest: '/home/spravce/ansible_sachlj/funguje/hostname/'
   

už v kroku kdy se mají nastavit práva k souboru (vygeneruje soubor s právy roota) to hodí chybovou hlášku:
Citace
FAILED! => {"changed": false, "msg": "file (/home/spravce/$(hostname).txt) is absent, cannot continue", "path": "/home/spravce/$(hostname).txt", "state": "absent"}
kdy mi jasně říká že soubor $(hostname).txt nenašel...přitom v kroku kdy soubor definuje ho v pohodě udělá např. centos8.txt....
jak mu tedy mám v dalších krocích (změna práv a odeslání na řídící server) definovat název kterému bude rozumět? Název je hostname.txt každého serveru.

Děkuji

Re:Úprava výstupu z hostnamectl
« Odpověď #7 kdy: 16. 08. 2021, 11:41:33 »

Re:Úprava výstupu z hostnamectl
« Odpověď #8 kdy: 16. 08. 2021, 11:57:16 »
https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html#ansible-facts

bezva to je ale až moc podrobné a neřeší to problém. Potřebuji vytáhnout data o podřízené stanici: tj. hostname, ip adresa, distro, architektura (32 n 64 bit), kernel...víc nepotřebuji..to uložit do souboru a ten mi zaslat na řídící server, tj.server kde je ansible..proč? no proto abych pak z těch souborů složil soubor hosts a rozčlenil servery do skupin : ubuntu,debian a rhel, centos a řídil pak scripty podle distra..mám tak už v čísti sítě to takto udělané, tam bylo ale jen pár serverů kde se ty informace získaly ručně...

Re:Úprava výstupu z hostnamectl
« Odpověď #9 kdy: 16. 08. 2021, 12:11:35 »
bezva to je ale až moc podrobné a neřeší to problém.

Jak to že ne? Pomocí ansible voláte shell skript, který vám zjišťuje vše, co potřebujete. Jenže, pokud není určeno jinak, ansible si zjišťuje fakta automaticky (TASK [Gathering Facts]) před voláním dalších tasku. Tedy před tím vaším shell taskem si to už samo zjistilo všechna data.

Udělejte si to jak chcete, ale je vždy lepší používat vestavěné funkce namísto volání shell.

Re:Úprava výstupu z hostnamectl
« Odpověď #10 kdy: 16. 08. 2021, 12:13:04 »
beru zpět...už jsem našel co a jak..teď si s tím hraju..

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/setup_module.html

Re:Úprava výstupu z hostnamectl
« Odpověď #11 kdy: 16. 08. 2021, 12:29:30 »
celé je to v tomhle příkazu.
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/setup_module.html

Citace
ansible all -m ansible.builtin.setup --tree /tmp/facts

co mě zajímá lze pak vyzobat. Například:
ansible all -m ansible.builtin.setup --tree /tmp/facts -a 'filter=ansible_all_ipv4_addresses,size,labels,ansible_hostname,ansible_kernel,ansible_os_family'
do filtru lze dát cokoliv co si vyčtu z toho kompletního výpisu.

Re:Úprava výstupu z hostnamectl
« Odpověď #12 kdy: 16. 08. 2021, 20:13:00 »
Není potřeba dopředu nic skládat a rozčleňovat, ansible si ten systém ošahává právě proto, aby věděl, s čím pracuje, takže veškeré "řízení" je možné za běhu. Typicky bývá jeden z prvních tasků playbooku load varsů, které jsou nějakým způsobem odlišné -- třeba právě podle distribuce/architektury, jako názvy balíků, cesty, atp.
Takže pustíš playbook, ansible ví, že je to CentOS, a naloaduje si soubor s varsama, které platí pro CentOS. V dalším tasku chceš třeba instalovat specifický balík -- název pro CentOS máš zadefinovaný právě v tom už naloadovaném souboru. Pro Debian se ten balík ale jmenuje jinak, takže máš další soubor, který se loaduje, pokud je distro Debian -- tímto způsobem to máš všechno na hromádce uspořádané, když ti přibude další distro, tak si jen přidáš další soubor a do něj příslušné specifikum. Stejně tak jde pak i běh samotného tasku podmiňovat hodnotou dostupných faktů.

Záleží, jak moc si s tím pohraješ a jak moc to budeš chtít mít parametrizované, ale cílem je mít ideálně roli, která je univerzální a přitom stále přehledně definovaná, což oceníš při pozdějších aktualizacích.

https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/first_found_lookup.html


https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html#ansible-facts

bezva to je ale až moc podrobné a neřeší to problém. Potřebuji vytáhnout data o podřízené stanici: tj. hostname, ip adresa, distro, architektura (32 n 64 bit), kernel...víc nepotřebuji..to uložit do souboru a ten mi zaslat na řídící server, tj.server kde je ansible..proč? no proto abych pak z těch souborů složil soubor hosts a rozčlenil servery do skupin : ubuntu,debian a rhel, centos a řídil pak scripty podle distra..mám tak už v čísti sítě to takto udělané, tam bylo ale jen pár serverů kde se ty informace získaly ručně...

Re:Úprava výstupu z hostnamectl
« Odpověď #13 kdy: 16. 08. 2021, 22:44:17 »
celé je to v tomhle příkazu.
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/setup_module.html

Citace
ansible all -m ansible.builtin.setup --tree /tmp/facts

co mě zajímá lze pak vyzobat. Například:
ansible all -m ansible.builtin.setup --tree /tmp/facts -a 'filter=ansible_all_ipv4_addresses,size,labels,ansible_hostname,ansible_kernel,ansible_os_family'
do filtru lze dát cokoliv co si vyčtu z toho kompletního výpisu.

Ansible si pri pripojeni na host  tu masinu osaha sam dost podrobne. https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html

Re:Úprava výstupu z hostnamectl
« Odpověď #14 kdy: 16. 08. 2021, 23:32:25 »
Vlastne staci do tasku dat
Kód: [Vybrat]
- name: Play tasks by distro
  include: "{{ansible_tasks['ansible_distribution']}}-{{ansible_tasks['ansible_distribution_major_version']}}.yaml"

alebo pouzit when...

Nez to davat natvrdo do host suboru a udrziavat to, tak je lepsie nechat ansible nech sa rozhodne sam podla aktualnej situacie.