[ anon70939 @ 11.12.2018. 08:25 ] @
Mislim, koristim bash vec duze vreme, ali skripte koje sam pisao uglavnom je izvršavanje red po red bez neke logike. OK koristio sam "if" ali ništa značajnije od toga. Tipa, ako je danas 1. u mesecu onda izvrši tu komandu umesto one prve.
U principu nisam ni svestan šta se sve može, pa me interesuju šta da odaberem da se posvetim malo više.
Python sam naučio neke osnove, ali opet nedovoljno da bih znao kako da primenim.

- Da li da odaberem python ili bash za unapredjivanje znanja?
- Imate li predlog za neku literaturu? Nešto što se više oslanja na neke vežbe, zadatke, a usputno teorija?


Moj trenutni nivo bih opisao sa stranicom 9 u ovoj knjizi
https://www.tldp.org/LDP/abs/abs-guide.pdf

Moje skripte su izgledale otprilike kao primer 2-2. Dok 2-3 ja daleko od onog što znam.

[Ovu poruku je menjao CoyoteKG dana 11.12.2018. u 09:35 GMT+1]
[ djoka_l @ 11.12.2018. 08:43 ] @
Uči obe stvari.

Ja samo imao nekoliko hiljada linija shell skriptova (doduše ksh, ali je to skoro isto kao bash), biblioteke sa najčešćim funkcijama koje sam uključivao u druge skriptove.
Stvar je prosta, ako posao radi bash skript koristi njega. Ako posao radi awk, koristi awk. Ako ne, možda Perl pomogne, ili Python.

Prednost bash programiranja je što bash već postoji na svakom Linuxu, Python mora da se instalira. Ili možda postoji verzija 2.7 a tebi treba baš verzija 3+. Sa druge strane, Python je pravi programski jezik, ogromna podrška, gomila biblioteka koje možeš da iskoristiš.

Koristi ono što ti je najjednostavnije i što radi posao.
[ anon70939 @ 16.12.2018. 15:56 ] @
recimo napisah sad jednu skriptu za instalaciju Jenkins od početka na Centos 7 minimal ISO

Je l' ovako nešto može da se nazove "osnovama pisanja bash skripti"? :)
Nemam prdstavu kad ljudi traže poznavanje bash scripting jezika, šta to podrazumeva.
Nešto više od ovoga jedino što bih mogao da uključim if else petlje. Recimo ako bih hteo da napišem da skripta radi i za Centos 6.

#! /bin/bash
# This script will install Jenkins on CentOS 7 minimal ISO

PASSWORD="nekipassword"
DOMAIN="jenkins.domain.cc"


# installing useful tools
yum -y install vim net-tools wget telnet

# install nginx
yum -y install epel-release
yum -y install nginx
systemctl enable nginx
systemctl start nginx
systemctl stop firewalld
systemctl disable firewalld

# Install Java and Jenkins
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum -y install jenkins java
systemctl enable jenkins && systemctl start jenkins

# Setup vhost/server block
mkdir -p /var/www/$DOMAIN/public_html
echo 'Hello world!' > /var/www/$DOMAIN/public_html/index.html
chmod 755 /var/www/$DOMAIN/public_html
mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled
sed -i '/http {/a include /etc/nginx/sites-enabled/*.conf;\nserver_names_hash_bucket_size 64;' /etc/nginx/nginx.conf

echo "server {

listen 80;
server_name $DOMAIN;

location / {

# Fix the "It appears that your reverse proxy set up is broken" error.
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 90;

proxy_redirect http://127.0.0.1:8080 http://$DOMAIN;

# Required for new HTTP-based CLI
proxy_http_version 1.1;
proxy_request_buffering off;
# workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
add_header X-SSH-Endpoint jenkins.domain.tld:50022 always;
}
}

" > /etc/nginx/sites-available/$DOMAIN.conf

sed -i '/location \/ {/a\ proxy_set_header Host $host:$server_port;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;' /etc/nginx/sites-available/$DOMAIN.conf

ln -s /etc/nginx/sites-available/$DOMAIN.conf /etc/nginx/sites-enabled/$DOMAIN.conf
#set selinux
yum install -y setroubleshoot-server selinux-policy-devel
semanage port -m -t http_port_t -p tcp 8080
chcon -Rt httpd_sys_content_t /var/www/
systemctl restart nginx jenkins

# enable jenkins user to login to ssh and create keys
yum -y install sshpass
echo -e "$PASSWORD\n$PASSWORD" | passwd jenkins
sed -i 's/\/var\/lib\/jenkins\:\/bin\/false/\/var\/lib\/jenkins\:\/bin\/bash/g' /etc/passwd

mkdir /var/lib/jenkins/.ssh
ssh-keygen -f /var/lib/jenkins/.ssh/jenkins -t rsa -N ''
cp /var/lib/jenkins/.ssh/jenkins.pub /var/lib/jenkins/.ssh/authorized_keys
mv /var/lib/jenkins/.ssh/jenkins /var/lib/jenkins/.ssh/id_rsa
chown -R jenkins /var/lib/jenkins/.ssh/
echo -e 'Host *\nStrictHostKeyChecking=no' > /var/lib/jenkins/.ssh/config


Sledeće recimo što bih mogao je instalacija letsencrypt sertifikata.




[Ovu poruku je menjao CoyoteKG dana 16.12.2018. u 17:20 GMT+1]
[ nkrgovic @ 16.12.2018. 17:25 ] @
Par zamerki :
Code:

systemctl stop firewalld
systemctl disable firewalld

Zasto ovako?

Sta fali firewalld-u? Zasto ga disable-ujes? Mnogo bi bilo bolje da si dodao port 80 (ili, jos bolje 443) u public zone. Uspust dodaj i fail2ban ;)
Code:
 chcon -Rt httpd_sys_content_t /var/www/

Ovo ce ti se pokarabasiti vremenom. Probaj sa
Code:
semanage fcontext -a -t httpd_sys_content_t "/var/www(/.*)?"

pa onda samo restorecon.
[ anon70939 @ 16.12.2018. 17:40 ] @
pitanje je vise bilo za skriptu kao skriptu, da l je uobicajeno tako pisati :). A ako su samo to zamerke ja sam zadovoljan.

firewalld sam iskljucio kao najlakse u momentu da nastavim sa instalacijom, jer svakako planiram umesto firewalld da stavim iptables jer se tu bolje snalazim.

selinux... tu sam tanak mnogo. Jednostavno nije mi radio nginx pa sam to izguglao kao resenje ali pojma nemam šta je.
[ Zlatni_bg @ 16.12.2018. 17:58 ] @
Obe uci brate. Bash ce ti znaciti za "skracivanje" posla u cmdl u linuxu, pythonom ces moci da napravis neke stvari. Malo su razlicite stvari, python jeste skripting ali ne klasican, vise je ono "programski jezik koji se ne kompajlira", dok je bash skripting. Ja sam radio paralelno sta mi je trebalo. E sad, uz bash treba da ucis i neke "cake", tipa kako da ti interpretira samo onu datu koju ti zelis, itd... Mnogo su razlicite primene.

Za Python ti ZESTOKO predlazem da dignes Jupyter na masini i radis preko notebookova za pocetak.
[ jablan @ 16.12.2018. 20:55 ] @
@CoyoteKG: Šta skripta radi ako ti neka od komandi pukne?
[ peromalosutra @ 16.12.2018. 21:09 ] @
I ja bih rekao da je dobro znati oboje. Bash je super korisan i kada ne pišeš skripte, već radiš interaktivno u konzoli, npr. hoćeš da uradiš mass rename fajlova i slično. Za početak ne moraš da ulaziš u neke dubine, ali je super korisno da znaš par osnovnih stvari: uslovi, petlje, manipulacija stringovima, pipes. Awk je takođe veoma zgodan i iako je jezik sam za sebe, lako se integriše sa bashom pa je zgodno uraditi makar nekoliko primjera da se upoznaš sa konceptima. Npr ako pokušavaš formatirati izlaz iz nekog log-a u drugačiji format, tu awk dominira.

Python je sledeća stepenica na koju prelaziš kada je problem takav da je nezgodan/previše kompleksan za rješavanje kroz čisti bash, npr. ako imaš nekih izračunavanja, ili ti je potrebno nekakvo mapiranje (dictionary).



[ anon70939 @ 16.12.2018. 22:04 ] @
@jablan,

sta bi valjalo da radi? :)

Citat:
npr. ako imaš nekih izračunavanja, ili ti je potrebno nekakvo mapiranje (dictionary)

I dalje ne kapiram kako bi mogao to da upotrebim :)

zlatni, imao sam jupyter dok sam ucio.
[ Branimir Maksimovic @ 16.12.2018. 22:09 ] @
Pa valjalo bi da proveri da li je pukla komanda i ako jeste da ne nastavlja dalje.
[ anon70939 @ 16.12.2018. 22:11 ] @
kako :)


edit:
ok izguglah error handling, videcu.

Evo lepog objasnjenja
http://linuxcommand.org/lc3_wss0140.php



[Ovu poruku je menjao CoyoteKG dana 16.12.2018. u 23:27 GMT+1]
[ Branimir Maksimovic @ 16.12.2018. 22:32 ] @
Pa svaka komanda na Unix-u ima exit code koji mozes da proveris iz shell-a.
To je onaj famozni int main(void) ;)

recimo ls | echo $? ti ispise 0 ako je sve ok sa prethodnom komandom.
[ plus_minus @ 17.12.2018. 00:05 ] @
@Coyote

set -x


Ukucaš to gore na mestu odakle hoćeš da bash shell krene da debuguje i da ispisuje svaki korak svake komande na ekranu.

set +x


Staviš ovo iznad kao završnicu.

Kad pišeš neku bash skriptu dakle, pratkično ti i ne treba set +x na kraju, već samo početni `okidač`. Neka prošparta sve, jel' da?

Kad si ustanovio da nema grešaka, obrišeš set -x i to je to.


Osim toga, to gore što si postavio, pa šta ja znam ... imaš tu neke yum (sudo) komande u tom fajlu

Ako je tako, makar ovo kao dodatak, neće da škodi ..

Code (bash):

if [ "$EUID" -ne 0 ]
then
    echo "* [ERROR] Run this script under 'sudo -s' or as root"
    exit 1
fi
 


Osim toga, ako si se već naložio da kreneš da programiraš ili pišeš skripte.. Funkcije `đole`, funkcije..
Uči ih odmah.
[ Zlatni_bg @ 17.12.2018. 04:56 ] @
Citat:
CoyoteKG:
pitanje je vise bilo za skriptu kao skriptu, da l je uobicajeno tako pisati :). A ako su samo to zamerke ja sam zadovoljan.

firewalld sam iskljucio kao najlakse u momentu da nastavim sa instalacijom, jer svakako planiram umesto firewalld da stavim iptables jer se tu bolje snalazim.

selinux... tu sam tanak mnogo. Jednostavno nije mi radio nginx pa sam to izguglao kao resenje ali pojma nemam šta je.


Preskocih ovaj post pa bih te samo malo posavetovao:

Naviknes se lako na firewalld, veruj mi ume da bude i preglednije nego iptables. Samo se radi o zonama koje su vezane za konekcije i tu otvaras portove. Generalno ako ces RHEL/Fedoru/CentOS da koristis, moraces da se naviknes na fwd.

Batali selinux. Nikad nemoj da koristis enforcing pre nego sto skapiras sta radi uopste. Znaci u 99% slucajeva kada sam prelazio sa Debiana ka Fedoru kao glavni distro koji koristim, lupao sam nocima glavom u sto jer stvari nisu radile (samba npr, to mi je najveci utisak ostavilo, 6h sam se mucio), i na kraju je SVE proradilo kada sam ugasio selinux.

Btw, kakav ti je plan za dalje? Sta bi zeleo da postignes sa bashom i pythonom? Ako te interesuje bas skripting i pravljenje konkretnih, vrlo funkcionalnih stvari uz sto manje muke, python je za to. Bash je vise za generalni rad sa linuxom nego bilo sta drugo. Vecina nas koristi bash skripte kako se ne bi na svakoj masini maltretirali satima da instaliramo isti sw :) Meni dobro dodje ako moram da povlacim nesto iz cmdl uz awk i filtriram podatke, ako izradjujem bekend servis ili nesto slicno, sto treba da radi i neki monitoring masine.
[ nkrgovic @ 17.12.2018. 07:46 ] @
Citat:
CoyoteKG:
pitanje je vise bilo za skriptu kao skriptu, da l je uobicajeno tako pisati :). A ako su samo to zamerke ja sam zadovoljan.

Skripta kao skripta je CITKA, sto je bitnije od dobro napisana. Da pises if i error handling, meni je overkill. Iskreno, meni bi ovo bilo dovoljno.

Zamerke da treba error handling jesu na mestu, ali za ovo ti ne treba ni bash ni python, vec je mnogo bolje da koristis neki gotov alat tipa ansible. Dobar ti je uvod i u python, sasvim je dovoljan za ovakve primene, sve moze da se instalira kroz njega a laksi ti je nego cisto python.

Zamerka da nema na masini python i nije neka, a ansible ima tu prednost da ga pravis da radi remote: Napravis playbook, izvrsis ga na SVOJOJ masini, a on instalira remote masinu. Samim tim, requirements nisu problem, stavise manje su za server - jer ne treba nista, sve se izvrsava na jednom mestu, i odlicno je za rad. Ja imam nekih zamerki ali ja sam prvo poceo ansible i i dalje mi je sjajan alat za brdo stvari.
[ nkrgovic @ 17.12.2018. 07:50 ] @
Citat:
Zlatni_bg:
Batali selinux. Nikad nemoj da koristis enforcing pre nego sto skapiras sta radi uopste. Znaci u 99% slucajeva kada sam prelazio sa Debiana ka Fedoru kao glavni distro koji koristim, lupao sam nocima glavom u sto jer stvari nisu radile (samba npr, to mi je najveci utisak ostavilo, 6h sam se mucio), i na kraju je SVE proradilo kada sam ugasio selinux.

Ovo je jako glup savet IM(NSH)O. SE Linux je postao norma u nekoj ozbiljnoj primeni, jedini koji ga jos uvek "gase" su pametnjakovici sa stavom "to nema na Debian/Ubuntu". Jako je i dobar i mocan alat, a ne treba mnogo vremena da se pokapira kako radi. Po meni odvojiti nedelju dana da pokapiras kako radi Mandatory Access Control vredi samo tako. Prednosti koje donosi su mnogo, ali mnogo vece od "troska" da provedes nedelju dana da naucis kako radi. Dokumentacija je dobra i obimna, primera ima puno, a zauzvrat te "brani" od vise klasa problema koje mogu da te strefe.

Po meni "iskljuci SE Linux, lakse je", je ekvivalent onome "stavi samo chmod 777 meni tako radi".
[ Zlatni_bg @ 17.12.2018. 08:00 ] @
Moras da imas u vidu da je Coyote do sada radio sa Windowsom, kao sysadmin ili sys engineer. Ne znam koliko je do sada imao iskustva sa linuxom jer ga nije spominjao na forumu. Mnogo vise ce ga kociti selinux u svemu tome u ovoj fazi nego sto ce mu doprineti. Naravno da selinux ima svoje vrline (ogromne) ali tek kada naucis da ih koristis.

Znaci moj savet nije bio samo "batali selinux", vec "nemoj da ga enforcujes dok ne naucis sta radi".
[ Burgos @ 17.12.2018. 08:12 ] @
Citat:
Branimir Maksimovic:
Pa valjalo bi da proveri da li je pukla komanda i ako jeste da ne nastavlja dalje.


Dovoljno je samo da stavi
set -e
na vrh skripte ;-).
[ nkrgovic @ 17.12.2018. 08:16 ] @
Citat:
Zlatni_bg:
Moras da imas u vidu da je Coyote do sada radio sa Windowsom, kao sysadmin ili sys engineer. Ne znam koliko je do sada imao iskustva sa linuxom jer ga nije spominjao na forumu. Mnogo vise ce ga kociti selinux u svemu tome u ovoj fazi nego sto ce mu doprineti. Naravno da selinux ima svoje vrline (ogromne) ali tek kada naucis da ih koristis.

Znaci moj savet nije bio samo "batali selinux", vec "nemoj da ga enforcujes dok ne naucis sta radi".

Ja ga eto, cenim - u smislu da vidim da se trudi - i nekako mislim da on to moze da savlada. :) On ovo ionako radi da bi ucio, pa k'o velim, bolje da uci odma redom sve sto ce da mu treba.

Komentar je bio vise da ne ostane ovo kao savet, a moj stav o kolegi je onaj sa pretpostavkom da on moze mnogo. :D
[ Branimir Maksimovic @ 17.12.2018. 08:28 ] @
Citat:
Burgos:
Citat:
Branimir Maksimovic:
Pa valjalo bi da proveri da li je pukla komanda i ako jeste da ne nastavlja dalje.


Dovoljno je samo da stavi
set -e
na vrh skripte ;-).


Da, moze i to kad nemas nista drugo osim linijskih komandi.
[ anon70939 @ 17.12.2018. 08:37 ] @
Citat:
nkrgovic:
Skripta kao skripta je CITKA, sto je bitnije od dobro napisana. Da pises if i error handling, meni je overkill. Iskreno, meni bi ovo bilo dovoljno.

Zamerke da treba error handling jesu na mestu, ali za ovo ti ne treba ni bash ni python, vec je mnogo bolje da koristis neki gotov alat tipa ansible. Dobar ti je uvod i u python, sasvim je dovoljan za ovakve primene, sve moze da se instalira kroz njega a laksi ti je nego cisto python.

Zamerka da nema na masini python i nije neka, a ansible ima tu prednost da ga pravis da radi remote: Napravis playbook, izvrsis ga na SVOJOJ masini, a on instalira remote masinu. Samim tim, requirements nisu problem, stavise manje su za server - jer ne treba nista, sve se izvrsava na jednom mestu, i odlicno je za rad. Ja imam nekih zamerki ali ja sam prvo poceo ansible i i dalje mi je sjajan alat za brdo stvari.

Vrlo mi je korisno što je savetovano da radim error handling. Za ovu skriptu je totalno nebitno. Ali trebaće :)
Ovu skriptu sam zamislio da mi služi za kompletnu instalaciju Jenkins servera od početka, bez da čuvam neki Image/AMI. "Jeftinije je" odnosno manje mesta zauzima. Tako da mi je error handling u ovom slučaju možda nepotreban, jer bi skripta trebalo da radi na identičnom okruženju, i ako prvi put prođe kad je napišem, onda bi trebalo svaki put. Mislim da je sasvim dovoljno ovo
Citat:
Burgos:
Dovoljno je samo da stavi
set -e
na vrh skripte ;-).

Jer ako mi je nešto krenulo loše, popraviću pa ću ispočetka pustiti skriptu (verujem da postoji bolji način :) )

Znam da tome u stvari služi Ansible/Puppet/Chef, i htedoh prvo da ispišem par skripti za instalaciju sledećih servera koji su mi potrebni čisto vežbanja radi. A onda ću i Ansible koji je koliko vidim agentless i koristi SSH. Ova druga dva nekom drugom prilikom...


Citat:
Zlatni_bg:
Naviknes se lako na firewalld, veruj mi ume da bude i preglednije nego iptables. Samo se radi o zonama koje su vezane za konekcije i tu otvaras portove. Generalno ako ces RHEL/Fedoru/CentOS da koristis, moraces da se naviknes na fwd.

...samba npr, to mi je najveci utisak ostavilo, 6h sam se mucio), i na kraju je SVE proradilo kada sam ugasio selinux. ...

Btw, kakav ti je plan za dalje? Sta bi zeleo da postignes sa bashom i pythonom? Ako te interesuje bas skripting i pravljenje konkretnih, vrlo funkcionalnih stvari uz sto manje muke, python je za to. Bash je vise za generalni rad sa linuxom nego bilo sta drugo. Vecina nas koristi bash skripte kako se ne bi na svakoj masini maltretirali satima da instaliramo isti sw :) Meni dobro dodje ako moram da povlacim nesto iz cmdl uz awk i filtriram podatke, ako izradjujem bekend servis ili nesto slicno, sto treba da radi i neki monitoring masine.

Za firewalld hoću sigurno. Video sam na više mesta da je "lakše i brže" korišćenje.
Sa bashom/pajtonom nemam neki posebni plan. Vidim po raznim konkursima da je potrebno za kojekakve pozicije, pa bar da naučim malo više od osnova. Pajton još ne kapiram kako bih mogao da iskoristim, odnosno ne vidim ni jedan "use case". Što se tiče bash-a sviđa mi se što EC2 instance uz pomoć User Data odnosno bootstrapping-a mogu da instaliram i podesim kompletan server za par minuta, i isključim bez razmišljanja "ko će sledeći put ponovo da podešava". To je valjda neki vid uštede.
Znam da tome služi Ansible (i Terraform za ceo infrastrukturni setup), ali eto htedoh prvo shell zbog ovog saveta sa druge teme

Citat:
djoka_l:
Razgovarao sam sa čovekom koji je napisao ovu knjigu:
https://www.oreilly.com/library/view/the-devops-20/9781785289194/

(inače knjiga je prilično dobra, vredi da se pročita).

Njegovo mišljenje o alatima za CI/CD - batali to sve. Mogu da ti pomognu, ali je PRVA stvar da znaš shell programiranje. ...


Citat:
nkrgovic:
... je ekvivalent onome "stavi samo chmod 777 meni tako radi".

Da sa kolegama php programerima sam se često sretao sa ovim savetom na produkciji, i svestan sam koliko je katastrofalan, zato sam radije izguglao neko rešenje i primenio (iako pojma nemam još uvek šta radi :) )
A inače sam se i ja ubio pola sata proveravajući nginx conf fajlove da skontam što mi ne radi proxy pass ili čak i obična index.html stranica. Ne znam tool kao apachectl sa kojim mogu da proverim da li su included svi conf fajlovi, pa se svodilo na to da napravim namerno grešku u sites-available conf fajlu i okinem nginx -t. Tek posle pola sata sam se setio da isključim selinux.

[Ovu poruku je menjao CoyoteKG dana 17.12.2018. u 09:50 GMT+1]
[ nkrgovic @ 17.12.2018. 08:50 ] @
Citat:
CoyoteKG
Znam da tome u stvari služi Ansible/Puppet/Chef, i htedoh prvo da ispišem par skripti za instalaciju sledećih servera koji su mi potrebni čisto vežbanja radi. A onda ću i Ansible koji je koliko vidim agentless i koristi SSH. Ova druga dva nekom drugom prilikom...

Sasvim dovoljno.

Glavni razlog da vozis puppet (ili chef, mada njega nisam probao) je to sto ima agent. To zvuci kao opterecenje (i jeste), ali sluzi tome da sam pool-uje config (manje bitno) i da ti garantuje da se sve vrti onako kako si napisao. To je zapravo glavna fora - alat koji ti sve vreme prati server i vraca ga u radno stanje, ako nesto pukne. (Podrazumeva se da nesto drugo prati logove i vristi kad nesto pukne).
Citat:
Za firewalld hoću sigurno. Video sam na više mesta da je "lakše i brže" korišćenje.

Glavni razlog, bar meni, je sto radi isto bez obzira na ime mrezne karte. Ti potrpas sta ti treba u koju zonu, mrezna karta je po default u svojoj (public) zoni, i ne razmisljas o tome kako se zove interfejs.

Na CentOS 6 je imalo puno alata koji naprave config tipa "iptables -i eth0...." i tako redom. Sad kad nije eth0, i kad ime nije portabilno - vec zavisi od drajvera, imas problem. Ovo je elegantno resenje

Naravno, vise zona je mnogo ozbiljnija prica i resava ti cele klase problema, na nacin koji jeste laksi kad obmotas mozak oko koncepta, ali to nije trivijalno. :) Ovo za ime interfejsa svi shvate za pet minuta. :D
[ djoka_l @ 17.12.2018. 08:53 ] @
@CoyoteKG

Prvo, u svakom slučaju je pohvalno to što skriptuješ bitne stvari, da ne bude posle da si nešto zaboravio kod procesa instalacije.

Međutim, ako je ova skripta trabala da bude primer kako ti programiraš bash skripte, onda tu ima mnogo što šta da se zameri.
To je isto kao da si u Excelu rekao RecordMacro, pa pitaš da li makro pokazuje da znaš da programiraš u VBA.
Tvoja skripta je, jednostavno, samo zapisan set komandi koje bi inače morao da otkucaš ručno.

plus_minus ti je dao dobar savet da uključiš test da li skriptu izvršava root

Ono što, po meni najviše nedostaje, je gomila testova koje si preskočio. Meni je bitno da mi skripte budu IDEMPOTENTNE. To znači da ako dva puta pustim istu skriptu, rezultati budu isti.

Recimo želiš da kreiraš fajl /etc/nesto

osnovna stvar je da proveriš da li taj fajl postoji ili ne

if [ ! -e /etc/nesto ]
then
# kreiraj fajl
else
# vec postoji
fi


Druga stvar, ne znaš caku za pravljenje fajla (zove se document here)

cat <<OznakaKrajaFajla >nekifajl
\$PATH ima vrednost:
$PATH
OznakaKrajaFajla


Meni je bilo problem da nađem gde je u tvom sktiptu kraj konfiguracionog fajla koji praviš

Treće, grozim se činjenice da sed-om menjaš passwd fajl. To meni nije košer, imaš komande usermod ili chsh da promeniš default shell korisniku, umesto da direktno menjaš passwd. Sad, passwd fajl se nije menjao značajno poslednjih 50 godina, ali ja sve jedno ne bih iz skripta menjao sadržaj fajla.
[ Panta_ @ 17.12.2018. 09:15 ] @
Citat:
Dovoljno je samo da stavi
set -e
na vrh skripte


Nije uvek, npr:
Code:
set -e
komanda1 && echo komanda2
echo komanda 3 izvrsena

komanda1: command not found
komanda 3 izvrsena


Bolje resenje je:
Code:
komanda1 || exit
komanda2 || exit

ili

komanda3 && komanda4 && komanda5
[ anon70939 @ 17.12.2018. 09:24 ] @
Citat:
nkrgovic:
Glavni razlog, bar meni, je sto radi isto bez obzira na ime mrezne karte. Ti potrpas sta ti treba u koju zonu, mrezna karta je po default u svojoj (public) zoni, i ne razmisljas o tome kako se zove interfejs.

Ovo zvuci kao windows firewall :)

Citat:
djoka_l: @CoyoteKG
plus_minus ti je dao dobar savet da uključiš test da li skriptu izvršava root

Da, nisam razmišljao o tome da recimo ako neko drugi hoće da izvši skriptu, da mora da nagađa da li root izvršava ili ne. Dodaću :)
Citat:
djoka_l:
Ono što, po meni najviše nedostaje, je gomila testova koje si preskočio. Meni je bitno da mi skripte budu IDEMPOTENTNE. To znači da ako dva puta pustim istu skriptu, rezultati budu isti.

Recimo želiš da kreiraš fajl /etc/nesto

osnovna stvar je da proveriš da li taj fajl postoji ili ne

if [ ! -e /etc/nesto ]
then
# kreiraj fajl
else
# vec postoji
fi

Ako sam dobro shvatio šta želiš da mi kažeš, ja sam primetio da mi je problem sa ovom skriptom, (baš to što sam napisao u prethodnom postu) što ako mi pukne negde, mogao bih ručno da ispravim, ali mi ništa ne znači što ne mogu opet da pokrenem skriptu jer će sve duplo da mi uradi... Nisam imao baš predstavu kako to da rešim. Ali vidim sad ako krenem sa error handling-om i poštovanjem "idempotntnosti" da će ova skripta da bude kilometarska...

Citat:
djoka_l:
Druga stvar, ne znaš caku za pravljenje fajla (zove se document here)

cat <<OznakaKrajaFajla >nekifajl
\$PATH ima vrednost:
$PATH
OznakaKrajaFajla


Meni je bilo problem da nađem gde je u tvom sktiptu kraj konfiguracionog fajla koji praviš

Ovo nisam uopšte razumeo. Šta znači "kraj konfiguracionog fajla"? Daj neki link pls.

Citat:
djoka_l:
Treće, grozim se činjenice da sed-om menjaš passwd fajl. To meni nije košer, imaš komande usermod ili chsh da promeniš default shell korisniku, umesto da direktno menjaš passwd. Sad, passwd fajl se nije menjao značajno poslednjih 50 godina, ali ja sve jedno ne bih iz skripta menjao sadržaj fajla.

Da, svestan sam ovoga :)
[ Shadowed @ 17.12.2018. 09:28 ] @
@CoyoteKG,
Ne radim kao admin, ali generalno, kada pravis neki proces koji se sastoji iz koraka (sto ovakve skripte jesu), za svaki korak imas dve mogucnosti: da prodje dobro ili, jelde, ne prodje dobro. U prvom slucaju nastavljas dalje. U drugom slucaju, imas cetiri opcije: nastavljas dalje, prekidas dalje izvrsavanje, rollback-ujes (vracas na prethodno stanje) do sada uradjeno, odradis neki skup koraka koji su predvidjeni za taj slucaj. Kad pravis skriptu, razmisljaj za svaki korak koji od ovih scenarija bi trebao da primenis.
Takodje, pozeljno je da skripta bude takva da mozes da je izvrsis vise puta i da sve bude ok bez obzira sto se vec izvrsila potpuno ili delimicno pre toga. Odnosi se na izvrsavanje na istoj masini. Npr. ako trebas da napravis user Pera, proveri pre toga da li vec postoji pa ako se skripta pokrene ponovo, nece biti problema, taj korak ce se preskociti. Naravno, to vazi za neke korake, ne za sve. Ako trebas postaviti korisniku Pera pass na PerinPass ne moras proveravati trenutni pass, samo ga setuj (ali bi valjalo proveriti da li postoji korisnik Pera) itd. itd.
[ djoka_l @ 17.12.2018. 09:38 ] @
Ti si napisao:
Code:

echo "server {

listen 80;
server_name $DOMAIN;

location / {

# Fix the "It appears that your reverse proxy set up is broken" error.
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 90;

proxy_redirect http://127.0.0.1:8080 http://$DOMAIN;

# Required for new HTTP-based CLI
proxy_http_version 1.1;
proxy_request_buffering off;
# workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
add_header X-SSH-Endpoint jenkins.domain.tld:50022 always;
}
}

" > /etc/nginx/sites-available/$DOMAIN.conf


a treba

Code:

cat <<ENDOFCONF > /etc/nginx/sites-available/$DOMAIN.conf
server {

listen 80;
server_name $DOMAIN;

location / {

# Fix the "It appears that your reverse proxy set up is broken" error.
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 90;

proxy_redirect http://127.0.0.1:8080 http://$DOMAIN;

# Required for new HTTP-based CLI
proxy_http_version 1.1;
proxy_request_buffering off;
# workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
add_header X-SSH-Endpoint jenkins.domain.tld:50022 always;
}
}
ENDOFCONF


Ratzlika je u tome što se ovde vidi gde počinje i gde završava fajl koji kreiraš, kao i gde ga upisuješ.
U tvom primeru, tek dvadesetak linija niže vidi se da ispis ide u /etc/nginx/sites-available/$DOMAIN.conf

https://www.tldp.org/LDP/abs/html/here-docs.html
[ nkrgovic @ 17.12.2018. 10:33 ] @
@djoka_l :

Obicno ljudi stave EOF , bas tako, a ne ENDOFCONF - bar ja tako radim, i tako sam vidjao.... :)

@Shadowed:

200% si u pravu, samo to ce vec da potraje dok dodje dotle... i tu bi mu ansible olaksao zivot dosta.
[ anon70939 @ 17.12.2018. 10:42 ] @
aha, to je taj EOF :D
Dok sam guglao kako da najlakse napravim fajl sa više redova, nailazio sam na echo varijantu koju sam upotrebio i EOF. Išao sam linijom manjeg otpora, odnosno ono što mi je već poznato.

iščitao sam sada o heredoc i jasno mi je.
Još samo da vidim kako recimo u nginx.conf mogu da ubacim neke direktive u html {} blok. To sam uradio sa sed -i, ali verovatno da može nekako i sa heredoc

Slobodno me gruvajte ovim informacijama i ukazujte gde gresim. Nisam ja baš mnogo uvredljiv, da jesam ne bih ni pokazivao svoje neznanje i počinjao ovu i mnoge druge teme :)

[ djoka_l @ 17.12.2018. 10:44 ] @
I ja obično stavljam tako nešto, ali ovo je više bio edukativni primer, pa sam hteo da bode oči. Neko bi pomislio da je EOF obavezan terminator, pa sam ga zato izbegao.
Osim toga, ako imaš više takvih konstrukcija u jednom skriptu, ja imam običaj da svaki komad završim drugačijim stringom, čisto da odmah vidim šta je fajl koji kreiram i gde mu je kraj.
[ Panta_ @ 17.12.2018. 11:53 ] @
Citat:
Ali vidim sad ako krenem sa error handling-om i poštovanjem "idempotntnosti" da će ova skripta da bude kilometarska

Umesto:
Code:
if [ ! -e /etc/nesto ]
then
# kreiraj fajl
else
# vec postoji
fi

Moze malo krace:
Code:
[[ ! -e /etc/nesto ]] && kreiraj fajl || vec postoji


Takodje, za bash skript koristi [[ umesto [, na primer da izbegnes razdvajanje reci:
Code:

name="Aleksandar Pantic"

[[ "Aleksandar Pantic" = $name ]] && echo True
True

[ "Aleksandar Pantic" = $name ] && echo True
bash: [: too many arguments

Ako koristis [, promenljivu stavi izmedju navodnika "$name".

Pattern matching (globs, regex):
Code:

# glob matching
filename="myfile.txt"
[[ $filename = *.txt ]] && rm $filename

# regex matching
email="[email protected]"
[[ "$email" =~ [a-z]+@[a-z.]+ ]] && echo True
True
[ plus_minus @ 17.12.2018. 14:06 ] @
Citat:
[[ ! -e /etc/nesto ]] && kreiraj fajl || vec postoji


A zašto u ovom slučaju ne -f modiifer/operator koji jeste zadužen za testiranje fajla .. ?
[ djoka_l @ 17.12.2018. 14:18 ] @
Može da se koristi -a ili -e ili -f
-f je stroži uslov, true daje samo za obične fajlove. Meni je -e prvo palo na pamet zato što me asocira na "exists". Mada, iz pokazanog primera, bilo koji od tri uslova bi bio OK.
[ plus_minus @ 17.12.2018. 14:32 ] @
Običan, neobičan u linuxu mu sve dođe fajl, pa čak i ako je direktorijum. Kako god.

Operator Description
-b file Checks if file is a block special file; if yes, then the condition becomes true.
-c file Checks if file is a character special file; if yes, then the condition becomes true.
-d file Checks if file is a directory; if yes, then the condition becomes true.
-f file Checks if file is an ordinary file as opposed to a directory or special file; if yes, then the condition becomes true.
-g file Checks if file has its set group ID (SGID) bit set; if yes, then the condition becomes true.
-k file Checks if file has its sticky bit set; if yes, then the condition becomes true.
-p file Checks if file is a named pipe; if yes, then the condition becomes true.
-t file Checks if file descriptor is open and associated with a terminal; if yes, then the condition becomes true.
-u file Checks if file has its Set User ID (SUID) bit set; if yes, then the condition becomes true.
-r file Checks if file is readable; if yes, then the condition becomes true.
-w file Checks if file is writable; if yes, then the condition becomes true.
-x file Checks if file is executable; if yes, then the condition becomes true.
-s file Checks if file has size greater than 0; if yes, then condition becomes true.
-e file Checks if file exists; is true even if file is a directory but exists.

Međutim, ako je verovati ovom gore.. sa -e čak i ako je direktorijum (a ne fajl) koji postoji (što njemu može čak i da napravi problem kasnije), slagaće ga.
[ djoka_l @ 17.12.2018. 14:39 ] @
Pa, ako postoji /etc/nesto, makar bilo i direktorijum, simbolički link, blok uređaj, bilo bi jako glupo napraviti fajl koji će se isto zvati.
Zato sam i stavio -e.

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
[ plus_minus @ 17.12.2018. 14:42 ] @
A ako nije u /etc nego negde u ~ ... pa onda neko drugi slučajno napravi prazan direktorijum i taj isti konta da ustvari napravio fajl bez ekstenzije ?
[ djoka_l @ 17.12.2018. 14:46 ] @
A šta ako nestane struje i...

Dao sam kao primer jednostavan test. Treba napraviti fajl. Proveriti da li fajl već postoji. Ako ne postoji, napravi ga. Ako postoji - reši situaciju, ako treba radi dalje testove.
[ anon70939 @ 21.12.2018. 14:23 ] @
Krenuo sam da popravljam skriptu da vezbam malo, i zakucao sam kod sledećeg problema.

Hoću da prilikom startovanja nginx servisa dobijem info da li je startovan ili nije. $? čak i ako ga ne startuje komandu systemctl start nginx vraća kao status 0.

Pa sam napisao mali deo, ali ne znam kako da se vratim na početak petlje. U batch koliko se sećam postoji goto komanda, ali guglam i nista slicno za bash ne postoji :/
Jedino uz pomoc nekih funkcija, ali to mi je vec next level :)


systemctl is-active --quiet nginx

if [ $? == 0 ]; then
echo ""
echo "Apache service is up and running"
echo ""
else
echo ""
echo "* [ERROR] Apache service did not started successfully"
echo "Do you want to continue with script? Chose y or n:"
read -n1 status
if [ "$status" == "n" ]; then
exit 1
elif [ "$status" == "y" ]; then
echo ""
else
echo "Wrong parameter, please type y or n:"
fi
fi



edit, mozda moze moderator da promeni naziv teme u bash scripting basics ili kako vec...


edit2

Vidim da postoji i ovaj način, što je nekako lepši na oko, ali i dalje ne shvatam kako da umesto da mi ispiše invalid da me pita ponovo da izaberem
read -n1 status


case "$status" in
n|N ) exit 1;;
y|Y ) echo "";;
* ) echo "invalid";;
esac


[Ovu poruku je menjao CoyoteKG dana 21.12.2018. u 16:12 GMT+1]
[ Zlatni_bg @ 21.12.2018. 15:34 ] @
Cemu --quiet parametar? Sto jednostavno ne ides "systemctl is-active httpd" i to citas kao parametar?

edit: nginx, ali ista stvar je u pitanju
[ plus_minus @ 21.12.2018. 15:44 ] @
Citat:
Hoću da prilikom startovanja nginx servisa dobijem info da li je startovan ili nije

To odmah vežeš za proces i znaš kasnije ili ubijaš na silu, na zahtev.
Code (bash):

local status
local process=$(ps aux | grep "[p]hp -S ${host}:${port}" | awk '{print $2}')

if [[ $process != '' ]]
    then status=1
  else
    status=0
  fi

 


Ovo gore je (moj radni primer) izvučeno iz funkcije za php embeded-server kontrolu, a ti prilagodi grep, makni host i port, kako god.
"[p]hp -S .. " a ne "php -S .. " jeste zato jer se računa i sami grep value kao result-hit, tako da se uvek dobije jedna linija.
[ Panta_ @ 21.12.2018. 15:49 ] @
Citat:
kako da umesto da mi ispiše invalid da me pita ponovo da izaberem read -n1 status

Koristi while petlju, na primer:
Code:
while true
do
    echo "Do you want to continue with script? Chose y or n:"
    read -n1 status
    case $status in
        n|N ) exit 1;;
        y|Y ) echo "";;
        * ) echo "invalid";;
    esac
done


Citat:
Hoću da prilikom startovanja nginx servisa dobijem info da li je startovan ili nije

Code:
[[ -e /var/run/nginx.pid ]] && echo "nginx service is running"
[ anon70939 @ 21.12.2018. 15:55 ] @
Citat:
Zlatni_bg:
Cemu --quiet parametar? Sto jednostavno ne ides "systemctl is-active httpd" i to citas kao parametar?

edit: nginx, ali ista stvar je u pitanju

Ne utiče to baš na moj problem.
Lakše mi bilo da dobijem 0 nego active/inactive

Citat:
plus_minus: To odmah vežeš za proces i znaš kasnije ili ubijaš na silu, na zahtev.

Video sam i ovaj primer, ali mi je nekako za moj slucaj manje pisanja bilo ovaj nacin jer meni je samo potrebno da se nastavi sa izvrsavanjem ili ne u slucaju da zbog nekog problema nginx nije uspeo da se startuje.


probacu sa while, mada mi u ovom momentu ovako laicki nije jasno jer sva ova 3 cases su verovatno true. Meni treba ako je user greskom uneo neki karakter umesto n,N,y,Y da ga pita ponovo
[ Panta_ @ 21.12.2018. 16:15 ] @
Citat:
Meni treba ako je user greskom uneo neki karakter umesto n,N,y,Y da ga pita ponovo

Da pitace ga ponovo sve dok ne izabere n. Treba ti uslov za while koji je u gornjem primeru uvek true, za tvoj skript uslov moze da bude sve dok nginx nje pokrenut, na primer:
Code:
while ! [[ -e /var/run/nginx.pid ]]; do ...

ili sa until:
Code:
until [[ -e /var/run/sshd.pid ]]; do ...
[ Panta_ @ 21.12.2018. 17:01 ] @
Citat:
ps aux | grep "[p]hp -S ${host}:${port}" | awk '{print $2}'

Tri nova procesa da se samo proveri da li je neki proces pokrenut? Zar nije jednostavnije samo sa pgrep, pidof, ps -C ime_procesa?
[ anon70939 @ 21.12.2018. 17:49 ] @
nisam objasnio dobro. Ne zelim ja da uslov stoji dok nginx nije pokrenut, jer mozda se desilo da se zbog neke greske, recimo u nekom conf fajlu, nije podigao nginx.
I onda samo zelim da ponudim da onaj ko je pokrenuo skriptu
1. prekine ostatak skripte (one sa pocetka teme)
2. da nastavi dalje sa izvrsavanjem skripte
3. da ukoliko nije izabrao greskom y ili n, da ga pita ponovo.

Ali while mi je pomoglo pa sam iskombinovao i napravio ovakvu skriptu koja mi radi posao


#!/bin/bash

systemctl is-active --quiet nginx
if [ $? == 0 ]; then
echo "nginx service is up and running"
else
echo "* [ERROR] Apache service did not started successfully"
echo "Do you want to continue with script? Type Y or N"

while true; do
read -r -p "[Y/N]: " status
case $status in
[nN]) exit 1 ;;
[yY]) break ;;
esac
done
fi

echo "idemo dalje sa skriptom"


Svidja mi se ovo tvoje [[-e /var/run/nginx.pid]]. Najefikasnije :)
[ anon70939 @ 25.12.2018. 08:51 ] @
Citat:
nkrgovic:
Code:
 chcon -Rt httpd_sys_content_t /var/www/

Ovo ce ti se pokarabasiti vremenom. Probaj sa
Code:
semanage fcontext -a -t httpd_sys_content_t "/var/www(/.*)?"

pa onda samo restorecon.

Sad je jasno.
chcon nije trajno rešenje, i nekad u budućnosti kad bih koristio semanage i okinuo restorecon posle toga, to što sam setovao bi bilo prepisano prethodnim vrednostima iz /etc/selinux/targeted/contexts/files/file_contexts.local

Evo zapisano ako nekom zatrebaju baš osnove.

https://www.digitalocean.com/c...centos-7-part-1-basic-concepts
https://www.digitalocean.com/c...s-7-part-2-files-and-processes
https://www.digitalocean.com/c...linux-on-centos-7-part-3-users



A skriptu sam skoro pa završio. Nisam imam baš vremena ovih dana, pa ću večeras da je okačim da vidimo da li je sad kako treba ili moze bolje :)

[Ovu poruku je menjao CoyoteKG dana 25.12.2018. u 10:21 GMT+1]
[ anon70939 @ 26.12.2018. 00:08 ] @
Evo skoro završio skriptu. Ostalo samo još da napravim rulove i error handling za firewalld i selinux
Je l' ovo ono kako skripta treba da izgleda? Doduše pronašao sam 2 greške.

Code (bash):
#! /bin/bash
# This script will install Jenkins on CentOS 7 minimal ISO

PASSWORD="nekipass"
DOMAIN="jenkins.domain.cc"

jenkinsrepo="http://pkg.jenkins-ci.org/redhat/jenkins.repo"
jenkinskey="https://jenkins-ci.org/redhat/jenkins-ci.org.key"

vhost=$(cat <<EOF
server {

listen 80;
server_name $DOMAIN;

        location / {

          proxy_set_header        Host \$host:\$server_port;
          proxy_set_header        X-Real-IP \$remote_addr;
          proxy_set_header        X-Forwarded-For \$proxy_add_x_forwarded_for;
          proxy_set_header        X-Forwarded-Proto \$scheme;

                # Fix the "It appears that your reverse proxy set up is broken" error.
                proxy_pass          http://127.0.0.1:8080;
                proxy_read_timeout  90;

                proxy_redirect      http://127.0.0.1:8080 http://$DOMAIN;

                # Required for new HTTP-based CLI
                proxy_http_version 1.1;
                proxy_request_buffering off;
                # workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
                add_header X-SSH-Endpoint jenkins.domain.tld:50022 always;
        }
}
EOF

)


# User with root privileges is required
if [ "$EUID" -ne 0 ]
then
    echo "* [ERROR] Run this script under 'sudo -s' or as root"
    exit 1
fi


# installing useful tools
yum -y install vim net-tools wget telnet


# install nginx and create vhost
yum -y install epel-release
yum -y install nginx

if [ ! -d "/etc/nginx/sites-available"  ]; then
        mkdir /etc/nginx/sites-available
else
        echo "directory /etc/nginx/sites-available already exist"
fi

if [ ! -d "/etc/nginx/sites-enabled"  ]; then
        mkdir /etc/nginx/sites-enabled
else
        echo "directory /etc/nginx/sites-enabled already exist"
fi

if [[ ! -e /etc/nginx/sites-available/$DOMAIN.conf ]]; then
     echo "${vhost}" > /etc/nginx/sites-available/$DOMAIN.conf
else

echo "$DOMAIN.conf already exist"
echo "Do you want to overwrite .conf file?"
while true; do
read -r -p "[Y/N]: " overwrite
case $overwrite in
[nN]) break ;;
[yY]) echo "${vhost}" > /etc/nginx/sites-available/$DOMAIN.conf
break;;
esac
done
fi

incld=`grep -r "include \/etc\/nginx\/sites-enabled\/\*.conf;" /etc/nginx/nginx.conf | wc -l`
if [[ $incld  == 0 ]]; then
sed -i '/http {/a include /etc/nginx/sites-enabled/*.conf;' /etc/nginx/nginx.conf
else
echo "this line is included in conf file"
fi

bcktsize=`grep -r "#server_names_hash_bucket_size 64;" /etc/nginx/nginx.conf | wc -l`
if [[ $bcktsize  == 0 ]]; then
sed -i '/http {/a #server_names_hash_bucket_size 64;' /etc/nginx/nginx.conf
else
echo "this line is included in conf file"
fi

if [[ ! -L "/etc/nginx/sites-enabled/$DOMAIN.conf" ]]; then
ln -s /etc/nginx/sites-available/$DOMAIN.conf /etc/nginx/sites-enabled/$DOMAIN.conf
else
echo "symlink elready exist"
echo "Do you want to overwrite symlink?"

while true; do
        read -r -p "[Y/N]: " status
        case $status in
                [nN]) break ;;
                [yY]) ln -s /etc/nginx/sites-available/$DOMAIN.conf /etc/nginx/sites-enabled/$DOMAIN.conf ;;
        esac
done
fi

systemctl enable nginx
systemctl start nginx
systemctl is-active --quiet nginx
if [ $? == 0 ]; then
        echo "nginx service is up and running"
else
        echo "* [ERROR] nxinx service did not started successfully"
        echo ""
        tail /var/log/nginx/error.log
        echo ""
        echo "Do you want to continue with script, and later fix nginx issues?"

while true; do
        read -r -p "[Y/N]: " status
        case $status in
                [nN]) exit 1 ;;
                [yY]) break ;;
        esac
done
fi


# Install Java and Jenkins
if [[ `whereis jenkins | wc -l` == 0 ]]; then
        httpcoderepo=`curl --write-out %{http_code} --silent --output /dev/null $jenkinsrepo`
        httpcodekey=`curl --write-out %{http_code} --silent --output /dev/null $jenkinskey`
        if ([ $httpcoderepo ==  200 ] || [ $httpcoderepo ==  301 ]) && ([ $httpcodekey ==  200 ] || [ $httpcodekey ==  301 ]); then
                echo "Starting with Jenkins installation"
        else
                echo "[ERROR] repo links are outdated"
                echo "Please check https://wiki.jenkins.io/displa...nkins+on+Red+Hat+distributions"
                echo "and update links at the begining of this script."
                echo ""
                echo "Do you want to continue with script, and later fix outdated links?"
        while true; do
                read -r -p "[Y/N]: " status
                case $status in
                        [nN]) exit 1 ;;
                        [yY]) break ;;
                esac
        done
        fi
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum -y install jenkins java
else
        echo "Jenkins is already installed"
fi

systemctl enable jenkins
systemctl start jenkins
systemctl is-active --quiet nginx
if [ $? == 0 ]; then
        echo "jenkins is up and running"
else
        echo "* [ERROR] jenkins service did not started successfully"
        echo ""
        tail /var/log/jenkins/jenkins.log
        echo ""
        echo "Do you want to continue with script, and later fix jenkins issues?"
while true; do
        read -r -p "[Y/N]: " status
        case $status in
                [nN]) exit 1 ;;
                [yY]) break ;;
        esac
done
fi

# Setup firewall rules
systemctl stop firewalld
systemctl disable firewalld

#set selinux
yum install -y setroubleshoot-server selinux-policy-devel
semanage port -m -t http_port_t -p tcp 8080
systemctl restart nginx jenkins

# enable jenkins user to login to ssh and create keys
essstatus=`passwd --status jenkins | awk '{print $2}'`
if [[ $passstatus == "P" ]] || [[ $passstatus == "PS" ]]; then
        echo "password for username jenkins is already set. Do you want to reset it?"
        while true; do
                read -r -p "[Y/N]: " passyesno
                case $passyesno in
                [yY])
                echo -e "$PASSWORD\n$PASSWORD" | passwd jenkins
                break;;
                [nN]) break ;;
                esac
        done
else
echo -e "$PASSWORD\n$PASSWORD" | passwd jenkins
fi

usermod -s /bin/bash jenkins

if [[ ! -e /var/lib/.ssh/id_rsa ]]; then
        mkdir /var/lib/jenkins/.ssh
        ssh-keygen -f /var/lib/jenkins/.ssh/id_rsa -t rsa -N ''
        cat /var/lib/jenkins/.ssh/id_rsa.pub >> /var/lib/jenkins/.ssh/authorized_keys
        chown -R jenkins /var/lib/jenkins/.ssh/
else
        echo "file /var/lib/.ssh/id_rsa already exist"
        echo "do you want to overwrite it? Be carefull, because existing key if is in a function will be overwriten"
        while true; do
                read -r -p "[Y/N]: " status
                case $status in
                [nN]) break ;;
                [yY])
                mkdir /var/lib/jenkins/.ssh
                ssh-keygen -f /var/lib/jenkins/.ssh/id_rsa -t rsa -N ''
                cat /var/lib/jenkins/.ssh/id_rsa.pub >> /var/lib/jenkins/.ssh/authorized_keys
                chown -R jenkins /var/lib/jenkins/.ssh/
                ;;
                esac
        done
fi


hst=`grep -r "Host *" /var/lib/jenkins/.ssh/config | wc -l`
keychk=`grep -r "StrictHostKeyChecking=no" /var/lib/jenkins/.ssh/config | wc -l`
if ([ $hst  == 0 ] &&  [ $keychk  == 0 ]) || [ ! -f  /var/lib/jenkins/.ssh/config ]; then
echo -e 'Host *\nStrictHostKeyChecking=no' >> /var/lib/jenkins/.ssh/config
else
echo "this line is included in config file"
fi
 
[ Panta_ @ 26.12.2018. 09:23 ] @
Citat:
Je l' ovo ono kako skripta treba da izgleda?

Ako radi ono za šta je namenjena, uvek kasnije možeš da je doradiš. Na primer, da `command` zameniš sa $(command) kao na početku skripta.
http://mywiki.wooledge.org/BashFAQ/082
Da proveru da li je skript pokrenut sa root privilegijama izvršiš na početku skripta.
Da proveriš da li je nešto već instalirano pre nego što ga instaliraš, na primer: command -v wget >/dev/null || yum -y install wget.
Da je učiniš portabilnom, tj. da ti pored CentOSa služi i za instalaciju na drugim dristribucijama, npr. Ubuntu, Debian i ostale DEB based:
Code:
if command -v yum >/dev/null; then
    command=yum
elif command -v apt >/dev/null; then
    command=apt
fi

Naravno, zameniš repoe i ključeve u zavisnosti od distribucije, npr. declare -A repos=(["centos"]=cent-os-repo ["ubuntu"]=ubuntu-repo), itd.. Ovo je samo primer, mada mislim da nisu potrebne neke veće izmene.
[ Shadowed @ 26.12.2018. 09:32 ] @
#offtopic

Pocecemo uskoro da srecemo CoyoteKG na programerskim forumima, vidim ja :)
[ anon70939 @ 26.12.2018. 09:45 ] @
Super onda... zadovoljan sam :)

Samo još da skontam te kraće načine if petlji koje ti iz par navrata si mi dao primere ovde u temi.

Počeo sam i sa ovim kursem
https://linuxacademy.com/linux...ators-guidep-to-bash-scripting

^
Pa sigurno u Python delu foruma, samo da dodje na red :)


Code (bash):
# enable jenkins user to login to ssh and create keys
essstatus=`passwd --status jenkins | awk '{print $2}'`
if [[ $passstatus == "P" ]] || [[ $passstatus == "PS" ]]; then
        echo "password for username jenkins is already set. Do you want to reset it?"
        while true; do
                read -r -p "[Y/N]: " passyesno
                case $passyesno in
                [yY])
                echo -e "$PASSWORD\n$PASSWORD" | passwd jenkins
                break;;
                [nN]) break ;;
                esac
        done
else
echo -e "$PASSWORD\n$PASSWORD" | passwd jenkins
fi

Jedan od problema koji imam je u ovom primeru.
Buni me while petlja. Kad izaberem Y, i okine se ova komanda, ne završi se petlja nego me ponovo pita. Pa sam rešio tako što sam posle komande stavio break.
Što me zeza na ovom mestu, a kod nekih drugih primera ne?
[ Shadowed @ 26.12.2018. 10:25 ] @
Imas while true. Umesto tog "true" stavi uslov pod kojim hoces da vrti petlju. Kad uslov nije ispunjen, vise nece prolaziti. U ovom slucaju ti je uslov nesto tipa kad @passyesno nije y, Y, n ili N, kako god se to u bash sintaksi pisalo :)
U trenutnom stanju, vrti unedogled jer je true uvek tacno :)
[ Panta_ @ 26.12.2018. 10:30 ] @
while true se izvršava neograničeno (infinite loop), iz razloga zato što nema uslova koji bi prekinuo izvršavanje, dok break prekida izvršavanje i izlazi iz petlji.
[ anon70939 @ 26.12.2018. 10:36 ] @
Jasno. Znaci treba da stavim while $passyesno == yYnN?
Samo da nadjem kako da napisem to.

mozda nesto kao $passyesno == y || Y || n || N
[ Shadowed @ 26.12.2018. 10:41 ] @
Ne bih rekao da je nesto od toga em sintaksno, em zato sto hoces da vrti dok nije nesto od tih slova. Pre ce biti not @passyesno in [yYnN] ili tako nesto.
[ djoka_l @ 26.12.2018. 10:43 ] @
Sve je bolje. Ali još nema funkcija:

evo jednog malog primera. Prouči program, onda ga modifikuj tako da funkcija YesNo dobije još jedan parametar, komandu koju treba da izvrši ako je odgovor potvrdan, na primer

YesNo -c "ls -al"

Code:
#!/bin/bash
#
# Primer korišćenja funkcija u bash
# djoka_l za elitesecurity
#
# 2018-12-26

# Keyword function je opcioni

function YesNo () {

# definišem lokalne varijable da se ne bi preklopile sa nekom varijablom u ostatku skripta
local prompt=""
local defY="[Y/n]"
local defN="[y/N]"
local defAns=$defY
local default=0

# ovako se procesiraju ulazni parametri funkcije. Oni su $1, $2, ... $n
while [ -n "$1" ]
do
   case $1 in
      -p) shift                 # shift pomera parametre, tako da drugi postane prvi itd.
          prompt=$1 ;;
      -y) default=0
          defAns=$defY;;
      -n) default=1
          defAns=$defN ;;
   esac
   shift
done

read -r -p "$prompt $defAns : " status
  case $status in
     [nN]) return 1 ;;
     [yY]) return 0 ;;
        *) return $default ;;
  esac

}

YesNo && echo DA
YesNo -n || echo NE
YesNo -p "Da li je duže ili zelenije?" && echo confused || echo even more confused
[ anon70939 @ 26.12.2018. 10:44 ] @
ne znam sintaksu, sad cu da probam.

U principu, poenta je ako neko izabere nesto bilo sta drugo osim tih karaktera, da ponovo vrti.
Sto se da.... sad vidim, svodi na to sto si ti napisao :D
[ Zlatni_bg @ 26.12.2018. 15:23 ] @
Pomagajuci nekome sa vise elektrotehnicke danas za neki kolokvijum, dosao sam do njihovog PDF materijala. Bukvalno su samo ciste osnove sh/bash skriptinga. Okacicu PDF, nesto je sto se sazvace za sat vremena, al' neka stoji. Na srpskom je i osnove su u pitanju.
[ Panta_ @ 26.12.2018. 17:37 ] @
Evo nešto za malo duže žvakanje: Bash | Python
[ Zlatni_bg @ 26.12.2018. 18:04 ] @
U lepo. Svaka cast za materijal.
[ anon70939 @ 26.12.2018. 20:31 ] @
@djoka, sad su na redu funkcije hvala.

A sad imam i materijala, samo jos da procitam :D