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.

515 lines
15 KiB

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. **b)** Tiedosto muotista: tee yksinkertainen SLS-tilatiedosto, joka laittaa muuttujan tiedostoon. Käytä jinjan kontekstimuuttujaa (template: jinja, context: ...).
  12. --------------
  13. **Vastaus:**
  14. Luodaan tiedosto _/srv/salt/firstninja.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/firstninja.sls):
  15. (Tehtävänannon vaatimus täyttyy state:ssa _put_my_foo_stuff_)
  16. ```
  17. hostile_secondgroup:
  18. group.present:
  19. - name: foobar
  20. - gid: 666
  21. - system: True
  22. hostile_user:
  23. user.present:
  24. - name: evilninja
  25. - fullname: Evil Ninja
  26. - uid: 666
  27. - gid: 666
  28. - shell: /bin/bash
  29. - home: /home/foo
  30. - groups:
  31. - foobar
  32. - require:
  33. - group: hostile_secondgroup
  34. put_my_foo_stuff:
  35. file.managed:
  36. - name: /foo/mysecretfoo
  37. - source: salt://foofile
  38. - makedirs: True
  39. - user: 666
  40. - group: 666
  41. - mode: 0744
  42. - template: jinja
  43. - context:
  44. supersecretfoo: 'you never know where this came from'
  45. notsosecretbar: 'wanna beer?'
  46. - require:
  47. - user: hostile_user
  48. foo_executable:
  49. file.symlink:
  50. - name: /usr/local/bin/mysecretfoo
  51. - target: /foo/mysecretfoo
  52. - require:
  53. - file: put_my_foo_stuff
  54. evil_nullfiles:
  55. cmd.run:
  56. - name: 'touch ./foo_everywhere'
  57. - cwd: /foo
  58. - creates: foo_everywhere
  59. - creates: foofoo
  60. - require:
  61. - file: put_my_foo_stuff
  62. identity_crisis:
  63. cmd.run:
  64. - name: /usr/bin/id -a
  65. - runas: evilninja
  66. - require:
  67. - user: hostile_user
  68. haha_execute:
  69. cmd.run:
  70. - shell: /bin/sh
  71. - name: mysecretfoo
  72. - require:
  73. - user: hostile_user
  74. - file: foo_executable
  75. ```
  76. Lisätään masterille tiedosto _/srv/salt/foofile_ seuraavalla sisällöllä (sudo nano /srv/salt/foofile):
  77. ```
  78. #!/bin/sh
  79. echo -e "{{ supersecretfoo }}\n{{ notsosecretbar }}"
  80. ```
  81. Tämä tiedosto kirjoitetaan minionin/minioneiden kohteeseen _/foo/mysecretfoo_ ja luodaan symbolinen linkki _/usr/local/bin/mysecretfoo_.
  82. Testataan toimivuus harjoituksessa 1 ja 2 käytetyllä master-minion -tietokonekokoonpanolla (master: master, minion: orjakone):
  83. ```
  84. sudo salt 'orjakone' state.apply firstninja
  85. ```
  86. Masterilla tulostettu output:
  87. ```
  88. orjakone:
  89. ----------
  90. ID: hostile_secondgroup
  91. Function: group.present
  92. Name: foobar
  93. Result: True
  94. Comment: Group foobar is present and up to date
  95. Started: 21:52:22.010941
  96. Duration: 1.317 ms
  97. Changes:
  98. ----------
  99. ID: hostile_user
  100. Function: user.present
  101. Name: evilninja
  102. Result: True
  103. Comment: User evilninja is present and up to date
  104. Started: 21:52:22.012741
  105. Duration: 13.69 ms
  106. Changes:
  107. ----------
  108. ID: put_my_foo_stuff
  109. Function: file.managed
  110. Name: /foo/mysecretfoo
  111. Result: True
  112. Comment: File /foo/mysecretfoo is in the correct state
  113. Started: 21:52:22.027375
  114. Duration: 10.438 ms
  115. Changes:
  116. ----------
  117. ID: foo_executable
  118. Function: file.symlink
  119. Name: /usr/local/bin/mysecretfoo
  120. Result: True
  121. Comment: Created new symlink /usr/local/bin/mysecretfoo -> /foo/mysecretfoo
  122. Started: 21:52:22.038030
  123. Duration: 26.087 ms
  124. Changes:
  125. ----------
  126. new:
  127. /usr/local/bin/mysecretfoo
  128. ----------
  129. ID: evil_nullfiles
  130. Function: cmd.run
  131. Name: touch ./foo_everywhere
  132. Result: True
  133. Comment: Command "touch ./foo_everywhere" run
  134. Started: 21:52:22.066037
  135. Duration: 8.669 ms
  136. Changes:
  137. ----------
  138. pid:
  139. 3426
  140. retcode:
  141. 0
  142. stderr:
  143. stdout:
  144. ----------
  145. ID: identity_crisis
  146. Function: cmd.run
  147. Name: /usr/bin/id -a
  148. Result: True
  149. Comment: Command "/usr/bin/id -a" run
  150. Started: 21:52:22.074865
  151. Duration: 158.997 ms
  152. Changes:
  153. ----------
  154. pid:
  155. 3450
  156. retcode:
  157. 0
  158. stderr:
  159. stdout:
  160. uid=666(evilninja) gid=666(foobar) groups=666(foobar)
  161. ----------
  162. ID: haha_execute
  163. Function: cmd.run
  164. Name: mysecretfoo
  165. Result: True
  166. Comment: Command "mysecretfoo" run
  167. Started: 21:52:22.234242
  168. Duration: 14.473 ms
  169. Changes:
  170. ----------
  171. pid:
  172. 3455
  173. retcode:
  174. 0
  175. stderr:
  176. stdout:
  177. -e you never know where this came from
  178. wanna beer?
  179. Summary for orjakone
  180. ------------
  181. Succeeded: 7 (changed=4)
  182. Failed: 0
  183. ------------
  184. Total states run: 7
  185. Total run time: 233.671 ms
  186. ```
  187. **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.)
  188. --------------
  189. **Vastaus:**
  190. Luodaan master:lle tiedosto _/srv/salt/first_jinjaloop.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/first_jinjaloop.sls):
  191. ```
  192. {% for loplop in ['round_1', 'round_2', 'round_3', 'round_4'] %}
  193. loopsloops_noops{{ loop.index }}:
  194. file.managed:
  195. - name: /tmp/loopnoops/{{ loplop }}
  196. - source: salt://loops/jinjaninja_loop
  197. - makedirs: True
  198. - template: jinja
  199. - context:
  200. filenumber: {{ loplop }}
  201. run_fatboy_run_{{ loop.index }}:
  202. cmd.run:
  203. - name: cat /tmp/loopnoops/{{ loplop }}
  204. - require:
  205. - file: loopsloops_noops{{ loop.index }}
  206. {% endfor %}
  207. ```
  208. Luodaan masterilla tiedosto */srv/salt/loops/jinjaninja_loop*:
  209. ```
  210. sudo mkdir -p /srv/salt/loops
  211. echo "Loops loops noops {{ filenumber }}" | sudo tee /srv/salt/loops/jinjaninja_loop
  212. ```
  213. Ajetaan luotu state-tiedosto masterilta orjakone-minionille:
  214. ```
  215. sudo salt 'orjakone' state.apply first_jinjaloop
  216. ```
  217. Masterilta saatu output:
  218. ```
  219. orjakone:
  220. ----------
  221. ID: loopsloops_noops1
  222. Function: file.managed
  223. Name: /tmp/loopnoops/round_1
  224. Result: True
  225. Comment: File /tmp/loopnoops/round_1 updated
  226. Started: 22:15:48.402678
  227. Duration: 22.99 ms
  228. Changes:
  229. ----------
  230. diff:
  231. New file
  232. mode:
  233. 0644
  234. ----------
  235. ID: run_fatboy_run_1
  236. Function: cmd.run
  237. Name: cat /tmp/loopnoops/round_1
  238. Result: True
  239. Comment: Command "cat /tmp/loopnoops/round_1" run
  240. Started: 22:15:48.426279
  241. Duration: 9.155 ms
  242. Changes:
  243. ----------
  244. pid:
  245. 3654
  246. retcode:
  247. 0
  248. stderr:
  249. stdout:
  250. Loops loops noops round_1
  251. ----------
  252. ID: loopsloops_noops2
  253. Function: file.managed
  254. Name: /tmp/loopnoops/round_2
  255. Result: True
  256. Comment: File /tmp/loopnoops/round_2 updated
  257. Started: 22:15:48.435550
  258. Duration: 18.288 ms
  259. Changes:
  260. ----------
  261. diff:
  262. New file
  263. mode:
  264. 0644
  265. ----------
  266. ID: run_fatboy_run_2
  267. Function: cmd.run
  268. Name: cat /tmp/loopnoops/round_2
  269. Result: True
  270. Comment: Command "cat /tmp/loopnoops/round_2" run
  271. Started: 22:15:48.454122
  272. Duration: 5.179 ms
  273. Changes:
  274. ----------
  275. pid:
  276. 3656
  277. retcode:
  278. 0
  279. stderr:
  280. stdout:
  281. Loops loops noops round_2
  282. ----------
  283. ID: loopsloops_noops3
  284. Function: file.managed
  285. Name: /tmp/loopnoops/round_3
  286. Result: True
  287. Comment: File /tmp/loopnoops/round_3 updated
  288. Started: 22:15:48.459403
  289. Duration: 19.723 ms
  290. Changes:
  291. ----------
  292. diff:
  293. New file
  294. mode:
  295. 0644
  296. ----------
  297. ID: run_fatboy_run_3
  298. Function: cmd.run
  299. Name: cat /tmp/loopnoops/round_3
  300. Result: True
  301. Comment: Command "cat /tmp/loopnoops/round_3" run
  302. Started: 22:15:48.479414
  303. Duration: 6.602 ms
  304. Changes:
  305. ----------
  306. pid:
  307. 3658
  308. retcode:
  309. 0
  310. stderr:
  311. stdout:
  312. Loops loops noops round_3
  313. ----------
  314. ID: loopsloops_noops4
  315. Function: file.managed
  316. Name: /tmp/loopnoops/round_4
  317. Result: True
  318. Comment: File /tmp/loopnoops/round_4 updated
  319. Started: 22:15:48.486128
  320. Duration: 18.883 ms
  321. Changes:
  322. ----------
  323. diff:
  324. New file
  325. mode:
  326. 0644
  327. ----------
  328. ID: run_fatboy_run_4
  329. Function: cmd.run
  330. Name: cat /tmp/loopnoops/round_4
  331. Result: True
  332. Comment: Command "cat /tmp/loopnoops/round_4" run
  333. Started: 22:15:48.505300
  334. Duration: 9.609 ms
  335. Changes:
  336. ----------
  337. pid:
  338. 3660
  339. retcode:
  340. 0
  341. stderr:
  342. stdout:
  343. Loops loops noops round_4
  344. Summary for orjakone
  345. ------------
  346. Succeeded: 8 (changed=8)
  347. Failed: 0
  348. ------------
  349. Total states run: 8
  350. Total run time: 110.429 ms
  351. ```
  352. **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.
  353. --------------
  354. **Vastaus:**
  355. 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.
  356. SSH-portti generoidaan väliltä 23-600. Käytetään seuraavaa sisältöä uuteen state-tiedostoon.
  357. Luodaan masterille tiedosto _srv/salt/ssh_random/init.sls_ (sudo mkdir -p /srv/salt/ssh_random && sudo nano /srv/salt/ssh_random/init.sls):
  358. ```
  359. {% set supersecret_ssh_port = range(23, 600) | random %}
  360. check_sshd_config:
  361. file.managed:
  362. - name: /etc/ssh/sshd_config
  363. ssh_port:
  364. cmd.run:
  365. - name: 'sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port {{ supersecret_ssh_port }}/" /etc/ssh/sshd_config'
  366. - require:
  367. - file: check_sshd_config
  368. sshd_restart:
  369. service.running:
  370. - name: ssh.service # Yes, this is the daemon process
  371. - watch:
  372. - cmd: ssh_port
  373. ssh_new_port_inform:
  374. cmd.run:
  375. - name: 'echo "new SSH daemon port for $(hostname) is {{ supersecret_ssh_port }}"'
  376. - require:
  377. - service: sshd_restart
  378. - cmd: ssh_port
  379. ```
  380. Ajetaan ssh_random -state masterilta kaikille yhteydessä oleville minioneille:
  381. ```
  382. sudo salt '*' state.apply ssh_random
  383. ```
  384. Masterilla saatu output minionille "orjakone":
  385. ```
  386. orjakone:
  387. ----------
  388. ID: check_sshd_config
  389. Function: file.managed
  390. Name: /etc/ssh/sshd_config
  391. Result: True
  392. Comment: File /etc/ssh/sshd_config exists with proper permissions. No changes made.
  393. Started: 23:11:06.410285
  394. Duration: 4.806 ms
  395. Changes:
  396. ----------
  397. ID: ssh_port
  398. Function: cmd.run
  399. Name: sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port 240/" /etc/ssh/sshd_config
  400. Result: True
  401. Comment: Command "sed -i -r "s/^[#P]+ort [0-9][0-9]*/Port 240/" /etc/ssh/sshd_config" run
  402. Started: 23:11:06.415594
  403. Duration: 4.329 ms
  404. Changes:
  405. ----------
  406. pid:
  407. 3939
  408. retcode:
  409. 0
  410. stderr:
  411. stdout:
  412. ----------
  413. ID: sshd_restart
  414. Function: service.running
  415. Name: ssh.service
  416. Result: True
  417. Comment: Started Service ssh.service
  418. Started: 23:11:06.861530
  419. Duration: 58.559 ms
  420. Changes:
  421. ----------
  422. ssh.service:
  423. True
  424. ----------
  425. ID: ssh_new_port_inform
  426. Function: cmd.run
  427. Name: echo "new SSH daemon port for $(hostname) is 240"
  428. Result: True
  429. Comment: Command "echo "new SSH daemon port for $(hostname) is 240"" run
  430. Started: 23:11:06.920584
  431. Duration: 62.236 ms
  432. Changes:
  433. ----------
  434. pid:
  435. 3954
  436. retcode:
  437. 0
  438. stderr:
  439. stdout:
  440. new SSH daemon port for minion is 240
  441. Summary for orjakone
  442. ------------
  443. Succeeded: 4 (changed=3)
  444. Failed: 0
  445. ------------
  446. Total states run: 4
  447. Total run time: 129.930 ms
  448. ```
  449. Näyttäisi siltä, että portti 240 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 240 käyttäen),
  450. mutta tässä varmistamme SSH-yhteyden toimivuuden portissa 240 suoraan minionin näkymästä:
  451. /etc/ssh/sshd_config -tiedoston sisältöä SSH-client testauksineen orjakoneen näkymästä ylläolevan ajon jälkeen:
  452. ![randomport-from-master](https://raw.githubusercontent.com/Fincer-altego/central-management-of-multiple-servers/master/images/ssh_randomport_for_minion.png)