{"id":5418,"date":"2017-06-06T09:39:59","date_gmt":"2017-06-06T07:39:59","guid":{"rendered":"https:\/\/www.imacandi.net\/sin\/blog\/?p=5418"},"modified":"2017-06-06T09:39:59","modified_gmt":"2017-06-06T07:39:59","slug":"ubuntu-16-04-pxe-install","status":"publish","type":"post","link":"https:\/\/www.imacandi.net\/sin\/blog\/2017\/06\/06\/ubuntu-16-04-pxe-install.html","title":{"rendered":"ubuntu 16.04 pxe install"},"content":{"rendered":"<p style=\"text-align: justify;\">De anul trecut am trecut incet, incet spre DevOps. Mai bag si&nbsp;pe security, da mai rar in ultima vreme.<\/p>\n<p style=\"text-align: justify;\">Doar Ops n-am mai facut de ceva vreme si evident, ca m-am mai ramolit un pic pe partea asta. Iar cu Dev-ul din DevOps &nbsp;o lalai in Python, ca e bun pentru a programa chestii de sistem.<\/p>\n<p style=\"text-align: justify;\">Pentru un client nou, am avut de facut un server de deployment pentru niste servere fizice astfel incat sa bagi serverul poaspat scos din cutie in priza, sa-l conectezi la retea si 15min mai tarziu sa-l ai instalat. Bine, depinde de viteza mirror-ului asta, ca prin unele tari merge intrnetul de zici ca&#8217;l aduc cu galeata.<\/p>\n<p style=\"text-align: justify;\">Ca si distro am folosit Ubuntu 16.04 LTS pentru ca $reasons.<\/p>\n<p style=\"text-align: justify;\">Partea usoara e sa instalezi un server de TFTP si un server de DHCP care sa aloce IP-uri si sa spuna la clienti cum&nbsp;se cheama&nbsp;fisierul pentru BOOTP.<\/p>\n<p style=\"text-align: justify;\">Ca si server de deployment am folosit tot un Ubuntu 16.04, sa fie instalarea intre prieteni sa mearga bine si fara probleme :))<\/p>\n<p style=\"text-align: justify;\">Si pentru ca multe servere, evident ceva care sa faca orchestrare si management. Si ca ziceam mai sus ca o lalai cu Python, SaltStack a fost raspunsul.<\/p>\n<p style=\"text-align: justify;\">Asa ca, cum se face sa deployezi multe servere fizice in vremea lui AWS, GCP si Azure:<\/p>\n<ol style=\"text-align: justify;\">\n<li>Se instaleaza <strong>atftpd<\/strong>, se modifica&nbsp; <strong>\/etc\/default\/atftpd<\/strong> si se schimba&nbsp;<strong>USE_INETD<\/strong> din <strong>true<\/strong> in <strong>false<\/strong>. Dupa care <strong>systemctl enable atftpd<\/strong> si <strong>systemctl start atftpd<\/strong>.<\/li>\n<li>Se downloadeaza un ISO de Ubuntu Server 16.04 si se monteaza cu loop pe sistem.<\/li>\n<li>Se copiaza de unde s-a montat ISO continutul directorului <strong>netboot<\/strong> in <strong>\/srv\/tftp<\/strong>.<\/li>\n<li>Dupa nevoie se editeaza <strong><a href=\"https:\/\/github.com\/thesinwithin\/blog\/blob\/master\/ubuntu-pxe-install\/srv\/tftp\/boot-screens\/menu.cfg\">\/srv\/tftp\/boot-screens\/menu.cfg<\/a><\/strong> astfel incat sa bata cu realitatea la fata locului. Cateva note la exemplul meu:\n<ol>\n<li>installerul e retardat si daca serverul de DNS raspunde cu AAAA RRs, o sa vrea sa se conecteze pe IPv6 la mirror, chiar daca nu are ruta default pe IPv6.<\/li>\n<li>A.B.C.D se inlocuieste cu adresa IP a serverului de TFTP<\/li>\n<li>eno3 e cum stiu eu ca se cheama interfata de retea pe care o foloseste masina ce va fi instalata&nbsp;pentru DHCP, pentru ca in cazul meu aveam mai multe interfete si se blocheaza installer-ul si te pune sa alegi una (chiar si cu optiunea <strong>auto<\/strong> tot la fel face).<\/li>\n<\/ol>\n<\/li>\n<li>Se creeza <strong><a href=\"https:\/\/github.com\/thesinwithin\/blog\/blob\/master\/ubuntu-pxe-install\/srv\/tftp\/preseed\/ubuntu-16.04-preseed.cfg\">\/srv\/tftp\/preseed\/ubuntu-16.04-preseed.cfg<\/a><\/strong> unde se va scrie configuratia pentru installer. La fel, cateva note la exemplul meu:\n<ol>\n<li>Installer-ul va crea un setup de tip RAID10 din primele patru discuri de pe sistem. Recipe-ul de RAID l-am bunghit cu #mumu help, ca nu prea e documentat cum se face. E un pic de magie in toata treaba aia.<\/li>\n<li>Peste va configura LVM si <strong>\/<\/strong> va fi un LV de 30GB pe VG-ul nou creat.<\/li>\n<li>In cazul in care masina va avea mai multe interfete de retea, trebuie specificat ce intefata sa foloseasca in mod automat. Altfel va sta ca boul asteptand sa selectezi pe care sa o folosesti.<\/li>\n<li><strong>$magic_postinstall_setup_script<\/strong> poate fi orice script (bash, python, perl etc.) care face chestii pe sistem inainte de reboot dupa instalare. Scriptul asta de obicei se pune pe un server web, se downloadeaza si se executa. O sa revin mai tarziu cu ce si cum.<\/li>\n<\/ol>\n<\/li>\n<li>Se instaleaza <strong>isc-dhcp-server<\/strong> si se modifica <strong>\/etc\/dhcp\/dhcpd.conf<\/strong> sa dea adrese dintr-un pool la clienti si se adauga urmatoarea optiune in definitia de subnet:<\/li>\n<li>\n<pre>filename \"pxelinux.0\";<\/pre>\n<p><strong>systemctl enable isc-dhcp-server<\/strong> si <strong>systemctl start isc-dhcp-server<\/strong>.<\/li>\n<li>Se buteaza o masina fizica si se asteapta pana termina de instalat. Daca da oroare sa ceva, trebuie fixata in fisierul de preseed, reboot si de la cap cu instalarea pana merge. Nu exista checker pentru fisierul de preseed. Pe mine m-a enervat maxim treaba asta ca instalarea se facea pe niste Dell R430 si pana buteaza alea mori incet.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Ziceam mai sus ca inainte de reboot, pot da comenzi in sistemul nou instalat sa-l configurez cumva inainte sa porneasca prima oara.<\/p>\n<pre>d-i preseed\/late_command string \\\r\n in-target wget -P \/tmp\/ -t 0 -c http:\/\/A.B.C.D\/myscript.sh; \\\r\n in-target chmod +x \/tmp\/myscript.sh; \\\r\n in-target \/tmp\/myscript.sh; \\\r\n in-target wget -P \/tmp\/ https:\/\/repo.saltstack.com\/apt\/ubuntu\/16.04\/amd64\/latest\/SALTSTACK-GPG-KEY.pub; \\\r\n in-target apt-key add \/tmp\/SALTSTACK-GPG-KEY.pub; \\\r\n \/bin\/echo \"dev.raid.speed_limit_max = 1000000\" &gt;&gt; \/target\/etc\/sysctl.conf; \\\r\n \/bin\/echo \"deb http:\/\/repo.saltstack.com\/apt\/ubuntu\/16.04\/amd64\/latest xenial main\" &gt; \/target\/etc\/apt\/sources.list.d\/saltstack.list; \\\r\n in-target apt-get update; \\\r\n in-target apt-get install -y salt-minion<\/pre>\n<p style=\"text-align: justify;\">Se pot da comenzi succesive in <strong>late_command<\/strong>. Ce trebuie stiut:<\/p>\n<ol style=\"text-align: justify;\">\n<li>Cuvantul <strong>in-target<\/strong> ii zice installer-ului sa faca <strong>chroot()<\/strong> in noul sistem si sa execute comanda de acolo.<\/li>\n<li>Comenzile date fara <strong>in-target<\/strong> se ruleaza de pe mediul de instalare (din installer cum s-ar zice).<\/li>\n<li>Se foloseste combinatia normala + <strong>in-target<\/strong> ca unele comenzi nu merg in chroot, ca de exemplu <strong>echo $stuff<\/strong> merge doar din installer, in chroot nu merge. Poate imi scapa mi ceva, dar sa stau sa debughez asta dura prea mult.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Ziceam ca pentru orchestrare si configurare am mers pe SaltStack. Eu pentru ca are minioni, colegul de proiect ca i s-a luat de Puppet. Bine, nici eu nu m-am omorat dupa Puppet ca e scris in Ruby.<\/p>\n<p style=\"text-align: justify;\">Cine a facut SaltStack asta a fost inteligent si minionii daca n-au nici o configuratie, o sa incerce sa se lege la <strong>salt.domain.name<\/strong>. Si asta inseamna ca tot ce trebuie sa am este un <strong>salt-master<\/strong> instalat si configurat acolo un pic, configurat DNS-ul atfel incat <strong>salt.domain.com<\/strong> sa bata la un serverul pe care ruleaza <strong>salt-master<\/strong> si, dupa ce fiecare masina fizica se rebuteaza, minionul se va conecta automat la <strong>salt-master<\/strong>. Magie adevarata.<\/p>\n<p style=\"text-align: justify;\"><strong>salt-key &#8211;accept-all<\/strong> este raspunsul la intrebarea cum confirm ca minionii inregistrati sunt ai mei :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>De anul trecut am trecut incet, incet spre DevOps. Mai bag si&nbsp;pe security, da mai rar in ultima vreme. Doar Ops n-am mai facut de ceva vreme si evident, ca m-am mai ramolit un pic pe partea asta. Iar cu Dev-ul din DevOps &nbsp;o lalai in Python, ca e bun pentru a programa chestii de &hellip; <a href=\"https:\/\/www.imacandi.net\/sin\/blog\/2017\/06\/06\/ubuntu-16-04-pxe-install.html\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">ubuntu 16.04 pxe install<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"ngg_post_thumbnail":0,"footnotes":""},"categories":[2],"tags":[19],"class_list":["post-5418","post","type-post","status-publish","format-standard","hentry","category-diverse","tag-linux"],"_links":{"self":[{"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/posts\/5418","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/comments?post=5418"}],"version-history":[{"count":7,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/posts\/5418\/revisions"}],"predecessor-version":[{"id":5425,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/posts\/5418\/revisions\/5425"}],"wp:attachment":[{"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/media?parent=5418"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/categories?post=5418"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/tags?post=5418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}