Manage multiple server & client computers with SaltStack (finnish)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

836 lines
27 KiB

  1. Palvelinten hallinta - Harjoitus 3
  2. ==============
  3. *Disclaimer:*
  4. --------------
  5. Tämä harjoitus on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia [Palvelinten hallinta (ICT4TN022, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN022). Kurssin pitäjänä toimii [Tero Karvinen](http://terokarvinen.com/), joka on määritellyt tämän harjoituksen tehtävänkuvaukset. Tehtävien vastaukset ovat Pekka Heleniuksen (allekirjoittanut) tuottamia.
  6. *SISÄLLYSLUETTELO*
  7. --------------
  8. - [b) Tiedosto muotista: tee yksinkertainen SLS-tilatiedosto, joka laittaa muuttujan tiedostoon. Käytä jinjan kontekstimuuttujaa (template: jinja, context: ...)](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md#b-tiedosto-muotista-tee-yksinkertainen-sls-tilatiedosto-joka-laittaa-muuttujan-tiedostoon-k%C3%A4yt%C3%A4-jinjan-kontekstimuuttujaa-template-jinja-context-)
  9. - [c) SLS tilaa Jinjalla: tee yksinkertainen SLS-tilatiedosto, joka käyttää for-in -silmukaa. Voit esimerkiksi tehdä kolme tiedostoa silmukalla. (Tässä tehtävässä siis käytetään jinjaa vain SLS-tiedoston sisällä, älä sotke samaan esimerkkiin tekstitiedostojen sisällön muuttamista.)](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md#c-sls-tilaa-jinjalla-tee-yksinkertainen-sls-tilatiedosto-joka-k%C3%A4ytt%C3%A4%C3%A4-for-in--silmukaa-voit-esimerkiksi-tehd%C3%A4-kolme-tiedostoa-silmukalla-t%C3%A4ss%C3%A4-teht%C3%A4v%C3%A4ss%C3%A4-siis-k%C3%A4ytet%C3%A4%C3%A4n-jinjaa-vain-sls-tiedoston-sis%C3%A4ll%C3%A4-%C3%A4l%C3%A4-sotke-samaan-esimerkkiin-tekstitiedostojen-sis%C3%A4ll%C3%B6n-muuttamista)
  10. - [d) SSH-demonin portti: tee tila, joka asentaa SSH-demonin valittuun porttiin. Käytä portin valintaan Jinjaa, siten että sshd_config:issa “Port:”-kohdan arvo tulee Jinjan muuttujasta.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md#d-ssh-demonin-portti-tee-tila-joka-asentaa-ssh-demonin-valittuun-porttiin-k%C3%A4yt%C3%A4-portin-valintaan-jinjaa-siten-ett%C3%A4-sshd_configissa-port-kohdan-arvo-tulee-jinjan-muuttujasta)
  11. - [e) Kokeile jonkun toisen opiskelijan tekemää Salt-tilaa. Kokeiltava tila voi olla mistä vain harjoituksesta. Opiskelijoiden raportteja ja koodeja löydät tämän sivun perästä kommenteista.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md#e-kokeile-jonkun-toisen-opiskelijan-tekem%C3%A4%C3%A4-salt-tilaa-kokeiltava-tila-voi-olla-mist%C3%A4-vain-harjoituksesta-opiskelijoiden-raportteja-ja-koodeja-l%C3%B6yd%C3%A4t-t%C3%A4m%C3%A4n-sivun-per%C3%A4st%C3%A4-kommenteista)
  12. **b)** Tiedosto muotista: tee yksinkertainen SLS-tilatiedosto, joka laittaa muuttujan tiedostoon. Käytä jinjan kontekstimuuttujaa (template: jinja, context: ...).
  13. --------------
  14. **Vastaus:**
  15. Luodaan tiedosto _/srv/salt/firstninja.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/firstninja.sls):
  16. (Tehtävänannon vaatimus täyttyy state:ssa _put_my_foo_stuff_)
  17. ```
  18. # Author: Pekka Helenius (~Fincer), 2018
  19. hostile_secondgroup:
  20. group.present:
  21. - name: foobar
  22. - gid: 666
  23. - system: True
  24. hostile_user:
  25. user.present:
  26. - name: evilninja
  27. - fullname: Evil Ninja
  28. - uid: 666
  29. - gid: 666
  30. - shell: /bin/bash
  31. - home: /home/foo
  32. - groups:
  33. - foobar
  34. - require:
  35. - group: hostile_secondgroup
  36. put_my_foo_stuff:
  37. file.managed:
  38. - name: /foo/mysecretfoo
  39. - source: salt://foofile
  40. - makedirs: True
  41. - user: 666
  42. - group: 666
  43. - mode: 0744
  44. - template: jinja
  45. - context:
  46. supersecretfoo: 'you never know where this came from'
  47. notsosecretbar: 'wanna beer?'
  48. - require:
  49. - user: hostile_user
  50. foo_executable:
  51. file.symlink:
  52. - name: /usr/local/bin/mysecretfoo
  53. - target: /foo/mysecretfoo
  54. - require:
  55. - file: put_my_foo_stuff
  56. evil_nullfiles:
  57. cmd.run:
  58. - name: 'touch ./foo_everywhere'
  59. - cwd: /foo
  60. - creates: foo_everywhere
  61. - creates: foofoo
  62. - require:
  63. - file: put_my_foo_stuff
  64. identity_crisis:
  65. cmd.run:
  66. - name: /usr/bin/id -a
  67. - runas: evilninja
  68. - require:
  69. - user: hostile_user
  70. haha_execute:
  71. cmd.run:
  72. - shell: /bin/sh
  73. - name: mysecretfoo
  74. - require:
  75. - user: hostile_user
  76. - file: foo_executable
  77. ```
  78. Lisätään masterille tiedosto _/srv/salt/foofile_ seuraavalla sisällöllä (sudo nano /srv/salt/foofile):
  79. ```
  80. #!/bin/sh
  81. echo -e "{{ supersecretfoo }}\n{{ notsosecretbar }}"
  82. ```
  83. Tämä tiedosto kirjoitetaan minionin/minioneiden kohteeseen _/foo/mysecretfoo_ ja luodaan symbolinen linkki _/usr/local/bin/mysecretfoo_.
  84. Testataan toimivuus harjoituksessa 1 ja 2 käytetyllä master-minion -tietokonekokoonpanolla (master: master, minion: orjakone):
  85. ```
  86. sudo salt 'orjakone' state.apply firstninja
  87. ```
  88. Masterilla tulostettu output:
  89. ```
  90. orjakone:
  91. ----------
  92. ID: hostile_secondgroup
  93. Function: group.present
  94. Name: foobar
  95. Result: True
  96. Comment: Group foobar is present and up to date
  97. Started: 21:52:22.010941
  98. Duration: 1.317 ms
  99. Changes:
  100. ----------
  101. ID: hostile_user
  102. Function: user.present
  103. Name: evilninja
  104. Result: True
  105. Comment: User evilninja is present and up to date
  106. Started: 21:52:22.012741
  107. Duration: 13.69 ms
  108. Changes:
  109. ----------
  110. ID: put_my_foo_stuff
  111. Function: file.managed
  112. Name: /foo/mysecretfoo
  113. Result: True
  114. Comment: File /foo/mysecretfoo is in the correct state
  115. Started: 21:52:22.027375
  116. Duration: 10.438 ms
  117. Changes:
  118. ----------
  119. ID: foo_executable
  120. Function: file.symlink
  121. Name: /usr/local/bin/mysecretfoo
  122. Result: True
  123. Comment: Created new symlink /usr/local/bin/mysecretfoo -> /foo/mysecretfoo
  124. Started: 21:52:22.038030
  125. Duration: 26.087 ms
  126. Changes:
  127. ----------
  128. new:
  129. /usr/local/bin/mysecretfoo
  130. ----------
  131. ID: evil_nullfiles
  132. Function: cmd.run
  133. Name: touch ./foo_everywhere
  134. Result: True
  135. Comment: Command "touch ./foo_everywhere" run
  136. Started: 21:52:22.066037
  137. Duration: 8.669 ms
  138. Changes:
  139. ----------
  140. pid:
  141. 3426
  142. retcode:
  143. 0
  144. stderr:
  145. stdout:
  146. ----------
  147. ID: identity_crisis
  148. Function: cmd.run
  149. Name: /usr/bin/id -a
  150. Result: True
  151. Comment: Command "/usr/bin/id -a" run
  152. Started: 21:52:22.074865
  153. Duration: 158.997 ms
  154. Changes:
  155. ----------
  156. pid:
  157. 3450
  158. retcode:
  159. 0
  160. stderr:
  161. stdout:
  162. uid=666(evilninja) gid=666(foobar) groups=666(foobar)
  163. ----------
  164. ID: haha_execute
  165. Function: cmd.run
  166. Name: mysecretfoo
  167. Result: True
  168. Comment: Command "mysecretfoo" run
  169. Started: 21:52:22.234242
  170. Duration: 14.473 ms
  171. Changes:
  172. ----------
  173. pid:
  174. 3455
  175. retcode:
  176. 0
  177. stderr:
  178. stdout:
  179. -e you never know where this came from
  180. wanna beer?
  181. Summary for orjakone
  182. ------------
  183. Succeeded: 7 (changed=4)
  184. Failed: 0
  185. ------------
  186. Total states run: 7
  187. Total run time: 233.671 ms
  188. ```
  189. **c)** SLS tilaa Jinjalla: tee yksinkertainen SLS-tilatiedosto, joka käyttää for-in -silmukaa. Voit esimerkiksi tehdä kolme tiedostoa silmukalla. (Tässä tehtävässä siis käytetään jinjaa vain SLS-tiedoston sisällä, älä sotke samaan esimerkkiin tekstitiedostojen sisällön muuttamista.)
  190. --------------
  191. **Vastaus:**
  192. Luodaan master:lle tiedosto _/srv/salt/first_jinjaloop.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/first_jinjaloop.sls):
  193. ```
  194. # Author: Pekka Helenius (~Fincer), 2018
  195. {% for loplop in ['round_1', 'round_2', 'round_3', 'round_4'] %}
  196. loopsloops_noops{{ loop.index }}:
  197. file.managed:
  198. - name: /tmp/loopnoops/{{ loplop }}
  199. - source: salt://loops/jinjaninja_loop
  200. - makedirs: True
  201. - template: jinja
  202. - context:
  203. filenumber: {{ loplop }}
  204. run_fatboy_run_{{ loop.index }}:
  205. cmd.run:
  206. - name: cat /tmp/loopnoops/{{ loplop }}
  207. - require:
  208. - file: loopsloops_noops{{ loop.index }}
  209. {% endfor %}
  210. ```
  211. Luodaan masterilla tiedosto */srv/salt/loops/jinjaninja_loop*:
  212. ```
  213. sudo mkdir -p /srv/salt/loops
  214. echo "Loops loops noops {{ filenumber }}" | sudo tee /srv/salt/loops/jinjaninja_loop
  215. ```
  216. Ajetaan luotu state-tiedosto masterilta orjakone-minionille:
  217. ```
  218. sudo salt 'orjakone' state.apply first_jinjaloop
  219. ```
  220. Masterilta saatu output:
  221. ```
  222. orjakone:
  223. ----------
  224. ID: loopsloops_noops1
  225. Function: file.managed
  226. Name: /tmp/loopnoops/round_1
  227. Result: True
  228. Comment: File /tmp/loopnoops/round_1 updated
  229. Started: 22:15:48.402678
  230. Duration: 22.99 ms
  231. Changes:
  232. ----------
  233. diff:
  234. New file
  235. mode:
  236. 0644
  237. ----------
  238. ID: run_fatboy_run_1
  239. Function: cmd.run
  240. Name: cat /tmp/loopnoops/round_1
  241. Result: True
  242. Comment: Command "cat /tmp/loopnoops/round_1" run
  243. Started: 22:15:48.426279
  244. Duration: 9.155 ms
  245. Changes:
  246. ----------
  247. pid:
  248. 3654
  249. retcode:
  250. 0
  251. stderr:
  252. stdout:
  253. Loops loops noops round_1
  254. ----------
  255. ID: loopsloops_noops2
  256. Function: file.managed
  257. Name: /tmp/loopnoops/round_2
  258. Result: True
  259. Comment: File /tmp/loopnoops/round_2 updated
  260. Started: 22:15:48.435550
  261. Duration: 18.288 ms
  262. Changes:
  263. ----------
  264. diff:
  265. New file
  266. mode:
  267. 0644
  268. ----------
  269. ID: run_fatboy_run_2
  270. Function: cmd.run
  271. Name: cat /tmp/loopnoops/round_2
  272. Result: True
  273. Comment: Command "cat /tmp/loopnoops/round_2" run
  274. Started: 22:15:48.454122
  275. Duration: 5.179 ms
  276. Changes:
  277. ----------
  278. pid:
  279. 3656
  280. retcode:
  281. 0
  282. stderr:
  283. stdout:
  284. Loops loops noops round_2
  285. ----------
  286. ID: loopsloops_noops3
  287. Function: file.managed
  288. Name: /tmp/loopnoops/round_3
  289. Result: True
  290. Comment: File /tmp/loopnoops/round_3 updated
  291. Started: 22:15:48.459403
  292. Duration: 19.723 ms
  293. Changes:
  294. ----------
  295. diff:
  296. New file
  297. mode:
  298. 0644
  299. ----------
  300. ID: run_fatboy_run_3
  301. Function: cmd.run
  302. Name: cat /tmp/loopnoops/round_3
  303. Result: True
  304. Comment: Command "cat /tmp/loopnoops/round_3" run
  305. Started: 22:15:48.479414
  306. Duration: 6.602 ms
  307. Changes:
  308. ----------
  309. pid:
  310. 3658
  311. retcode:
  312. 0
  313. stderr:
  314. stdout:
  315. Loops loops noops round_3
  316. ----------
  317. ID: loopsloops_noops4
  318. Function: file.managed
  319. Name: /tmp/loopnoops/round_4
  320. Result: True
  321. Comment: File /tmp/loopnoops/round_4 updated
  322. Started: 22:15:48.486128
  323. Duration: 18.883 ms
  324. Changes:
  325. ----------
  326. diff:
  327. New file
  328. mode:
  329. 0644
  330. ----------
  331. ID: run_fatboy_run_4
  332. Function: cmd.run
  333. Name: cat /tmp/loopnoops/round_4
  334. Result: True
  335. Comment: Command "cat /tmp/loopnoops/round_4" run
  336. Started: 22:15:48.505300
  337. Duration: 9.609 ms
  338. Changes:
  339. ----------
  340. pid:
  341. 3660
  342. retcode:
  343. 0
  344. stderr:
  345. stdout:
  346. Loops loops noops round_4
  347. Summary for orjakone
  348. ------------
  349. Succeeded: 8 (changed=8)
  350. Failed: 0
  351. ------------
  352. Total states run: 8
  353. Total run time: 110.429 ms
  354. ```
  355. **d)** SSH-demonin portti: tee tila, joka asentaa SSH-demonin valittuun porttiin. Käytä portin valintaan Jinjaa, siten että sshd_config:issa “Port:”-kohdan arvo tulee Jinjan muuttujasta.
  356. --------------
  357. **Vastaus:**
  358. **HUOM!** Koska tehtävänannossa ei pyydetty käyttämään master-koneella sijaitsevaa esimääritettyä SSHD:n konfiguraatiotiedostoa ja pyydettiin vaihtamaan pelkkä SSHD:n yhteysportti minionille/minioneille, on SLS-tiedosto rakennettu tämän esivaatimuksen pohjalta. Yleisesti voidaan haluta samat asetukset kaikille minioneille, jolloin tulee käyttää esimääritettyä SSHD:n konfiguraatiotiedostoa, joka korvaa minionilla/minioneilla olevan tiedoston.
  359. Halusin kokeilla jinja:lla lukujen generointia tässä tehtävässä. Olisi voitu toki käyttää ennalta määriteltyä porttia, mutta hauskempaa generoida jotain satunnaista. Soveltuuko tämä käyttökohteeseen, it's up to you.
  360. SSH-portti generoidaan väliltä 23-600. Käytetään seuraavaa sisältöä uuteen state-tiedostoon.
  361. Luodaan masterille tiedosto _srv/salt/ssh_random/init.sls_ (sudo mkdir -p /srv/salt/ssh_random && sudo nano /srv/salt/ssh_random/init.sls):
  362. ```
  363. # Author: Pekka Helenius (~Fincer), 2018
  364. {% set supersecret_ssh_port = range(23, 600) | random %}
  365. check_sshd_install:
  366. pkg.installed:
  367. - pkgs:
  368. - openssh-server # Ubuntu specific
  369. check_sshd_config:
  370. file.managed:
  371. - name: /etc/ssh/sshd_config
  372. - require:
  373. - pkg: check_sshd_install
  374. check_sshd_current_port:
  375. cmd.run:
  376. - name: 'echo "current SSH daemon port for $(hostname) (Salt ID: {{ grains['id'] }}) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"'
  377. - require:
  378. - file: check_sshd_config
  379. prevent_if_ssh_sessions_open:
  380. cmd.run:
  381. - names:
  382. - 'SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: {{ grains['id'] }}): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi'
  383. - unset SSH_SESSIONS
  384. - require:
  385. - file: check_sshd_config
  386. - cmd: check_sshd_current_port
  387. new_ssh_port:
  388. file.replace:
  389. - name: /etc/ssh/sshd_config
  390. - pattern: '^[#P]+ort [0-9][0-9]*'
  391. - repl: 'Port {{ supersecret_ssh_port }}'
  392. - require:
  393. - cmd: prevent_if_ssh_sessions_open
  394. sshd_restart:
  395. service.running:
  396. - name: ssh.service # Yes, this is the daemon process
  397. - watch:
  398. - file: new_ssh_port
  399. ssh_new_port_inform:
  400. cmd.run:
  401. - name: 'echo "new SSH daemon port for $(hostname) (Salt ID: {{ grains['id'] }}) is {{ supersecret_ssh_port }}"'
  402. - require:
  403. - service: sshd_restart
  404. - file: new_ssh_port
  405. ```
  406. Ajetaan ssh_random -state masterilta kaikille yhteydessä oleville minioneille:
  407. ```
  408. sudo salt '*' state.apply ssh_random
  409. ```
  410. Masterilla saatu output minionille "orjakone":
  411. ```
  412. orjakone:
  413. ----------
  414. ID: check_sshd_install
  415. Function: pkg.installed
  416. Result: True
  417. Comment: All specified packages are already installed
  418. Started: 14:26:13.249172
  419. Duration: 416.921 ms
  420. Changes:
  421. ----------
  422. ID: check_sshd_config
  423. Function: file.managed
  424. Name: /etc/ssh/sshd_config
  425. Result: True
  426. Comment: File /etc/ssh/sshd_config exists with proper permissions. No changes made.
  427. Started: 14:26:13.668542
  428. Duration: 1.195 ms
  429. Changes:
  430. ----------
  431. ID: check_sshd_current_port
  432. Function: cmd.run
  433. Name: echo "current SSH daemon port for $(hostname) (Salt ID: orjakone) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"
  434. Result: True
  435. Comment: Command "echo "current SSH daemon port for $(hostname) (Salt ID: orjakone) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"" run
  436. Started: 14:26:13.671432
  437. Duration: 4.479 ms
  438. Changes:
  439. ----------
  440. pid:
  441. 2813
  442. retcode:
  443. 0
  444. stderr:
  445. stdout:
  446. current SSH daemon port for minion (Salt ID: orjakone) is: Port 22
  447. ----------
  448. ID: prevent_if_ssh_sessions_open
  449. Function: cmd.run
  450. Name: SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: orjakone): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi
  451. Result: True
  452. Comment: Command "SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: orjakone): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi" run
  453. Started: 14:26:13.676350
  454. Duration: 13.544 ms
  455. Changes:
  456. ----------
  457. pid:
  458. 2816
  459. retcode:
  460. 0
  461. stderr:
  462. stdout:
  463. ----------
  464. ID: prevent_if_ssh_sessions_open
  465. Function: cmd.run
  466. Name: unset SSH_SESSIONS
  467. Result: True
  468. Comment: Command "unset SSH_SESSIONS" run
  469. Started: 14:26:13.690114
  470. Duration: 3.341 ms
  471. Changes:
  472. ----------
  473. pid:
  474. 2823
  475. retcode:
  476. 0
  477. stderr:
  478. stdout:
  479. ----------
  480. ID: new_ssh_port
  481. Function: file.replace
  482. Name: /etc/ssh/sshd_config
  483. Result: True
  484. Comment: Changes were made
  485. Started: 14:26:13.693988
  486. Duration: 4.119 ms
  487. Changes:
  488. ----------
  489. diff:
  490. ---
  491. +++
  492. @@ -10,7 +10,7 @@
  493. # possible, but leave them commented. Uncommented options override the
  494. # default value.
  495. -Port 22
  496. +Port 199
  497. #AddressFamily any
  498. #ListenAddress 0.0.0.0
  499. #ListenAddress ::
  500. ----------
  501. ID: sshd_restart
  502. Function: service.running
  503. Name: ssh.service
  504. Result: True
  505. Comment: Service restarted
  506. Started: 14:26:13.724516
  507. Duration: 31.875 ms
  508. Changes:
  509. ----------
  510. ssh.service:
  511. True
  512. ----------
  513. ID: ssh_new_port_inform
  514. Function: cmd.run
  515. Name: echo "new SSH daemon port for $(hostname) (Salt ID: orjakone) is 199"
  516. Result: True
  517. Comment: Command "echo "new SSH daemon port for $(hostname) (Salt ID: orjakone) is 199"" run
  518. Started: 14:26:13.756793
  519. Duration: 7.15 ms
  520. Changes:
  521. ----------
  522. pid:
  523. 2832
  524. retcode:
  525. 0
  526. stderr:
  527. stdout:
  528. new SSH daemon port for minion (Salt ID: orjakone) is 199
  529. Summary for orjakone
  530. ------------
  531. Succeeded: 8 (changed=6)
  532. Failed: 0
  533. ------------
  534. Total states run: 8
  535. Total run time: 482.624 ms
  536. ```
  537. Näyttäisi siltä, että portti 199 on generoitu uudeksi SSH daemonin yhteysportiksi koneelle 'orjakone'. Varmistetaan tietojen oikeellisuus. Tämän voi tehdä etänä SSH-yhteyden avulla muultakin koneelta (testataan yhteyden toimivuus orjakoneen IP:een SSH clientilla porttia 199 käyttäen),
  538. mutta tässä varmistamme SSH-yhteyden toimivuuden portissa 199 suoraan minionin näkymästä:
  539. /etc/ssh/sshd_config -tiedoston sisältöä SSH-client testauksineen orjakoneen näkymästä ylläolevan ajon jälkeen:
  540. ![randomport-from-master](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/ssh_randomport_for_minion_2.png)
  541. Toinen esimerkki:
  542. ![randomport-from-master](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/ssh_randomport_for_minion.png)
  543. **Lisänä - SSH-portin vaihtamisen estäminen, jos SSH-yhteyksiä on muodostettu minionille**
  544. Jos SSH-yhteyksiä on minionilla auki, voimme haluta estää portin vaihtamisen kesken kaiken. Yllä olevassa SLS-tiedostossa tämä on määritetty state:lla _prevent_if_ssh_sessions_open_.
  545. Masterin output, jos minionilla on SSH-yhteyksiä auki:
  546. ```
  547. orjakone:
  548. ----------
  549. ID: check_sshd_install
  550. Function: pkg.installed
  551. Result: True
  552. Comment: All specified packages are already installed
  553. Started: 14:29:50.043605
  554. Duration: 390.748 ms
  555. Changes:
  556. ----------
  557. ID: check_sshd_config
  558. Function: file.managed
  559. Name: /etc/ssh/sshd_config
  560. Result: True
  561. Comment: File /etc/ssh/sshd_config exists with proper permissions. No changes made.
  562. Started: 14:29:50.436782
  563. Duration: 1.099 ms
  564. Changes:
  565. ----------
  566. ID: check_sshd_current_port
  567. Function: cmd.run
  568. Name: echo "current SSH daemon port for $(hostname) (Salt ID: orjakone) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"
  569. Result: True
  570. Comment: Command "echo "current SSH daemon port for $(hostname) (Salt ID: orjakone) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"" run
  571. Started: 14:29:50.438437
  572. Duration: 3.965 ms
  573. Changes:
  574. ----------
  575. pid:
  576. 2987
  577. retcode:
  578. 0
  579. stderr:
  580. stdout:
  581. current SSH daemon port for minion (Salt ID: orjakone) is: Port 379
  582. ----------
  583. ID: prevent_if_ssh_sessions_open
  584. Function: cmd.run
  585. Name: SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: orjakone): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi
  586. Result: False
  587. Comment: Command "SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: orjakone): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi" run
  588. Started: 14:29:50.442778
  589. Duration: 11.447 ms
  590. Changes:
  591. ----------
  592. pid:
  593. 2990
  594. retcode:
  595. 1
  596. stderr:
  597. stdout:
  598. -e minion (Salt ID: orjakone): The following established SSH session were found:
  599. tcp6 0 0 ::1:379 ::1:36896 ESTABLISHED 2869/sshd: fincer [
  600. Not changing SSH daemon port.
  601. ----------
  602. ID: prevent_if_ssh_sessions_open
  603. Function: cmd.run
  604. Name: unset SSH_SESSIONS
  605. Result: True
  606. Comment: Command "unset SSH_SESSIONS" run
  607. Started: 14:29:50.454451
  608. Duration: 3.132 ms
  609. Changes:
  610. ----------
  611. pid:
  612. 2998
  613. retcode:
  614. 0
  615. stderr:
  616. stdout:
  617. ----------
  618. ID: new_ssh_port
  619. Function: file.replace
  620. Name: /etc/ssh/sshd_config
  621. Result: False
  622. Comment: One or more requisite failed: ssh_random.prevent_if_ssh_sessions_open
  623. Changes:
  624. ----------
  625. ID: sshd_restart
  626. Function: service.running
  627. Name: ssh.service
  628. Result: False
  629. Comment: One or more requisite failed: ssh_random.new_ssh_port
  630. Changes:
  631. ----------
  632. ID: ssh_new_port_inform
  633. Function: cmd.run
  634. Name: echo "new SSH daemon port for $(hostname) (Salt ID: orjakone) is 258"
  635. Result: False
  636. Comment: One or more requisite failed: ssh_random.sshd_restart, ssh_random.new_ssh_port
  637. Changes:
  638. Summary for orjakone
  639. ------------
  640. Succeeded: 4 (changed=3)
  641. Failed: 4
  642. ------------
  643. Total states run: 8
  644. Total run time: 410.391 ms
  645. ERROR: Minions returned with non-zero exit code
  646. ```
  647. ![prevent-ssh-portchange_](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/salt_ssh-prevent-portchange.png)
  648. **e)** Kokeile jonkun toisen opiskelijan tekemää Salt-tilaa. Kokeiltava tila voi olla mistä vain harjoituksesta. Opiskelijoiden raportteja ja koodeja löydät tämän sivun perästä kommenteista.
  649. --------------
  650. **Vastaus:**
  651. Valitaan henkilön Oliver Siren harjoitus 3:n [Salt state, Jinja for-in loop](https://github.com/Oliver-Siren/palvelinten-hallinta-ict4tn022-4/blob/master/assignments/h3.md#salt-state-jinja-for-in-loop) -tehtävän vastaus.
  652. Ladataan wget-komennolla init.sls-tiedosto masterilla paikalliseen kansioon _/srv/salt/student_sample_:
  653. SLS-tiedostossa on oletettu, että tiedosto _/srv/salt/jinja/fool.txt_ on olemassa masterilla. Koska sitä ei ole, me luomme sen alla olevassa komentorimpsussa.
  654. ```
  655. sudo -- sh -c ' \
  656. mkdir -p /srv/salt/student_sample && mkdir -p /srv/salt/jinja && \
  657. wget https://raw.githubusercontent.com/Oliver-Siren/palvelinten-hallinta-ict4tn022-4/master/assignments/h3.md -O /srv/salt/student_sample/init.sls && \
  658. sed -i '51,61!d' /srv/salt/student_sample/init.sls && \
  659. echo "This is your {{ file }}" > /srv/salt/jinja/fool.txt
  660. '
  661. ```
  662. Ajetaan tila masterilta kaikille saataville orja-alkuisille minioneille:
  663. ```
  664. sudo salt 'orja*' state.apply student_sample
  665. ```
  666. Masterilla saatu output:
  667. ```
  668. orjakone:
  669. ----------
  670. ID: /tmp/fool/first.txt
  671. Function: file.managed
  672. Result: True
  673. Comment: File /tmp/fool/first.txt updated
  674. Started: 00:16:20.842493
  675. Duration: 25.759 ms
  676. Changes:
  677. ----------
  678. diff:
  679. New file
  680. mode:
  681. 0644
  682. ----------
  683. ID: /tmp/fool/second.txt
  684. Function: file.managed
  685. Result: True
  686. Comment: File /tmp/fool/second.txt updated
  687. Started: 00:16:20.868344
  688. Duration: 19.281 ms
  689. Changes:
  690. ----------
  691. diff:
  692. New file
  693. mode:
  694. 0644
  695. ----------
  696. ID: /tmp/fool/third.txt
  697. Function: file.managed
  698. Result: True
  699. Comment: File /tmp/fool/third.txt updated
  700. Started: 00:16:20.887697
  701. Duration: 17.221 ms
  702. Changes:
  703. ----------
  704. diff:
  705. New file
  706. mode:
  707. 0644
  708. ----------
  709. ID: /tmp/fool/fourth.txt
  710. Function: file.managed
  711. Result: True
  712. Comment: File /tmp/fool/fourth.txt updated
  713. Started: 00:16:20.904989
  714. Duration: 19.971 ms
  715. Changes:
  716. ----------
  717. diff:
  718. New file
  719. mode:
  720. 0644
  721. Summary for orjakone
  722. ------------
  723. Succeeded: 4 (changed=4)
  724. Failed: 0
  725. ------------
  726. Total states run: 4
  727. Total run time: 82.232 ms
  728. ```
  729. Wget:llä ladatun ja sed:llä parsitun esimerkki-SLS -tiedoston sisältö:
  730. ```
  731. {% for tiedosto in ['first.txt', 'second.txt', 'third.txt', 'fourth.txt'] %}
  732. /tmp/fool/{{ tiedosto }}:
  733. file.managed:
  734. - source: salt://jinja/fool.txt
  735. - makedirs: True
  736. - template: jinja
  737. - context:
  738. file: {{ tiedosto }}
  739. {% endfor %}
  740. ```