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.

506 lines
13 KiB

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