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.

741 lines
22 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  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-altego/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-altego/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-altego/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-altego/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. hostile_secondgroup:
  19. group.present:
  20. - name: foobar
  21. - gid: 666
  22. - system: True
  23. hostile_user:
  24. user.present:
  25. - name: evilninja
  26. - fullname: Evil Ninja
  27. - uid: 666
  28. - gid: 666
  29. - shell: /bin/bash
  30. - home: /home/foo
  31. - groups:
  32. - foobar
  33. - require:
  34. - group: hostile_secondgroup
  35. put_my_foo_stuff:
  36. file.managed:
  37. - name: /foo/mysecretfoo
  38. - source: salt://foofile
  39. - makedirs: True
  40. - user: 666
  41. - group: 666
  42. - mode: 0744
  43. - template: jinja
  44. - context:
  45. supersecretfoo: 'you never know where this came from'
  46. notsosecretbar: 'wanna beer?'
  47. - require:
  48. - user: hostile_user
  49. foo_executable:
  50. file.symlink:
  51. - name: /usr/local/bin/mysecretfoo
  52. - target: /foo/mysecretfoo
  53. - require:
  54. - file: put_my_foo_stuff
  55. evil_nullfiles:
  56. cmd.run:
  57. - name: 'touch ./foo_everywhere'
  58. - cwd: /foo
  59. - creates: foo_everywhere
  60. - creates: foofoo
  61. - require:
  62. - file: put_my_foo_stuff
  63. identity_crisis:
  64. cmd.run:
  65. - name: /usr/bin/id -a
  66. - runas: evilninja
  67. - require:
  68. - user: hostile_user
  69. haha_execute:
  70. cmd.run:
  71. - shell: /bin/sh
  72. - name: mysecretfoo
  73. - require:
  74. - user: hostile_user
  75. - file: foo_executable
  76. ```
  77. Lisätään masterille tiedosto _/srv/salt/foofile_ seuraavalla sisällöllä (sudo nano /srv/salt/foofile):
  78. ```
  79. #!/bin/sh
  80. echo -e "{{ supersecretfoo }}\n{{ notsosecretbar }}"
  81. ```
  82. Tämä tiedosto kirjoitetaan minionin/minioneiden kohteeseen _/foo/mysecretfoo_ ja luodaan symbolinen linkki _/usr/local/bin/mysecretfoo_.
  83. Testataan toimivuus harjoituksessa 1 ja 2 käytetyllä master-minion -tietokonekokoonpanolla (master: master, minion: orjakone):
  84. ```
  85. sudo salt 'orjakone' state.apply firstninja
  86. ```
  87. Masterilla tulostettu output:
  88. ```
  89. orjakone:
  90. ----------
  91. ID: hostile_secondgroup
  92. Function: group.present
  93. Name: foobar
  94. Result: True
  95. Comment: Group foobar is present and up to date
  96. Started: 21:52:22.010941
  97. Duration: 1.317 ms
  98. Changes:
  99. ----------
  100. ID: hostile_user
  101. Function: user.present
  102. Name: evilninja
  103. Result: True
  104. Comment: User evilninja is present and up to date
  105. Started: 21:52:22.012741
  106. Duration: 13.69 ms
  107. Changes:
  108. ----------
  109. ID: put_my_foo_stuff
  110. Function: file.managed
  111. Name: /foo/mysecretfoo
  112. Result: True
  113. Comment: File /foo/mysecretfoo is in the correct state
  114. Started: 21:52:22.027375
  115. Duration: 10.438 ms
  116. Changes:
  117. ----------
  118. ID: foo_executable
  119. Function: file.symlink
  120. Name: /usr/local/bin/mysecretfoo
  121. Result: True
  122. Comment: Created new symlink /usr/local/bin/mysecretfoo -> /foo/mysecretfoo
  123. Started: 21:52:22.038030
  124. Duration: 26.087 ms
  125. Changes:
  126. ----------
  127. new:
  128. /usr/local/bin/mysecretfoo
  129. ----------
  130. ID: evil_nullfiles
  131. Function: cmd.run
  132. Name: touch ./foo_everywhere
  133. Result: True
  134. Comment: Command "touch ./foo_everywhere" run
  135. Started: 21:52:22.066037
  136. Duration: 8.669 ms
  137. Changes:
  138. ----------
  139. pid:
  140. 3426
  141. retcode:
  142. 0
  143. stderr:
  144. stdout:
  145. ----------
  146. ID: identity_crisis
  147. Function: cmd.run
  148. Name: /usr/bin/id -a
  149. Result: True
  150. Comment: Command "/usr/bin/id -a" run
  151. Started: 21:52:22.074865
  152. Duration: 158.997 ms
  153. Changes:
  154. ----------
  155. pid:
  156. 3450
  157. retcode:
  158. 0
  159. stderr:
  160. stdout:
  161. uid=666(evilninja) gid=666(foobar) groups=666(foobar)
  162. ----------
  163. ID: haha_execute
  164. Function: cmd.run
  165. Name: mysecretfoo
  166. Result: True
  167. Comment: Command "mysecretfoo" run
  168. Started: 21:52:22.234242
  169. Duration: 14.473 ms
  170. Changes:
  171. ----------
  172. pid:
  173. 3455
  174. retcode:
  175. 0
  176. stderr:
  177. stdout:
  178. -e you never know where this came from
  179. wanna beer?
  180. Summary for orjakone
  181. ------------
  182. Succeeded: 7 (changed=4)
  183. Failed: 0
  184. ------------
  185. Total states run: 7
  186. Total run time: 233.671 ms
  187. ```
  188. **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.)
  189. --------------
  190. **Vastaus:**
  191. Luodaan master:lle tiedosto _/srv/salt/first_jinjaloop.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/first_jinjaloop.sls):
  192. ```
  193. {% for loplop in ['round_1', 'round_2', 'round_3', 'round_4'] %}
  194. loopsloops_noops{{ loop.index }}:
  195. file.managed:
  196. - name: /tmp/loopnoops/{{ loplop }}
  197. - source: salt://loops/jinjaninja_loop
  198. - makedirs: True
  199. - template: jinja
  200. - context:
  201. filenumber: {{ loplop }}
  202. run_fatboy_run_{{ loop.index }}:
  203. cmd.run:
  204. - name: cat /tmp/loopnoops/{{ loplop }}
  205. - require:
  206. - file: loopsloops_noops{{ loop.index }}
  207. {% endfor %}
  208. ```
  209. Luodaan masterilla tiedosto */srv/salt/loops/jinjaninja_loop*:
  210. ```
  211. sudo mkdir -p /srv/salt/loops
  212. echo "Loops loops noops {{ filenumber }}" | sudo tee /srv/salt/loops/jinjaninja_loop
  213. ```
  214. Ajetaan luotu state-tiedosto masterilta orjakone-minionille:
  215. ```
  216. sudo salt 'orjakone' state.apply first_jinjaloop
  217. ```
  218. Masterilta saatu output:
  219. ```
  220. orjakone:
  221. ----------
  222. ID: loopsloops_noops1
  223. Function: file.managed
  224. Name: /tmp/loopnoops/round_1
  225. Result: True
  226. Comment: File /tmp/loopnoops/round_1 updated
  227. Started: 22:15:48.402678
  228. Duration: 22.99 ms
  229. Changes:
  230. ----------
  231. diff:
  232. New file
  233. mode:
  234. 0644
  235. ----------
  236. ID: run_fatboy_run_1
  237. Function: cmd.run
  238. Name: cat /tmp/loopnoops/round_1
  239. Result: True
  240. Comment: Command "cat /tmp/loopnoops/round_1" run
  241. Started: 22:15:48.426279
  242. Duration: 9.155 ms
  243. Changes:
  244. ----------
  245. pid:
  246. 3654
  247. retcode:
  248. 0
  249. stderr:
  250. stdout:
  251. Loops loops noops round_1
  252. ----------
  253. ID: loopsloops_noops2
  254. Function: file.managed
  255. Name: /tmp/loopnoops/round_2
  256. Result: True
  257. Comment: File /tmp/loopnoops/round_2 updated
  258. Started: 22:15:48.435550
  259. Duration: 18.288 ms
  260. Changes:
  261. ----------
  262. diff:
  263. New file
  264. mode:
  265. 0644
  266. ----------
  267. ID: run_fatboy_run_2
  268. Function: cmd.run
  269. Name: cat /tmp/loopnoops/round_2
  270. Result: True
  271. Comment: Command "cat /tmp/loopnoops/round_2" run
  272. Started: 22:15:48.454122
  273. Duration: 5.179 ms
  274. Changes:
  275. ----------
  276. pid:
  277. 3656
  278. retcode:
  279. 0
  280. stderr:
  281. stdout:
  282. Loops loops noops round_2
  283. ----------
  284. ID: loopsloops_noops3
  285. Function: file.managed
  286. Name: /tmp/loopnoops/round_3
  287. Result: True
  288. Comment: File /tmp/loopnoops/round_3 updated
  289. Started: 22:15:48.459403
  290. Duration: 19.723 ms
  291. Changes:
  292. ----------
  293. diff:
  294. New file
  295. mode:
  296. 0644
  297. ----------
  298. ID: run_fatboy_run_3
  299. Function: cmd.run
  300. Name: cat /tmp/loopnoops/round_3
  301. Result: True
  302. Comment: Command "cat /tmp/loopnoops/round_3" run
  303. Started: 22:15:48.479414
  304. Duration: 6.602 ms
  305. Changes:
  306. ----------
  307. pid:
  308. 3658
  309. retcode:
  310. 0
  311. stderr:
  312. stdout:
  313. Loops loops noops round_3
  314. ----------
  315. ID: loopsloops_noops4
  316. Function: file.managed
  317. Name: /tmp/loopnoops/round_4
  318. Result: True
  319. Comment: File /tmp/loopnoops/round_4 updated
  320. Started: 22:15:48.486128
  321. Duration: 18.883 ms
  322. Changes:
  323. ----------
  324. diff:
  325. New file
  326. mode:
  327. 0644
  328. ----------
  329. ID: run_fatboy_run_4
  330. Function: cmd.run
  331. Name: cat /tmp/loopnoops/round_4
  332. Result: True
  333. Comment: Command "cat /tmp/loopnoops/round_4" run
  334. Started: 22:15:48.505300
  335. Duration: 9.609 ms
  336. Changes:
  337. ----------
  338. pid:
  339. 3660
  340. retcode:
  341. 0
  342. stderr:
  343. stdout:
  344. Loops loops noops round_4
  345. Summary for orjakone
  346. ------------
  347. Succeeded: 8 (changed=8)
  348. Failed: 0
  349. ------------
  350. Total states run: 8
  351. Total run time: 110.429 ms
  352. ```
  353. **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.
  354. --------------
  355. **Vastaus:**
  356. 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.
  357. SSH-portti generoidaan väliltä 23-600. Käytetään seuraavaa sisältöä uuteen state-tiedostoon.
  358. Luodaan masterille tiedosto _srv/salt/ssh_random/init.sls_ (sudo mkdir -p /srv/salt/ssh_random && sudo nano /srv/salt/ssh_random/init.sls):
  359. ```
  360. {% set supersecret_ssh_port = range(23, 600) | random %}
  361. check_sshd_install:
  362. pkg.installed:
  363. - pkgs:
  364. - openssh-server # Ubuntu specific
  365. check_sshd_config:
  366. file.managed:
  367. - name: /etc/ssh/sshd_config
  368. - require:
  369. - pkg: check_sshd_install
  370. prevent_if_ssh_sessions_open:
  371. cmd.run:
  372. - name: 'if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi'
  373. - require:
  374. - file: check_sshd_config
  375. ssh_port:
  376. cmd.run:
  377. - name: 'sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port {{ supersecret_ssh_port }}/" /etc/ssh/sshd_config'
  378. - require:
  379. - cmd: prevent_if_ssh_sessions_open
  380. sshd_restart:
  381. service.running:
  382. - name: ssh.service # Yes, this is the daemon process
  383. - watch:
  384. - cmd: ssh_port
  385. ssh_new_port_inform:
  386. cmd.run:
  387. - name: 'echo "new SSH daemon port for $(hostname) is {{ supersecret_ssh_port }}"'
  388. - require:
  389. - service: sshd_restart
  390. - cmd: ssh_port
  391. ```
  392. Ajetaan ssh_random -state masterilta kaikille yhteydessä oleville minioneille:
  393. ```
  394. sudo salt '*' state.apply ssh_random
  395. ```
  396. Masterilla saatu output minionille "orjakone":
  397. ```
  398. orjakone:
  399. ----------
  400. ID: check_sshd_install
  401. Function: pkg.installed
  402. Result: True
  403. Comment: All specified packages are already installed
  404. Started: 00:41:53.684126
  405. Duration: 438.565 ms
  406. Changes:
  407. ----------
  408. ID: check_sshd_config
  409. Function: file.managed
  410. Name: /etc/ssh/sshd_config
  411. Result: True
  412. Comment: File /etc/ssh/sshd_config exists with proper permissions. No changes made.
  413. Started: 00:41:54.125139
  414. Duration: 1.176 ms
  415. Changes:
  416. ----------
  417. ID: prevent_if_ssh_sessions_open
  418. Function: cmd.run
  419. Name: if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi
  420. Result: True
  421. Comment: Command "if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi" run
  422. Started: 00:41:54.126854
  423. Duration: 10.249 ms
  424. Changes:
  425. ----------
  426. pid:
  427. 4907
  428. retcode:
  429. 0
  430. stderr:
  431. stdout:
  432. ----------
  433. ID: ssh_port
  434. Function: cmd.run
  435. Name: sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port 199/" /etc/ssh/sshd_config
  436. Result: True
  437. Comment: Command "sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port 199/" /etc/ssh/sshd_config" run
  438. Started: 00:41:54.137472
  439. Duration: 3.691 ms
  440. Changes:
  441. ----------
  442. pid:
  443. 4912
  444. retcode:
  445. 0
  446. stderr:
  447. stdout:
  448. ----------
  449. ID: sshd_restart
  450. Function: service.running
  451. Name: ssh.service
  452. Result: True
  453. Comment: Service restarted
  454. Started: 00:41:54.159948
  455. Duration: 23.825 ms
  456. Changes:
  457. ----------
  458. ssh.service:
  459. True
  460. ----------
  461. ID: ssh_new_port_inform
  462. Function: cmd.run
  463. Name: echo "new SSH daemon port for $(hostname) is 199"
  464. Result: True
  465. Comment: Command "echo "new SSH daemon port for $(hostname) is 199"" run
  466. Started: 00:41:54.184166
  467. Duration: 3.476 ms
  468. Changes:
  469. ----------
  470. pid:
  471. 4922
  472. retcode:
  473. 0
  474. stderr:
  475. stdout:
  476. new SSH daemon port for minion is 199
  477. Summary for orjakone
  478. ------------
  479. Succeeded: 6 (changed=4)
  480. Failed: 0
  481. ------------
  482. Total states run: 6
  483. Total run time: 480.982 ms
  484. ```
  485. 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),
  486. mutta tässä varmistamme SSH-yhteyden toimivuuden portissa 199 suoraan minionin näkymästä:
  487. /etc/ssh/sshd_config -tiedoston sisältöä SSH-client testauksineen orjakoneen näkymästä ylläolevan ajon jälkeen:
  488. ![randomport-from-master](https://raw.githubusercontent.com/Fincer-altego/central-management-of-multiple-servers/master/images/ssh_randomport_for_minion_2.png)
  489. Toinen esimerkki:
  490. ![randomport-from-master](https://raw.githubusercontent.com/Fincer-altego/central-management-of-multiple-servers/master/images/ssh_randomport_for_minion.png)
  491. **Lisänä - SSH-portin vaihtamisen estäminen, jos SSH-yhteyksiä on muodostettu minionille**
  492. 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_.
  493. Masterin output, jos minionilla on SSH-yhteyksiä auki:
  494. ```
  495. orjakone:
  496. ----------
  497. ID: check_sshd_install
  498. Function: pkg.installed
  499. Result: True
  500. Comment: All specified packages are already installed
  501. Started: 00:37:52.470756
  502. Duration: 425.447 ms
  503. Changes:
  504. ----------
  505. ID: check_sshd_config
  506. Function: file.managed
  507. Name: /etc/ssh/sshd_config
  508. Result: True
  509. Comment: File /etc/ssh/sshd_config exists with proper permissions. No changes made.
  510. Started: 00:37:52.898531
  511. Duration: 1.179 ms
  512. Changes:
  513. ----------
  514. ID: prevent_if_ssh_sessions_open
  515. Function: cmd.run
  516. Name: if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi
  517. Result: False
  518. Comment: Command "if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi" run
  519. Started: 00:37:52.900237
  520. Duration: 10.394 ms
  521. Changes:
  522. ----------
  523. pid:
  524. 4815
  525. retcode:
  526. 1
  527. stderr:
  528. stdout:
  529. ----------
  530. ID: ssh_port
  531. Function: cmd.run
  532. Name: sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port 305/" /etc/ssh/sshd_config
  533. Result: False
  534. Comment: One or more requisite failed: ssh_random.prevent_if_ssh_sessions_open
  535. Changes:
  536. ----------
  537. ID: sshd_restart
  538. Function: service.running
  539. Name: ssh.service
  540. Result: False
  541. Comment: One or more requisite failed: ssh_random.ssh_port
  542. Changes:
  543. ----------
  544. ID: ssh_new_port_inform
  545. Function: cmd.run
  546. Name: echo "new SSH daemon port for $(hostname) is 305"
  547. Result: False
  548. Comment: One or more requisite failed: ssh_random.ssh_port, ssh_random.sshd_restart
  549. Changes:
  550. Summary for orjakone
  551. ------------
  552. Succeeded: 2 (changed=1)
  553. Failed: 4
  554. ------------
  555. Total states run: 6
  556. Total run time: 437.020 ms
  557. ERROR: Minions returned with non-zero exit code
  558. ```
  559. ![prevent-ssh-portchange](https://raw.githubusercontent.com/Fincer-altego/central-management-of-multiple-servers/master/images/ssh_prevent_portchange.png)
  560. **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.
  561. --------------
  562. **Vastaus:**
  563. 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.
  564. Ladataan wget-komennolla init.sls-tiedosto masterilla paikalliseen kansioon _/srv/salt/student_sample_:
  565. SLS-tiedostossa on oletettu, että tiedosto _/srv/salt/jinja/fool.txt_ on olemassa masterilla. Koska sitä ei ole, me luomme sen alla olevassa komentorimpsussa.
  566. ```
  567. sudo -- sh -c ' \
  568. mkdir -p /srv/salt/student_sample && mkdir -p /srv/salt/jinja && \
  569. wget https://raw.githubusercontent.com/Oliver-Siren/palvelinten-hallinta-ict4tn022-4/master/assignments/h3.md -O /srv/salt/student_sample/init.sls && \
  570. sed -i '51,61!d' /srv/salt/student_sample/init.sls && \
  571. echo "This is your {{ file }}" > /srv/salt/jinja/fool.txt
  572. '
  573. ```
  574. Ajetaan tila masterilta kaikille saataville orja-alkuisille minioneille:
  575. ```
  576. sudo salt 'orja*' state.apply student_sample
  577. ```
  578. Masterilla saatu output:
  579. ```
  580. orjakone:
  581. ----------
  582. ID: /tmp/fool/first.txt
  583. Function: file.managed
  584. Result: True
  585. Comment: File /tmp/fool/first.txt updated
  586. Started: 00:16:20.842493
  587. Duration: 25.759 ms
  588. Changes:
  589. ----------
  590. diff:
  591. New file
  592. mode:
  593. 0644
  594. ----------
  595. ID: /tmp/fool/second.txt
  596. Function: file.managed
  597. Result: True
  598. Comment: File /tmp/fool/second.txt updated
  599. Started: 00:16:20.868344
  600. Duration: 19.281 ms
  601. Changes:
  602. ----------
  603. diff:
  604. New file
  605. mode:
  606. 0644
  607. ----------
  608. ID: /tmp/fool/third.txt
  609. Function: file.managed
  610. Result: True
  611. Comment: File /tmp/fool/third.txt updated
  612. Started: 00:16:20.887697
  613. Duration: 17.221 ms
  614. Changes:
  615. ----------
  616. diff:
  617. New file
  618. mode:
  619. 0644
  620. ----------
  621. ID: /tmp/fool/fourth.txt
  622. Function: file.managed
  623. Result: True
  624. Comment: File /tmp/fool/fourth.txt updated
  625. Started: 00:16:20.904989
  626. Duration: 19.971 ms
  627. Changes:
  628. ----------
  629. diff:
  630. New file
  631. mode:
  632. 0644
  633. Summary for orjakone
  634. ------------
  635. Succeeded: 4 (changed=4)
  636. Failed: 0
  637. ------------
  638. Total states run: 4
  639. Total run time: 82.232 ms
  640. ```
  641. Wget:llä ladatun ja sed:llä parsitun esimerkki-SLS -tiedoston sisältö:
  642. ```
  643. {% for tiedosto in ['first.txt', 'second.txt', 'third.txt', 'fourth.txt'] %}
  644. /tmp/fool/{{ tiedosto }}:
  645. file.managed:
  646. - source: salt://jinja/fool.txt
  647. - makedirs: True
  648. - template: jinja
  649. - context:
  650. file: {{ tiedosto }}
  651. {% endfor %}
  652. ```