Ansible์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ์ ‘๊ทผ ๋ฐฉ์‹

์•ค์„œ๋ธ” ๋ฐ๋ธŒ์˜ต์Šค ์ฝ”๋“œ์Šคํƒ€์ผ

์—ฌ๊ธฐ์š”! ๋‚ด ์ด๋ฆ„์€ ๋ฐ๋‹ˆ์Šค ์นผ๋ฅ˜์ฆˆ๋‹ˆ ์ €๋Š” ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ์ž๋™ํ™” ๋ถ€์„œ์—์„œ ์—”์ง€๋‹ˆ์–ด๋กœ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์ผ ์ˆ˜๋ฐฑ ๋Œ€์˜ ์บ ํŽ˜์ธ ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ๊ฐ€ ์ถœ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ Ansible์„ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ๋Š” ๋ฐฐํฌ ์‹œ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋Š” ์ด๋ฏธ ํ”Œ๋ ˆ์ด๋ถ์—์„œ ์—ญํ• ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ์ฝ์–ด๋ณธ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฒ” ์‚ฌ๋ก€, ๊ทธ๋Ÿฌ๋‚˜ ๋น„์Šทํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ๋ฌด์—‡์„ ๋‹ด๋‹นํ•˜๋Š”์ง€ ์ฆ‰์‹œ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์—ญํ• ์ด ์žˆ๊ณ  ๋ณ€์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๊ฐ’๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ”Œ๋ ˆ์ด๋ถ์˜ ๋ณ€์ˆ˜ ๋…ผ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํšŒ์‚ฌ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ๊ณ  ๊ทธ ๊ฒฐ๊ณผ ํ”Œ๋ ˆ์ด๋ถ์˜ ๋ณ€์ˆ˜ ์„ค๊ณ„ ๊ทœ์น™์„ ์ž‘์„ฑํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์–ด๋Š ์ •๋„ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Ansible์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ์ ‘๊ทผ ๋ฐฉ์‹

์—ญํ• ์˜ ๋ณ€์ˆ˜

์—ญํ• ์€ ๋ฐฐํฌ ์‹œ์Šคํ…œ์˜ ๋ณ„๋„ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹œ์Šคํ…œ ๊ฐœ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—ญํ•  ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์—ญํ• ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. api, ์„œ๋ฒ„์— Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‚˜์š”?

Ansible์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ์ ‘๊ทผ ๋ฐฉ์‹

๊ฐ€๋ณ€ ์—ญํ• ์€ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ะกะฒะพะนัั‚ะฒะฐ
    a) ะฝะตะทะฐะฒะธัะธะผั‹ะต ะพั‚ ัั€ะตะดั‹
    ะฑ) ะทะฐะฒะธัะธะผั‹ะต ะพั‚ ัั€ะตะดั‹
2. ะกะฒัะทะธ
    a) ัะปัƒัˆะฐั‚ะตะปะธ 
    ะฑ) ะทะฐะฟั€ะพัั‹ ะฒะฝัƒั‚ั€ะธ ัะธัั‚ะตะผั‹
    ะฒ) ะทะฐะฟั€ะพัั‹ ะฒ ัั€ะตะดัƒ

๋ณ€์ˆ˜ ์†์„ฑ ์—ญํ• ์˜ ํ–‰๋™์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๋ณ€์ˆ˜ - ์—ญํ•  ์™ธ๋ถ€์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์„ ๊ฐ–๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ๋ฆฌ์Šค๋„ˆ - ์š”์ฒญ ๋ณ€์ˆ˜๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์„ ๊ฐ–๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, 1a, 2a, 2b๋Š” ํ™˜๊ฒฝ(ํ•˜๋“œ์›จ์–ด, ์™ธ๋ถ€์ž์› ๋“ฑ)์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋กœ defaults ์—ญํ• ์— ๊ธฐ๋ณธ๊ฐ’์„ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, 1.b, 2.c ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์Šคํƒ ๋“œ์—์„œ ์Šคํƒ ๋“œ๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— 'example' ์ด์™ธ์˜ ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฝ”๋“œ ์Šคํƒ€์ผ

  • ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ์—ญํ•  ์ด๋ฆ„์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚˜์ค‘์— ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€, ๋ฌด์—‡์„ ๋‹ด๋‹นํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญํ• ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์บก์Šํ™” ์›์น™์„ ๋”ฐ๋ฅด๊ณ  ์—ญํ•  ์ž์ฒด ๋˜๋Š” ํ˜„์žฌ ์—ญํ• ์ด ์˜์กดํ•˜๋Š” ์—ญํ• ์— ์ •์˜๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜์— ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. Ansible์—์„œ๋Š” ์‚ฌ์ „์˜ ๊ฐœ๋ณ„ ๊ฐ’์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์ž˜๋ชป๋œ ๋ณ€์ˆ˜์˜ ์˜ˆ:

    myrole_user:
        login: admin
        password: admin

    ์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์ธ์€ ๋…๋ฆฝ๋ณ€์ˆ˜์ด๊ณ , ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ข…์†๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ
    ๊ทธ๊ฒƒ๋“ค์€ ์‚ฌ์ „์œผ๋กœ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์™„์ „ํžˆ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์–ธ์ œ๋‚˜. ๋งค์šฐ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค:

    myrole_user_login: admin
    myrole_user_password: admin

๋ฐฐํฌ ํ”Œ๋ ˆ์ด๋ถ์˜ ๋ณ€์ˆ˜

๋ฐฐํฌ ํ”Œ๋ ˆ์ด๋ถ(์ดํ•˜ ํ”Œ๋ ˆ์ด๋ถ)์„ ์ปดํŒŒ์ผํ•  ๋•Œ ๋ณ„๋„์˜ ์ €์žฅ์†Œ์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ์—ญํ• ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์—ญํ• ์€ ์ž์ฒด git ์ €์žฅ์†Œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ญํ• ๊ณผ ํ”Œ๋ ˆ์ด๋ถ์€ ๋ฐฐํฌ ์‹œ์Šคํ…œ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋…๋ฆฝ์  ๊ฐœ์ฒด์ด๋ฉฐ ํ•œ ๊ฐœ์ฒด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ๊ฐœ์ฒด์˜ ์ž‘๋™์— ์˜ํ–ฅ์„ ์ฃผ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด ํ”Œ๋ ˆ์ด๋ถ์„ ์ปดํŒŒ์ผํ•  ๋•Œ ํ”Œ๋ ˆ์ด๋ถ ๋ณ€์ˆ˜์™€ ์ธ๋ฒคํ† ๋ฆฌ ๋ณ€์ˆ˜ ๋‘ ๊ณณ์—์„œ ์—ญํ•  ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

mydeploy                        # ะšะฐั‚ะฐะปะพะณ ะดะตะฟะปะพั
โ”œโ”€โ”€ deploy.yml                  # ะŸะปะตะนะฑัƒะบ ะดะตะฟะปะพั
โ”œโ”€โ”€ group_vars                  # ะšะฐั‚ะฐะปะพะณ ะฟะตั€ะตะผะตะฝะฝั‹ั… ะฟะปะตะนะฑัƒะบะฐ
โ”‚   โ”œโ”€โ”€ all.yml                 # ะคะฐะนะป ะดะปั ะฟะตั€ะตะผะตะฝะฝั‹ั… ัะฒัะทะธ ะฒัะตะน ัะธัั‚ะตะผั‹
โ”‚   โ””โ”€โ”€ myapi.yml               # ะคะฐะนะป ะฟะตั€ะตะผะตะฝะฝั‹ั… ัะฒะพะนัั‚ะฒ ะณั€ัƒะฟะฟั‹ myapi
โ””โ”€โ”€ inventories                 #
    โ””โ”€โ”€ prod                    # ะšะฐั‚ะฐะปะพะณ ะพะบั€ัƒะถะตะฝะธั prod
        โ”œโ”€โ”€ prod.ini            # ะ˜ะฝะฒะตะฝั‚ะพั€ะธ ั„ะฐะนะป
        โ””โ”€โ”€ group_vars          # ะšะฐั‚ะฐะปะพะณ ะดะปั ะฟะตั€ะตะผะตะฝะฝั‹ั… ะธะฝะฒะตะฝั‚ะพั€ะธ
            โ””โ”€โ”€ myapi           #
                โ”œโ”€โ”€ vars.yml    # ะกั€ะตะดะพะทะฐะฒะธัะธะผั‹ะต ะฟะตั€ะตะผะตะฝะฝั‹ะต ะณั€ัƒะฟะฟั‹ myapi
                โ””โ”€โ”€ vault.yml   # ะกะตะบั€ะตั‚ั‹ (ะฒัะตะณะดะฐ ัั€ะตะดะพะทะฐะฒะธัะธะผั‹) *

* - ๋ณ€์ˆ˜ ๋ฐ Vault

์ฐจ์ด์ ์€ ํ”Œ๋ ˆ์ด๋ถ ๋ณ€์ˆ˜๋Š” ๋™์ผํ•œ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ํ”Œ๋ ˆ์ด๋ถ์„ ํ˜ธ์ถœํ•  ๋•Œ ํ•ญ์ƒ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๊ฐ€ ํ™˜๊ฒฝ ๋…๋ฆฝ์  ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ, ์ธ๋ฒคํ† ๋ฆฌ ๋ณ€์ˆ˜๋Š” ํŠน์ • ํ™˜๊ฒฝ์—๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ์ด๋Š” ํ™˜๊ฒฝ๋ณ„ ๋ณ€์ˆ˜์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จผ์ € ํ”Œ๋ ˆ์ด๋ถ ๋ณ€์ˆ˜์—์„œ ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•œ ๋‹ค์Œ ํ•˜๋‚˜์˜ ์ธ๋ฒคํ† ๋ฆฌ์—์„œ ๋ณ„๋„๋กœ ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ด๋ฏธ ์ด ๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜๊ฐ€ ํ™˜๊ฒฝ์— ์ข…์†์ ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์ ์ ˆํ•œ ์œ„์น˜์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ SSL ํ™œ์„ฑํ™”๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ์˜ค๋žซ๋™์•ˆ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ๋“œ ์ค‘ ํ•˜๋‚˜์—์„œ ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ SSL์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„์—๋Š” ํ™˜๊ฒฝ ๋…๋ฆฝ์ ์ด ๋˜์–ด ํ”Œ๋ ˆ์ด๋ถ ๋ณ€์ˆ˜๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฃน์˜ ์†์„ฑ ๋ณ€์ˆ˜

Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค๋ฅด์ง€๋งŒ ์„ค์ •์ด ๋‹ค๋ฅธ 1๊ฐœ์˜ ์„œ๋ฒ„ ๊ทธ๋ฃน์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ทธ๋ฆผ 2์˜ ๋ชจ๋ธ์„ ํ™•์žฅํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Ansible์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ์ ‘๊ทผ ๋ฐฉ์‹

์ด ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด๋ถ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค.

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

ํ”Œ๋ ˆ์ด๋ถ์—๋Š” ์„ธ ๊ฐœ์˜ ๊ทธ๋ฃน์ด ์žˆ์œผ๋ฏ€๋กœ, group_vars ์ธ๋ฒคํ† ๋ฆฌ ๋ณ€์ˆ˜์™€ ํ”Œ๋ ˆ์ด๋ถ ๋ณ€์ˆ˜์— ๋™์ผํ•œ ์ˆ˜์˜ ๊ทธ๋ฃน ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ฆ‰์‹œ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน ํŒŒ์ผ์€ ํ”Œ๋ ˆ์ด๋ถ์— ์žˆ๋Š” ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด๋ถ ๋ณ€์ˆ˜์—์„œ ๊ทธ๋ฃน ํŒŒ์ผ์„ ์—ด๋ฉด ๊ทธ๋ฃน์— ์„ค์น˜๋œ ์—ญํ• ์˜ ๊ธฐ๋ณธ ๋™์ž‘๊ณผ์˜ ๋ชจ๋“  ์ฐจ์ด์ ์„ ์ฆ‰์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ๊ณ  ๋ณ€์ˆ˜: ์„œ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๊ทธ๋ฃน ํ–‰๋™์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์Šคํƒ€์ผ

  • host_vars ๋ณ€์ˆ˜๋Š” ์‹œ์Šคํ…œ์„ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ณ  ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ๋‚˜์ค‘์— "์ด ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์™€ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด์— ๋Œ€ํ•œ ๋Œ€๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ†ต์‹  ๋ณ€์ˆ˜

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์†์„ฑ ๋ณ€์ˆ˜์˜ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ†ต์‹  ๋ณ€์ˆ˜๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
์ฐจ์ด์ ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ทธ๋ฃน์—์„œ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๊ทธ๋žฌ์–ด์š” ์ƒ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ดด๋ฌผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
hostvars[groups['bbauth'][0]]['auth_bind_port']๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ์ฆ‰์‹œ ์ด๋ฅผ ๊ฑฐ๋ถ€ํ–ˆ๋‹ค.
๋‹จ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ฒซ์งธ, ๋ถ€ํ”ผ๊ฐ. ๋‘˜์งธ, ๊ทธ๋ฃน์˜ ํŠน์ • ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ž…๋‹ˆ๋‹ค. ์…‹์งธ, ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ ค๋ฉด ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์—์„œ ์‚ฌ์‹ค์„ ์ˆ˜์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ํ†ต์‹ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€๋‹ค.

ํ†ต์‹  ๋ณ€์ˆ˜ - ํ”Œ๋ ˆ์ด๋ถ์— ์†ํ•˜๋ฉฐ ์‹œ์Šคํ…œ ๊ฐœ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

ํ†ต์‹  ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์— ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. group_vars/all/vars ๊ฐ ๊ทธ๋ฃน์—์„œ ๋ชจ๋“  ๋ฆฌ์Šค๋„ˆ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ณ€์ˆ˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ œ๊ฑฐ๋œ ๊ทธ๋ฃน์˜ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด๋ฆ„์ด ํ†ต์ผ๋˜๊ณ  ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์ œ์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Ansible์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ์ ‘๊ทผ ๋ฐฉ์‹

์„œ๋กœ ์˜์กดํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.

# roles/api/defaults:
# ะŸะตั€ะตะผะตะฝะฝะฐั ะทะฐะฟั€ะพัะฐ
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"

# roles/auth/defaults:
# ะŸะตั€ะตะผะตะฝะฝะฐั ัะปัƒัˆะฐั‚ะตะปัŒ
auth_bind_port: "20000"

๊ณตํ†ต๋ณ€์ˆ˜์— ๋„ฃ์–ด๋ณด์ž group_vars/all/vars ๋ชจ๋“  ์ฒญ์ทจ์ž๋ฅผ ์„ ํƒํ•˜๊ณ  ์ œ๋ชฉ์— ๊ทธ๋ฃน ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

# group_vars/all/vars
bbauth_auth_bind_port: "20000"
ghauth_auth_bind_port: "30000"

# group_vars/bbauth/vars
auth_bind_port: "{{ bbauth_auth_bind_port }}"

# group_vars/ghauth/vars
auth_bind_port: "{{ ghauth_auth_bind_port }}"

# group_vars/myapi/vars
api_auth1_address: "http://{{ bbauth_auth_service_name }}:{{ bbauth_auth_bind_port }}"
api_auth2_address: "http://{{ ghauth_auth_service_name }}:{{ ghauth_auth_bind_port }}"

์ด์ œ ์ปค๋„ฅํ„ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์š”์ฒญ์ด ํฌํŠธ๊ฐ€ ์žˆ๋Š” ๋™์ผํ•œ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์Šคํƒ€์ผ

  • ์—ญํ• ๊ณผ ๊ทธ๋ฃน์€ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ๊ฐœ์ฒด์ด๋ฏ€๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ๋งํฌ ๋ณ€์ˆ˜๋Š” ์ด๋“ค์ด ์‹œ์Šคํ…œ์˜ ์—ญํ• ์ด ์•„๋‹Œ ํŠน์ • ์„œ๋ฒ„ ๊ทธ๋ฃน์— ์†ํ•ด ์žˆ์Œ์„ ์ •ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ์ข…์† ํŒŒ์ผ

์—ญํ• ์€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŒŒ์ผ์˜ ์˜ˆ๋กœ๋Š” SSL ์ธ์ฆ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ €์žฅ
๋ณ€์ˆ˜์—์„œ๋Š” ๊ทธ๋‹ค์ง€ ํŽธ๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฝ๋กœ๋ฅผ ๋ณ€์ˆ˜ ์•ˆ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค api_ssl_key_file: "/path/to/file".

ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ํ‚ค ์ธ์ฆ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋ฏ€๋กœ ์ด๋Š” ํ™˜๊ฒฝ ์ข…์† ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ํŒŒ์ผ์— ์œ„์น˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
group_vars/myapi/vars ๋ณ€์ˆ˜ ๋ชฉ๋ก์ด๋ฉฐ '์˜ˆ๋ฅผ ๋“ค์–ด' ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ํ”Œ๋ ˆ์ด๋ถ ์ €์žฅ์†Œ์— ํ‚ค ํŒŒ์ผ์„ ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
files/prod/certs/myapi.key์ด๋ฉด ๋ณ€์ˆ˜ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
api_ssl_key_file: "prod/certs/myapi.key". ํŽธ๋ฆฌํ•จ์€ ํŠน์ • ์Šคํƒ ๋“œ์—์„œ ์‹œ์Šคํ…œ ๋ฐฐํฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ €์žฅ์†Œ์— ํŒŒ์ผ์„ ์ €์žฅํ•  ์ „์šฉ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ์ธ์ฆ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ์— ๋Œ€ํ•œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ํ™˜๊ฒฝ์— ์—ฌ๋Ÿฌ ์Šคํƒ ๋“œ

๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ์ฐจ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ๊ฑฐ์˜ ๋™์ผํ•œ ์—ฌ๋Ÿฌ ์Šคํƒ ๋“œ๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ™˜๊ฒฝ ์ข…์† ๋ณ€์ˆ˜๋ฅผ ํ•ด๋‹น ํ™˜๊ฒฝ ๋‚ด์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜์™€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ณ€์ˆ˜๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ›„์ž๋ฅผ ์žฌ๊ณ  ํŒŒ์ผ ์ž์ฒด๋กœ ์ง์ ‘ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ์กฐ์ž‘ ํ›„์—๋Š” ํ™˜๊ฒฝ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ง์ ‘ ๋‹ค๋ฅธ ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

group_vars ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์žฌ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ ํ”„๋กœ์ ํŠธ์˜ ์ตœ์ข… ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

mydeploy                        # ะšะฐั‚ะฐะปะพะณ ะดะตะฟะปะพั
โ”œโ”€โ”€ deploy.yml                  # ะŸะปะตะนะฑัƒะบ ะดะตะฟะปะพั
โ”œโ”€โ”€ files                       # ะšะฐั‚ะฐะปะพะณ ะดะปั ั„ะฐะนะปะพะฒ ะดะตะฟะปะพั
โ”‚   โ”œโ”€โ”€ prod                    # ะšะฐั‚ะพะปะพะณ ะดะปั ัั€ะตะดะพะทะฐะฒะธัะธะผั‹ั… ั„ะฐะนะปะพะฒ ัั‚ะตะฝะดะฐ prod
โ”‚   โ”‚   โ””โ”€โ”€ certs               # 
โ”‚   โ”‚       โ””โ”€โ”€ myapi.key       #
โ”‚   โ””โ”€โ”€ test1                   # ะšะฐั‚ะฐะปะพะณ ะดะปั ัั€ะตะดะพะทะฐะฒะธัะธะผั‹ั… ั„ะฐะนะปะพะฒ ัั‚ะตะฝะดะฐ test1
โ”œโ”€โ”€ group_vars                  # ะšะฐั‚ะฐะปะพะณ ะฟะตั€ะตะผะตะฝะฝั‹ั… ะฟะปะตะนะฑัƒะบะฐ
โ”‚   โ”œโ”€โ”€ all.yml                 # ะคะฐะนะป ะดะปั ะฟะตั€ะตะผะตะฝะฝั‹ั… ัะฒัะทะธ ะฒัะตะน ัะธัั‚ะตะผั‹
โ”‚   โ”œโ”€โ”€ myapi.yml               # ะคะฐะนะป ะฟะตั€ะตะผะตะฝะฝั‹ั… ัะฒะพะนัั‚ะฒ ะณั€ัƒะฟะฟั‹ myapi
โ”‚   โ”œโ”€โ”€ bbauth.yml              # 
โ”‚   โ””โ”€โ”€ ghauth.yml              #
โ””โ”€โ”€ inventories                 #
    โ”œโ”€โ”€ prod                    # ะšะฐั‚ะฐะปะพะณ ะพะบั€ัƒะถะตะฝะธั prod
    โ”‚   โ”œโ”€โ”€ group_vars          # ะšะฐั‚ะฐะปะพะณ ะดะปั ะฟะตั€ะตะผะตะฝะฝั‹ั… ะธะฝะฒะตะฝั‚ะพั€ะธ
    โ”‚   โ”‚   โ”œโ”€โ”€ myapi           #
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ vars.yml    # ะกั€ะตะดะพะทะฐะฒะธัะธะผั‹ะต ะฟะตั€ะตะผะตะฝะฝั‹ะต ะณั€ัƒะฟะฟั‹ myapi
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ vault.yml   # ะกะตะบั€ะตั‚ั‹ (ะฒัะตะณะดะฐ ัั€ะตะดะพะทะฐะฒะธัะธะผั‹)
    โ”‚   โ”‚   โ”œโ”€โ”€ bbauth          # 
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ vars.yml    #
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ vault.yml   #
    โ”‚   โ”‚   โ””โ”€โ”€ ghauth          #
    โ”‚   โ”‚       โ”œโ”€โ”€ vars.yml    #
    โ”‚   โ”‚       โ””โ”€โ”€ vault.yml   #
    โ”‚   โ””โ”€โ”€ prod.ini            # ะ˜ะฝะฒะตะฝั‚ะพั€ะธ ัั‚ะตะฝะดะฐ prod
    โ””โ”€โ”€ test                    # ะšะฐั‚ะฐะปะพะณ ะพะบั€ัƒะถะตะฝะธั test
        โ”œโ”€โ”€ group_vars          #
        โ”‚   โ”œโ”€โ”€ myapi           #
        โ”‚   โ”‚   โ”œโ”€โ”€ vars.yml    #
        โ”‚   โ”‚   โ””โ”€โ”€ vault.yml   #
        โ”‚   โ”œโ”€โ”€ bbauth          #
        โ”‚   โ”‚   โ”œโ”€โ”€ vars.yml    #
        โ”‚   โ”‚   โ””โ”€โ”€ vault.yml   #
        โ”‚   โ””โ”€โ”€ ghauth          #
        โ”‚       โ”œโ”€โ”€ vars.yml    #
        โ”‚       โ””โ”€โ”€ vault.yml   #
        โ”œโ”€โ”€ test1.ini           # ะ˜ะฝะฒะตะฝั‚ะพั€ะธ ัั‚ะตะฝะดะฐ test1 ะฒ ัั€ะตะดะต test
        โ””โ”€โ”€ test2.ini           # ะ˜ะฝะฒะตะฝั‚ะพั€ะธ ัั‚ะตะฝะดะฐ test2 ะฒ ัั€ะตะดะต test

ํ•ฉ์‚ฐ

๊ธฐ์‚ฌ์— ๋”ฐ๋ผ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•œ ํ›„ ๊ฐ ๋ณ€์ˆ˜ ํŒŒ์ผ์€ ํŠน์ • ์ž‘์—…์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ์—๋Š” ํŠน์ • ์ž‘์—…์ด ์žˆ์œผ๋ฏ€๋กœ ๊ฐ ํŒŒ์ผ์˜ ์ •ํ™•์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ์‚ฌ๋žŒ์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ์Šคํ…œ ๋ฐฐํฌ ๊ฐœ๋ฐœ์ž๋Š” ํ”Œ๋ ˆ์ด๋ถ ๋ณ€์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฑ„์šธ ์ฑ…์ž„์ด ์žˆ๋Š” ๋ฐ˜๋ฉด, ์ธ๋ฒคํ† ๋ฆฌ์— ์„ค๋ช…๋œ ์ž…์žฅ์„ ๊ฐ€์ง„ ๊ด€๋ฆฌ์ž๋Š” ๋ณ€์ˆ˜ ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ์ง์ ‘ ์ฑ„์šธ ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ญํ• ์€ ์ž์ฒด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–์ถ˜ ์ž์ฒด ๊ฐœ๋ฐœ ๋‹จ์œ„๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์—ญํ•  ๊ฐœ๋ฐœ์ž๋Š” ์—ญํ• ์„ ์‹œ์Šคํ…œ์— ๋งž์ถฐ ์กฐ์ •ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํŠนํžˆ ์บ ํŽ˜์ธ ๋‚ด ๋ชจ๋“  ์‹œ์Šคํ…œ์˜ ๊ณตํ†ต ์—ญํ• ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๋Š” ๋” ์ด์ƒ ๋ฐฐํฌ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์€ ํ™˜๊ฒฝ ์ข…์† ๋ณ€์ˆ˜ ํŒŒ์ผ์„ ์ฑ„์šฐ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

๋ฌธํ•™

  1. ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั

์ €์ž

์นผ๋ฅ˜์ฆˆ๋‹ˆ ๋ฐ๋‹ˆ์Šค ์•Œ๋ ‰์‚ฐ๋“œ๋กœ๋น„์น˜

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€