์ด๊ฒ์ ๋๋ณธ์
๋๋ค
๋ ๋ฒ์งธ ์ปค๋ฐ๋ถํฐ ๋ชจ๋ ์ฝ๋๋ ๋ ๊ฑฐ์๊ฐ ๋ฉ๋๋ค. ์ด๊ธฐ ์์ด๋์ด๋ ๊ฐํนํ ํ์ค๊ณผ ๋ฌ๋ผ์ง๊ธฐ ์์ํฉ๋๋ค. ์ด๊ฒ์ ์ข์ ๊ฒ๋ ๋์ ๊ฒ๋ ์๋๋ฉฐ, ๋ ผ์ํ๊ธฐ ์ด๋ ต๊ณ ๋ฐ์๋ค์ฌ์ผ ํ๋ ๋น์ฐํ ์ฌ์ค์ ๋๋ค. ์ด ํ๋ก์ธ์ค์ ์ผ๋ถ๋ ๋ฆฌํฉํ ๋ง์ ๋๋ค. ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ๋ฆฌํฉํฐ๋ง. XNUMX๋ ์์ Ansible์ ๋ฆฌํฉํฐ๋งํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ์์ํด ๋ณด์ธ์.
์ ์ฐ์ ํ์
1์ผ ์ฐจ: ์ต์ด์ ํ์
์๋ ์์ ์ ์กฐ๊ฑด๋ถ ํ๋ก์ ํธ๊ฐ์์์ต๋๋ค. Dev ๊ฐ๋ฐํ๊ณผ Ops ์์ง๋์ด๊ฐ ์์์ต๋๋ค. ๊ทธ๋ค์ ๋์ผํ ๋ฌธ์ , ์ฆ ์๋ฒ๋ฅผ ๋ฐฐํฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ํด๊ฒฐํ๊ณ ์์์ต๋๋ค. ๋ฌธ์ ๋ ๊ฐ ํ์ด ๊ฐ์์ ๋ฐฉ์์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๋ ์ ์ด๋ค. ํ๋ก์ ํธ์์๋ Ansible์ ์ฌ์ฉํ์ฌ Dev ํ๊ณผ Ops ํ ๊ฐ์ ์ง์์ ๋๊ธฐํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
Day #89: ์ ์ฐ์ ํ์
์ค์ค๋ก๋ ๋์น ์ฑ์ง ๋ชปํ ์ฑ ์ต์ ์ ๋คํ๊ณ ์ถ์์ง๋ง ์ ์ฐ์ผ๋ก ํ๋ช ๋์์ต๋๋ค. ์ด๋ป๊ฒ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์?
- ์ฌ๊ธฐ์ ๊ธด๊ธํ ์์ ์ด ์์ต๋๋ค. ์ง์ ๋ถํ ํดํน์ ํ ๋ค์ ๊ณ ์น๊ฒ ์ต๋๋ค.
- ๋ฌธ์๋ฅผ ์์ฑํ ํ์๊ฐ ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ชจ๋ ๊ฒ์ด ๋ช ํํฉ๋๋ค.
- ์ ๋ Ansible/Python/Bash/Terraform์ ์๊ณ ์์ต๋๋ค! ๋ด๊ฐ ์ด๋ป๊ฒ ํผํ ์ ์๋์ง ๋ณด์ธ์!
- ์ ๋ ํ ์คํ ์ค๋ฒํ๋ก ๊ฐ๋ฐ์์ด๊ณ ์ด๊ฒ์ stackoverflow์์ ๋ณต์ฌํ์ต๋๋ค. ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ฉ์ ธ ๋ณด์ด๊ณ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฌธ์๊ฐ ์๊ณ ๊ธฐ๋ฅ์ด ๋ฌด์์ธ์ง, ํ์ํ์ง ์ฌ๋ถ๊ฐ ๋ช ํํ์ง ์์ ์ดํดํ ์ ์๋ ์ ํ์ ์ฝ๋๋ฅผ ์ป์ ์ ์์ง๋ง ๋ฌธ์ ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ ํ๊ณ ๋ชฉ๋ฐ๊ณผ ์ง์ง๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. , ์ํฉ์ ๋์ฑ ์ ํ์ํต๋๋ค.
- hosts: localhost
tasks:
- shell: echo -n Z >> a.txt && cat a.txt
register: output
delay: 1
retries: 5
until: not output.stdout.find("ZZZ")
Day #109: ๋ฌธ์ ์ธ์
์ฒ์์ ๊ตฌ์ํ๊ณ ๊ตฌํํ IaC ๋ชจ๋ธ์ ๋ ์ด์ ์ฌ์ฉ์/๋น์ฆ๋์ค/๋ค๋ฅธ ํ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ์ง ์์ผ๋ฉฐ ์ธํ๋ผ ๋ณ๊ฒฝ ์๊ฐ์ด ๋ ์ด์ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด ์๊ฐ, ์กฐ์น๋ฅผ ์ทจํด์ผ ํ ๋๋ผ๋ ๊ฒ์ ์ดํดํ๊ฒ ๋ฉ๋๋ค.
IaC ๋ฆฌํฉํ ๋ง
Day #139: ๋ฆฌํฉํ ๋ง์ด ์ ๋ง ํ์ํ๊ฐ์?
์๋๋ฌ ๋ฆฌํฉํ ๋ง์ ์์ํ๊ธฐ ์ ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ์ง๋ฌธ์ ๋ตํด์ผ ํฉ๋๋ค.
- ์ด ๋ชจ๋ ๊ฒ์ด ์ ํ์ํฉ๋๊น?
- ์๊ฐ ์์ด์?
- ์ง์์ ์ถฉ๋ถํฉ๋๊น?
์ง๋ฌธ์ ๋๋ตํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅธ๋ค๋ฉด ๋ฆฌํฉํ ๋ง์ด ์์๋๊ธฐ๋ ์ ์ ์ข
๋ฃ๋๊ฑฐ๋ ์ํฉ์ด ๋ ์
ํ๋ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ๊ฒฝํ์ด ์์์ต๋๋ค(
Day #149: ๋ฆฌํฉํ ๋ง ์ค๋น
๊ฐ์ฅ ๋จผ์ ์ค๋นํ๋ ๊ฒ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ์ญ์์ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ์ํตํ๊ณ ๋ฌธ์ ์์ญ์ ์ฐพ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ชจ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฒฐ๊ณผ ๊ฐ๋ ์ ์ด๋ป๊ฒ๋ ๊ธฐ๋กํฉ๋๋ค(์: ํฉ๋ฅ ๊ธฐ์ฌ). ๊ทธ๋์ ์ง๋ฌธ์ด ๋ฐ์ํ ๋ "๋ฌด์์ด ๊ฐ์ฅ ์ข์๊ฐ?" ๋๋ "์ด๋ ๊ฒ์ด ๋ง๋์?" ์ฐ๋ฆฌ๋ ๊ธธ์ ์์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ด ์์ด๋์ด๋ฅผ ๊ณ ์ํ์ต๋๋ค. ๋๋๊ณ ์ง๋ฐฐํ๋ค: ์ธํ๋ผ๋ฅผ ์์ ์กฐ๊ฐ/๋ฒฝ๋๋ก ๋๋๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ธํ๋ผ์ ๊ฒฉ๋ฆฌ๋ ๋ถ๋ถ์ ๊ฐ์ ธ์์ ๊ทธ๊ฒ์ด ์ํํ๋ ์์ ์ ์ดํดํ๊ณ ํ ์คํธ๋ฅผ ํตํด ๋ค๋ฃจ๋ฉฐ ์์๋ ์ผ๋ ค ์์ด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ธํ๋ผ ํ ์คํธ๊ฐ ์ด์์ด ๋๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ผ๋ฉฐ ์ฌ๊ธฐ์๋ ์ธํ๋ผ ํ ์คํธ ํผ๋ผ๋ฏธ๋๋ฅผ ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐ ์ค์ธ ์์ด๋์ด์ ์ ํํ ๋์ผํ์ง๋ง ์ธํ๋ผ์ ๋ํ ๊ฒ์ ๋๋ค. ๋ค์ฌ์ฐ๊ธฐ์ ๊ฐ์ ๊ฐ๋จํ ์ฌํญ์ ํ์ธํ๋ ๊ฐ์ธ๊ณ ๋น ๋ฅธ ํ ์คํธ์์ ์ ์ฒด ์ธํ๋ผ๋ฅผ ๋ฐฐํฌํ๋ ๊ฐ๋น์ผ ๋ณธ๊ฒฉ์ ์ธ ํ ์คํธ๋ก ์ ํํ๊ณ ์์ต๋๋ค.
Ansible ํ ์คํธ ์๋
ํ๋ก์ ํธ์์ Ansible ํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฃจ์๋์ง ์ค๋ช ํ๊ธฐ ์ ์, ๋ด๋ฆฐ ๊ฒฐ์ ์ ๋งฅ๋ฝ์ ์ดํดํ๊ธฐ ์ํด ์ด์ ์ ์ฌ์ฉํ ๊ธฐํ๊ฐ ์์๋ ์๋์ ์ ๊ทผ ๋ฐฉ์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
-997์ผ์ฐจ: SDS ์ ๊ณต
์ฒ์ Ansible์ ํ
์คํธํ ๊ฒ์ SDS(Software Defined Storage)๋ฅผ ๊ฐ๋ฐํ๋ ํ๋ก์ ํธ์์์์ต๋๋ค. ์ด ์ฃผ์ ์ ๋ํ ๋ณ๋์ ๊ธฐ์ฌ๊ฐ ์์ต๋๋ค.
Day # -701: Ansible ๋ฐ ํ ์คํธ ์ฃผ๋ฐฉ
Ansible ํ
์คํธ ์์ด๋์ด์ ๊ฐ๋ฐ์ ๋ฐ๋ก test kitchen/kitchen-ci ๋ฐ inspec๊ณผ ๊ฐ์ ๊ธฐ์ฑ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค. ์ ํ์ Ruby์ ๋ํ ์ง์์ ๋ฐ๋ผ ๊ฒฐ์ ๋์์ต๋๋ค(์์ธํ ๋ด์ฉ์ Habrรฉ์ ๋ํ ๊ธฐ์ฌ๋ฅผ ์ฐธ์กฐํ์ธ์:
์ผ๋ฐ์ ์ผ๋ก ์๋ฃจ์ ์ ํจ๊ณผ๊ฐ ์์์ง๋ง ์ด์ง์ฑ์ผ๋ก ์ธํด ์ผ๋ถ ์นจ์ ๋ฌผ์ด ๋ฐ์ํ์ต๋๋ค. ํ ์คํธ ๋์์๊ฐ ๊ธฐ๋ณธ ์ญํ 13๊ฐ์ ์์ ์ญํ ์ ๊ฒฐํฉํ ๋ฉํ ์ญํ 2๊ฐ๋ก ๋์ด๋์ ๊ฐ์๊ธฐ ํ ์คํธ๊ฐ ๊ฑฐ์ 70๋ฐฐ ๋ ๊ธธ์ด์ง 2๋ถ ๋์ ์คํ๋๊ธฐ ์์ํ์ต๋๋ค. XP(์ต์คํธ๋ฆผ ํ๋ก๊ทธ๋๋ฐ) ๋ฐฉ์์ ๋ํด ์ด์ผ๊ธฐํ๊ธฐ๊ฐ ์ด๋ ค์ ์ต๋๋ค. ์๋ํ๋ฉด... ์๋ฌด๋ 70๋ถ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ์ดํ์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ด์ ์์ต๋๋ค.
Day # -601: Ansible ๋ฐ ๋ถ์
๊ฐ๋ ์ ์ผ๋ก ์ด๋ testkitchen๊ณผ ์ ์ฌํ์ง๋ง ์ญํ ํ ์คํธ๋ฅผ docker๋ก ์ด๋ํ๊ณ ์คํ์ ๋ณ๊ฒฝํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ 20๊ฐ ์ญํ ์ ๋ํ ์๊ฐ์ด 25~7๋ถ ์ ๋๋ก ์์ ์ ์ผ๋ก ๋จ์ถ๋๋ค.
ํ ์คํธ๋ ์ญํ ์๋ฅผ 17๊ฐ๋ก ๋๋ฆฌ๊ณ 45๊ฐ ์ญํ ์ ๋ฆฐํ ํจ์ผ๋ก์จ 28๊ฐ์ ์ ํจ์ค ์ฌ๋ ์ด๋ธ์์ 2๋ถ ๋ง์ ์ด๋ฅผ ์คํํ์ต๋๋ค.
Day #167: ํ๋ก์ ํธ์ Ansible ํ ์คํธ ์ถ๊ฐ
์๋ง๋ ๋ฆฌํฉํ ๋ง ์์ ์ ์๋๋ฌ ์ํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค. ์์ ์ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋์ด ํฐ์คํผ์ผ๋ก ์ฝ๋ผ๋ฆฌ๋ฅผ ํ ์กฐ๊ฐ์ฉ ๋จน์ ์ ์๋๋ก ์ธก์ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๊ณ ์๋์ง, ์ผ๋ง๋ ๊ฐ์ผ ํ๋์ง์ ๋ํ ์ดํด๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๋ป๊ฒ ํ๋ ์๊ด์์ด ์ข ์ด์ ๊ธ์ ์จ๋ ๋๊ณ , ์ท์ฅ์ ์คํฐ์ปค๋ฅผ ๋ถ์ฌ๋ ๋๊ณ , Jira์์ ์์ ์ ์์ฑํด๋ ๋๊ณ , Google Docs๋ฅผ ์ด์ด์ ํ์ฌ ์ํ๋ฅผ ์ ์ด๋ ๋ฉ๋๋ค. ๊ฑฐ๊ธฐ. ๊ทธ ๊ณผ์ ์ด ์ฆ๊ฐ์ ์ด์ง ์๊ณ ๊ธธ๊ณ ์ง๋ฃจํ ๊ฒ์ด๋ผ๋ ์ฌ์ค ๋๋ฌธ์ ๋ค๋ฆฌ๊ฐ ์๋๋๋ค. ๋ฆฌํฉํ ๋ง ์ค์ ์์ด๋์ด๊ฐ ๊ณ ๊ฐ๋๊ณ , ํผ๊ณคํด์ง๊ณ , ์๋๋นํ๋ ๊ฒ์ ๋๊ตฌ๋ ์ํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ฆฌํฉํ ๋ง์ ๊ฐ๋จํฉ๋๋ค.
- ๋จน๋ค.
- ์.
- ์ฝ๋
- IaC ํ ์คํธ.
- ๋ฐ๋ณต
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์๋ํ ๋ชฉํ์ ๋๋ฌํ ๋๊น์ง ์ด๊ฒ์ ๋ฐ๋ณตํฉ๋๋ค.
๋ชจ๋ ๊ฒ์ ์ฆ์ ํ ์คํธํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ ์ ์์ผ๋ฏ๋ก ์ฒซ ๋ฒ์งธ ์์ ์ Linting๊ณผ ๊ตฌ๋ฌธ ํ์ธ๋ถํฐ ์์ํ๋ ๊ฒ์ด์์ต๋๋ค.
181์ผ์ฐจ: ๊ทธ๋ฆฐ ๋น๋ ๋ง์คํฐ
Linting์ Green Build Master๋ฅผ ํฅํ ์์ ์ฒซ๊ฑธ์์ ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ์ค๋จ๋์ง๋ ์์ง๋ง Jenkins์์ ํ๋ก์ธ์ค๋ฅผ ๋๋ฒ๊น ํ๊ณ ์นํ๊ฒฝ ๋น๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์์ด๋์ด๋ ํ ๊ฐ์ ์ต๊ด์ ๊ฐ๋ฐํ๋ ๊ฒ์ ๋๋ค.
- ๋นจ๊ฐ์ ํ ์คํธ๋ ๋์๋ค.
- ๋๋ ๋ญ๊ฐ๋ฅผ ๊ณ ์น๋ ๋์์ ์ฝ๋๋ฅผ ์ด์ ๋ณด๋ค ์กฐ๊ธ ๋ ์ข๊ฒ ๋ง๋ค๊ธฐ ์ํด ์์ต๋๋ค.
Day #193: Linting๋ถํฐ ๋จ์ ํ ์คํธ๊น์ง
์ฝ๋๋ฅผ ๋ง์คํฐ๋ก ๊ฐ์ ธ์ค๋ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ถํ๋ฉด ๋จ๊ณ๋ณ ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ์์ํ ์ ์์ต๋๋ค. Linting์ ์์ ์ญํ ๋ก ๋์ฒดํ๋ฉด ๋ฉฑ๋ฑ์ฑ ์์ด๋ ์ํํ ์ ์์ต๋๋ค. ์ญํ ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ์๋ ๋ฐฉ์์ ์ดํดํด์ผ ํฉ๋๋ค.
Day #211: ๋จ์ ํ ์คํธ๋ถํฐ ํตํฉ ํ ์คํธ๊น์ง
๋๋ถ๋ถ์ ์ญํ ์ด ๋จ์ ํ ์คํธ๋ก ์ฒ๋ฆฌ๋๊ณ ๋ชจ๋ ๊ฒ์ด ๋ฆฐํธ๋๋ฉด ํตํฉ ํ ์คํธ ์ถ๊ฐ๋ก ๋์ด๊ฐ ์ ์์ต๋๋ค. ์ ๊ฒ๋ค. ์ธํ๋ผ์ ๋จ์ผ ๋ธ๋ฆญ์ด ์๋๋ผ ์ ์ฒด ์ธ์คํด์ค ๊ตฌ์ฑ๊ณผ ๊ฐ์ ๋ธ๋ฆญ์ ์กฐํฉ์ ํ ์คํธํฉ๋๋ค.
jenkins๋ฅผ ์ฌ์ฉํ์ฌ ์ญํ /ํ๋ ์ด๋ถ์ ๋ณ๋ ฌ๋ก ์ฐ๊ฒฐํ ๋ค์ ์ปจํ ์ด๋์ ๋จ์ ํ ์คํธ, ๋ง์ง๋ง์ผ๋ก ํตํฉ ํ ์คํธ๋ฅผ ์ํํ๋ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ์์ฑํ์ต๋๋ค.
Jenkins + Docker + Ansible = ํ ์คํธ
- ์ ์ฅ์๋ฅผ ์ฒดํฌ์์ํ๊ณ ๋น๋ ๋จ๊ณ๋ฅผ ์์ฑํ์ธ์.
- Lint ํ๋ ์ด๋ถ ๋จ๊ณ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค.
- ๋ฆฐํธ ์ญํ ๋จ๊ณ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค.
- ๊ตฌ๋ฌธ ๊ฒ์ฌ ์ญํ ๋จ๊ณ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค.
- ํ
์คํธ ์ญํ ๋จ๊ณ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค.
- ๋ฆฐํธ ์ญํ .
- ๋ค๋ฅธ ์ญํ ์ ๋ํ ์ข ์์ฑ์ ํ์ธํ์ธ์.
- ๊ตฌ๋ฌธ์ ํ์ธํ์ธ์.
- ๋์ปค ์ธ์คํด์ค ์์ฑ
- ๋ถ์/๊ธฐ๋ณธ/playbook.yml์ ์คํํฉ๋๋ค.
- ๋ฉฑ๋ฑ์ฑ์ ํ์ธํ์ธ์.
- ํตํฉ ํ ์คํธ ์คํ
- ๋ง๊ฐ์ฌ
Day #271: ๋ฒ์ค ํฉํฐ
์ฒ์์๋ ๋ฆฌํฉํ ๋ง์ XNUMX~XNUMX๋ช ์ ์๊ท๋ชจ ๊ทธ๋ฃน์ผ๋ก ์งํํ์ต๋๋ค. ๊ทธ๋ค์ ๋ง์คํฐ์์ ์ฝ๋๋ฅผ ๊ฒํ ํ์ต๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํ์ ์ฝ๋ ์์ฑ ๋ฐฉ๋ฒ์ ๋ํ ์ง์์ ๊ฐ๋ฐํ๊ณ ์ฝ๋ ๊ฒํ ๋ฅผ ํตํด ์ธํ๋ผ์ ์๋ ๋ฐฉ์์ ๋ํ ์ง์์ ์ ํํ๋ ๋ฐ ๊ธฐ์ฌํ์ต๋๋ค. ์ฌ๊ธฐ์ ํ์ด๋ผ์ดํธ๋ ์ผ์ ์ ๋ฐ๋ผ ๋ฆฌ๋ทฐ์ด๋ฅผ ํ ๋ช ์ฉ ์ ์ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ ๋ ํ๋ฅ ๋ก ์๋ก์ด ๊ธฐ๋ฐ ์์ค๋ก ์ฌ๋ผ๊ฐ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ๋ ํธ์ํด์ผ ํด์. ๊ฒํ ํ๊ณ , ์ด๋ค ์์ ์ด ์ํ๋์๋์ง, ํ ๋ก ๋ด์ญ์ ํ๋ ์์ํฌ ๋ด์์ ํ์ธํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค. ์ฐ๋ฆฌ๋ jenkins + bitbucket + jira๋ฅผ ํตํฉํ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฆฌ๋ทฐ๋ ๋ง๋ณํต์น์ฝ์ด ์๋๋ฉฐ, ์ด์ฉ๋ค ๋ณด๋ ์ฐ๋ฆฌ๋ ๋ง์คํฐ ์ฝ๋์ ๋ค์ด๊ฐ ์คํจ ํ ์คํธ๋ฅผ ํ๊ฒ ๋์์ต๋๋ค.
- get_url:
url: "{{ actk_certs }}/{{ item.1 }}"
dest: "{{ actk_src_tmp }}/"
username: "{{ actk_mvn_user }}"
password: "{{ actk_mvn_pass }}"
with_subelements:
- "{{ actk_cert_list }}"
- "{{ actk_certs }}"
delegate_to: localhost
- copy:
src: "{{ actk_src_tmp }}/{{ item.1 }}"
dest: "{{ actk_dst_tmp }}"
with_subelements:
- "{{ actk_cert_list }}"
- "{{ actk_certs }}"
๊ทธ๋ฐ ๋ค์ ๊ทธ๋ค์ ๊ทธ๊ฒ์ ๊ณ ์ณค์ง๋ง ์์ฌ๋ฌผ์ ๋จ์ ์์์ต๋๋ค.
get_url:
url: "{{ actk_certs }}/{{ actk_item }}"
dest: "{{ actk_src_tmp }}/{{ actk_item }}"
username: "{{ actk_mvn_user }}"
password: "{{ actk_mvn_pass }}"
loop_control:
loop_var: actk_item
with_items: "{{ actk_cert_list }}"
delegate_to: localhost
- copy:
src: "{{ actk_src_tmp }}/{{ actk_item }}"
dest: "{{ actk_dst_tmp }}"
loop_control:
loop_var: actk_item
with_items: "{{ actk_cert_list }}"
Day #311: ํ ์คํธ ์๋ ํฅ์
์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ ๋ง์ ํ ์คํธ๊ฐ ์์๊ณ ๋น๋๋ ์ต์ ์ ๊ฒฝ์ฐ ์ต๋ XNUMX์๊ฐ๊น์ง ๋๋ฆฌ๊ฒ ์คํ๋์์ต๋๋ค. ๋ ํธ๋ก ์ค ํ๋์๋ "ํ ์คํธ๊ฐ ์์ผ๋ฉด ์ข์ง๋ง ๋๋ฆฌ๋ค"๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๊ฐ์ ๋จธ์ ์ ๋ํ ํตํฉ ํ ์คํธ๋ฅผ ํฌ๊ธฐํ๊ณ Docker์ ๋ง๊ฒ ์กฐ์ ํ์ฌ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค์์ต๋๋ค. ๋ํ ์ฌ์ฉ๋๋ ๋๊ตฌ ์๋ฅผ ์ค์ด๊ธฐ ์ํด testinfra๋ฅผ ansible ๊ฒ์ฆ์๋ก ๊ต์ฒดํ์ต๋๋ค.
์๋ฐํ ๋งํ๋ฉด ์ผ๋ จ์ ์กฐ์น๊ฐ ์์์ต๋๋ค.
- ๋์ปค๋ก ์ ํํ์ธ์.
- ์ข ์์ฑ์ผ๋ก ์ธํด ์ค๋ณต๋๋ ์ญํ ํ ์คํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ๋ ธ์์ ์๋ฅผ ๋๋ฆฌ์ญ์์ค.
- ํ ์คํธ ์คํ ์์.
- ๋ฆฐํธ ๋ฅ๋ ฅ ๋ชจ๋ ํ๋์ ๋ช ๋ น์ผ๋ก ๋ก์ปฌ๋ก.
๊ทธ ๊ฒฐ๊ณผ ์ ํจ์ค์ ํ์ดํ๋ผ์ธ๋ ํตํฉ๋์์ต๋๋ค.
- ๋น๋ ๋จ๊ณ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ชจ๋ ๋ณ๋ ฌ๋ก ๋ฆฐํธํฉ๋๋ค.
- ํ ์คํธ ์ญํ ๋จ๊ณ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค.
- ๋ง์นจ.
๊ตํ
์ ์ญ ๋ณ์ ํผํ๊ธฐ
Ansible์ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ํ์์ ๋ถ๋ถ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง์ role_a
ะธ role_b
# cat role_a/defaults/main.yml
---
msg: a
# cat role_a/tasks/main.yml
---
- debug:
msg: role_a={{ msg }}
# cat role_b/defaults/main.yml
---
msg: b
# cat role_b/tasks/main.yml
---
- set_fact:
msg: b
- debug:
msg: role_b={{ msg }}
- hosts: localhost
vars:
msg: hello
roles:
- role: role_a
- role: role_b
tasks:
- debug:
msg: play={{msg}}
์ฌ๋ฏธ์๋ ์ ์ ์ญํ ์ด ๋์ด๋ ์์์ ๊ฐ์ด ํญ์ ๋ช ํํ์ง ์์ ์ฌํญ์ ๋ฐ๋ผ ํ๋ ์ด๋ถ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ ๋๋ค. ๋ถํํ๋ ์ด๊ฒ์ด Ansible์ ํน์ฑ์ด๋ฉฐ ์ํํ ์ ์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ผ์ข ์ ํฉ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ญํ ๋ด์์๋ ์ด ์ญํ ์ ์ค๋ช ๋ ๋ณ์๋ง ์ฌ์ฉํฉ๋๋ค.
BAD: ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# cat roles/some_role/tasks/main.yml
---
debug:
var: java_home
์ข์: V defaults
ํ์ํ ๋ณ์๋ฅผ ์ ์ํ๊ณ ๋์ค์ ํด๋น ๋ณ์๋ง ์ฌ์ฉํ์ญ์์ค.
# cat roles/some_role/defaults/main.yml
---
r__java_home:
"{{ java_home | default('/path') }}"
# cat roles/some_role/tasks/main.yml
---
debug:
var: r__java_home
์ ๋์ฌ ์ญํ ๋ณ์
BAD: ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# cat roles/some_role/defaults/main.yml
---
db_port: 5432
์ข์: ๋ณ์์ ๋ํ ์ญํ ์์๋ ์ญํ ์ด๋ฆ ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ธ๋ฒคํ ๋ฆฌ๋ฅผ ๋ณด๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
# cat roles/some_role/defaults/main.yml
---
some_role__db_port: 5432
๋ฃจํ ์ ์ด ๋ณ์ ์ฌ์ฉ
BAD: ๋ฃจํ์์ ํ์ค ๋ณ์ ์ฌ์ฉ item
, ์ด ์์
/ํ๋ ์ด๋ถ์ด ์ด๋๊ฐ์ ํฌํจ๋์ด ์์ผ๋ฉด ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
---
- hosts: localhost
tasks:
- debug:
msg: "{{ item }}"
loop:
- item1
- item2
์ข์: ๋ค์์ ํตํด ๋ฃจํ์ ๋ณ์๋ฅผ ์ฌ์ ์ํฉ๋๋ค. loop_var
.
---
- hosts: localhost
tasks:
- debug:
msg: "{{ item_name }}"
loop:
- item1
- item2
loop_control:
loop_var: item_name
์ ๋ ฅ๋ณ์ ํ์ธ
์ฐ๋ฆฌ๋ ๋ณ์ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋์ํ์ต๋๋ค. ์์๋๋ก ์ ์๋์๋์ง, ์๋ฅผ ๋ค์ด ๋น ๊ฐ์ผ๋ก ์ฌ์ ์๋์ง ์์๋์ง ํ์ธํ๋ ๊ฒ์ ๋ถํ์ํ ์ผ์ด ์๋๋๋ค.
์ข์: ๋ณ์๋ฅผ ํ์ธํฉ๋๋ค.
- name: "Verify that required string variables are defined"
assert:
that: ahs_var is defined and ahs_var | length > 0 and ahs_var != None
fail_msg: "{{ ahs_var }} needs to be set for the role to work "
success_msg: "Required variables {{ ahs_var }} is defined"
loop_control:
loop_var: ahs_var
with_items:
- ahs_item1
- ahs_item2
- ahs_item3
ํด์ ์ฌ์ ์ ํผํ๊ณ ํ๋ฉด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ธ์.
์ญํ ์ ๋งค๊ฐ๋ณ์ ์ค ํ๋์ ํด์/์ฌ์ ์ด ํ์ํ ๊ฒฝ์ฐ ํ์ ๋งค๊ฐ๋ณ์ ์ค ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ ์ฒด ํด์/์ฌ์ ์ ์ฌ์ ์ํด์ผ ํ๋ฏ๋ก ๊ตฌ์ฑ์ด ๋ณต์กํด์ง๋๋ค.
BAD: ํด์/์ฌ์ ์ ์ฌ์ฉํฉ๋๋ค.
---
user:
name: admin
group: admin
์ข์: ํ๋ซ ๋ณ์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
---
user_name: admin
user_group: "{{ user_name }}"
๋ฉฑ๋ฑ์ฑ ํ๋ ์ด๋ถ ๋ฐ ์ญํ ๋ง๋ค๊ธฐ
์ญํ ๊ณผ ํ๋ ์ด๋ถ์ ๋ฉฑ๋ฑ์์ด์ด์ผ ํฉ๋๋ค. ๊ตฌ์ฑ ๋๋ฆฌํํธ์ ๋ฌด์ธ๊ฐ ์์์ ๋ํ ๋๋ ค์์ ์ค์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ถ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๊ฒ์ด ๊ธฐ๋ณธ ๋์์ ๋๋ค.
๋ช ๋ น ์ ธ ๋ชจ๋์ ์ฌ์ฉํ์ง ๋ง์ธ์.
์ ๋ชจ๋์ ์ฌ์ฉํ๋ฉด Ansible์ ํต์ฌ์ธ ์ ์ธ์ ํจ๋ฌ๋ค์ ๋์ ๋ช ๋ นํ ์ค๋ช ํจ๋ฌ๋ค์์ด ์์ฑ๋ฉ๋๋ค.
๋ถ์๋ฅผ ํตํด ์ญํ ํ ์คํธ
๋ถ์๋ ๋งค์ฐ ์ ์ฐํ ์กด์ฌ์ ๋๋ค. ๋ช ๊ฐ์ง ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ถ์ ๋ค์ค ์ธ์คํด์ค
ะ molecule.yml
์น์
์์ platforms
๋ฐฐํฌํ ์ ์๋ ๋ง์ ํธ์คํธ๋ฅผ ์ค๋ช
ํ ์ ์์ต๋๋ค.
---
driver:
name: docker
platforms:
- name: postgresql-instance
hostname: postgresql-instance
image: registry.example.com/postgres10:latest
pre_build_image: true
override_command: false
network_mode: host
- name: app-instance
hostname: app-instance
pre_build_image: true
image: registry.example.com/docker_centos_ansible_tests
network_mode: host
๋ฐ๋ผ์ ์ด๋ฌํ ํธ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. converge.yml
์ฌ์ฉ:
---
- name: Converge all
hosts: all
vars:
ansible_user: root
roles:
- role: some_role
- name: Converge db
hosts: db-instance
roles:
- role: some_db_role
- name: Converge app
hosts: app-instance
roles:
- role: some_app_role
Ansible ๊ฒ์ฆ์
๋ถ์์์๋ ansible์ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฆด๋ฆฌ์ค 3๋ถํฐ ๊ธฐ๋ณธ๊ฐ์ด์์ต๋๋ค. testinfra/inspec๋งํผ ์ ์ฐํ์ง๋ ์์ง๋ง ํ์ผ ๋ด์ฉ์ด ์์๊ณผ ์ผ์นํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
---
- name: Verify
hosts: all
tasks:
- name: copy config
copy:
src: expected_standalone.conf
dest: /root/wildfly/bin/standalone.conf
mode: "0644"
owner: root
group: root
register: config_copy_result
- name: Certify that standalone.conf changed
assert:
that: not config_copy_result.changed
๋๋ ์๋น์ค๋ฅผ ๋ฐฐํฌํ๊ณ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ์ฐ๊ธฐ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
---
- name: Verify
hosts: solr
tasks:
- command: /blah/solr/bin/solr start -s /solr_home -p 8983 -force
- uri:
url: http://127.0.0.1:8983/solr
method: GET
status_code: 200
register: uri_result
until: uri_result is not failed
retries: 12
delay: 10
- name: Post documents to solr
command: /blah/solr/bin/post -c master /exampledocs/books.csv
๋ชจ๋๊ณผ ํ๋ฌ๊ทธ์ธ์ ๋ณต์กํ ๋ก์ง์ ๋ฃ์ต๋๋ค.
Ansible์ ์ ์ธ์ ์ ๊ทผ ๋ฐฉ์์ ์นํธํ๋ฏ๋ก ์ฝ๋ ๋ถ๊ธฐ, ๋ฐ์ดํฐ ๋ณํ, ์ ธ ๋ชจ๋์ ์ํํ ๋ ์ฝ๋๋ฅผ ์ฝ๊ธฐ๊ฐ ์ด๋ ค์์ง๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ ์งํ๋ ค๋ฉด ์์ ๋ง์ ๋ชจ๋์ ๋ง๋ค์ด ์ด๋ฌํ ๋ณต์ก์ฑ์ ํด๊ฒฐํ๋ ๊ฒ์ด ๋ถํ์ํ ๊ฒ์ ์๋๋๋ค.
ํ๊ณผ ์๋ น ์์ฝ
- ์ ์ญ ๋ณ์๋ฅผ ํผํ์ธ์.
- ์ ๋์ฌ ์ญํ ๋ณ์.
- ๋ฃจํ ์ ์ด ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ ๋ ฅ๋ณ์๋ฅผ ํ์ธํ์ธ์.
- ํด์ ์ฌ์ ์ ํผํ๊ณ ํ๋ฉด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋ฉฑ๋ฑ์ฑ ํ๋ ์ด๋ถ ๋ฐ ์ญํ ์ ๋ง๋ญ๋๋ค.
- ๋ช ๋ น ์ ธ ๋ชจ๋์ ์ฌ์ฉํ์ง ๋ง์ธ์.
- ๋ถ์๋ฅผ ํตํด ์ญํ ์ ํ ์คํธํ์ธ์.
- ๋ชจ๋๊ณผ ํ๋ฌ๊ทธ์ธ์ ๋ณต์กํ ๋ก์ง์ ์ถ๊ฐํ์ธ์.
๊ฒฐ๋ก
IaC๊ฐ ์๋๋ผ๋ ํ๋ก์ ํธ์ ์ธํ๋ผ๋ฅผ ๊ทธ๋ฅ ๋ฆฌํฉํฐ๋งํ ์๋ ์์ต๋๋ค. ์ด๋ ์ธ๋ด์ ์๊ฐ, ์ง์์ด ํ์ํ ๊ธด ๊ณผ์ ์ ๋๋ค.
๋งํฌ
- ์ฌ๋ผ์ด๋
Ansible์ ํ ์คํธํ๊ณ ๋ฏธ์ณ๋ฒ๋ฆฌ์ง ์๋ ๋ฐฉ๋ฒ - Video
Ansible์ ํ ์คํธํ๊ณ ๋ฏธ์ณ๋ฒ๋ฆฌ์ง ์๋ ๋ฐฉ๋ฒ 200์ค์ ์ธํ๋ผ ์ฝ๋๋ฅผ ํ ์คํธํ๋ฉด์ ๋ฐฐ์ด ๊ฒ Ansible: 120๊ฐ์ ๋ง์ Coreos์์ Centos๋ก 18๊ฐ์ VM ๊ตฌ์ฑ ๋ง์ด๊ทธ๋ ์ด์ ๋ฐฐํฌํ์ ํ ์คํธํ ๋ ๋ชฉ๋ฐ ์์ ์์ ๊ฑฐ๋ฅผ ๋ถ์๋ ๋ฐฉ๋ฒ ๊ฐ๋ฅํ๋ค๋ฉด ์ ๋ฅผ ํ ์คํธํด ๋ณด์ธ์. ์๋๋ฉด YML ํ๋ก๊ทธ๋๋จธ๊ฐ Ansible ํ ์คํธ๋ฅผ ๊ฟ๊พธ๋์? ๋ฉ์ง IaC ํ ์คํธ ๊ธฐ์ฌ, ์ฐ์ค ๋ฐ ๋งํฌ ๋ชฉ๋ก ํฌ๋ก์ค ํฌ์คํธ Angielski ๋ฒ์
UPD1 2020.05.01 20:30 โ ํ๋ ์ด๋ถ์ ๊ธฐ๋ณธ ํ๋กํ์ผ๋ง์ ์ํด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. callback_whitelist = profile_tasks
์ค๋ซ๋์ ์ ํํ ๋ฌด์์ด ์๋ํ๋์ง ์ดํดํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋
UPD2 2020.05.03 16:34 -
์ถ์ฒ : habr.com