<p data-ke-size="size16"> </p>
<article id="0187aca5-98c9-4f6c-9421-c466dcfee382" class="page sans">
<div class="page-body">
<h3 id="7310cd2f-7842-4aff-8b7e-9157b58ef835" class="" data-ke-size="size23">Role</h3>
<ul id="e23b83e9-244f-4035-acda-39c62eef0839" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">정의 : 플레이북 내용을 기능 단위로 나누어 공통 부품으로 관리/재사용하기 위한 구조</li>
</ul>
<ul id="7beb3248-7ed9-4d2c-bf9c-988ae33f2089" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">롤을 사용하면 사용자들이 잘 만들어놓은 Playbook의 조합을 가져다가 활용할 수 있음</li>
</ul>
<ul id="d36f9b30-065d-4a75-a915-35584b6f584a" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">앤서블 갤럭시를 통해 템플릿을 공유하고 다운받을 수 있음</li>
</ul>
<ul id="8d697cb2-75df-4762-a0af-eacb17ac1a5a" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">이미 많은 사용자가 사용 중이고, 보안적으로 검증된 Playbook들을 파라미터 변경만으로 손쉽게 가져다 사용할 수 있기 때문에 안정성과 생산성을 높일 수 있음</li>
</ul>
<ul id="ac54f5df-d3ab-469d-b420-0bf067296854" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">여러 사람과 공유할 수 있으려면 표준화된 설정이 있어야 함. 앤서블의 롤도 사전에 정의된 디렉토리 구조와 설정들을 제공하고 이 가이드라인에 맞춰 롤을 작성해야함</li>
</ul>
<ul id="eb5d9c5e-a97b-4763-a4a1-98a51c10a86b" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">롤을 실행하려면 반드시 Playbook을 통해서 실행해야함
<ul id="91ebd7ae-563f-49de-9d94-ffedb305dc86" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: circle;">Playbook에서 Role 사용</li>
</ul>
<ul id="1b2495a6-c0e3-469e-a574-238960fb9765" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: circle;">하나의 Playbook에서 여러 Role을 사용할 수도 있음</li>
</ul>
</li>
</ul>
<h3 id="a1645d2a-3fcb-46ba-8bc0-93d9800ec9c8" class="" data-ke-size="size23">Role 디렉토리 구조</h3>
<table id="27769945-c209-4519-b4a2-5ff076271b7d" class="simple-table" data-ke-align="alignLeft">
<tbody>
<tr id="b90c5595-d356-4d0a-90d0-10ecb7af2d5e">
<td id="iVT_" class="" style="width: 184.99999237060547px;"><b>하위 디렉터리</b></td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;"><b>기능</b></td>
</tr>
<tr id="c5c04245-e0ea-43d4-80f6-65788f9c91c3">
<td id="iVT_" class="" style="width: 184.99999237060547px;">defaults</td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;">이 디렉터리의 main.yml 파일에는 롤이 사용될 때 덮어쓸 수 있는 롤 변수의 기본값이 포함되어 있습니다.<br />이러한 변수는 우선순위가 낮으며 플레이에서 변경할 수 있습니다.</td>
</tr>
<tr id="eba1e410-001d-4d1d-a93c-39b04cf5661f">
<td id="iVT_" class="" style="width: 184.99999237060547px;">files</td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;">이 디렉터리에는 롤 작업에서 참조한 정적 파일이 있습니다.</td>
</tr>
<tr id="2a3b0813-3d7e-4527-8132-caafa24a0fcf">
<td id="iVT_" class="" style="width: 184.99999237060547px;">handlers</td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;">이 디렉터리의 main.yml 파일에는 롤의 핸들러 정의가 포함되어 있습니다.</td>
</tr>
<tr id="dfb007ed-fe9a-4982-b216-ef963bfab47b">
<td id="iVT_" class="" style="width: 184.99999237060547px;">meta</td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;">이 디렉터리의 main.yml 파일에는 작성자, 라이센스, 플랫폼 및 옵션, 롤 종속성을 포함한 롤에 대한 정보가 들어 있습니다.</td>
</tr>
<tr id="de086bb0-961d-4991-967b-aa11ea803515">
<td id="iVT_" class="" style="width: 184.99999237060547px;">tasks</td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;">이 디렉터리의 main.yml 파일에는 롤의 작업 정의가 포함되어 있습니다.</td>
</tr>
<tr id="bf6c1f9f-2674-4ad8-80c3-ac7f4ef1ea42">
<td id="iVT_" class="" style="width: 184.99999237060547px;">templates</td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;">이 디렉터리에는 롤 작업에서 참조할 Jinja2 템플릿이 있습니다.</td>
</tr>
<tr id="e07d244a-2544-4989-b441-fb3958b04a33">
<td id="iVT_" class="" style="width: 184.99999237060547px;">tests</td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;">이 디렉터리에는 롤을 테스트하는 데 사용할 수 있는 인벤토리와 test.yml 플레이북이 포함될 수 있습니다.</td>
</tr>
<tr id="023942b8-5acf-430b-82e5-677ff89223ca">
<td id="iVT_" class="" style="width: 184.99999237060547px;">vars</td>
<td id="ZwFR" class="" style="width: 483.99998474121094px;">이 디렉터리의 main.yml 파일은 롤의 변수 값을 정의합니다. 종종 이러한 변수는 롤 내에서 내부 목적으로 사용됩니다.<br />또한 우선순위가 높으며, 플레이북에서 사용될 때 변경되지 않습니다.</td>
</tr>
</tbody>
</table>
<h3 id="dae7475f-9fa8-43be-9d89-92dc258fff4f" class="" data-ke-size="size23">사용 방법</h3>
<ul id="2660b041-1c51-428b-8eb2-b0b70b144cbb" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">ansible-galaxy 명령어를 사용해서 Role 작성 준비
<pre id="0905258c-13d0-4d73-8e10-85f766308338" class="code crmsh"><code>ansible-galaxy role ROLE_ACTION option
# Role 작성을 위한 초기 셋팅
ansible-galaxy role init <Role 이름></code></pre>
</li>
</ul>
<ul id="9f8e86fa-8086-4294-965a-78f662e9872a" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">Role 구성에 필요한 task와 handler 등의 스크립트 작성</li>
</ul>
<ul id="f23c90a8-e302-4ea9-9bf3-f31d16b39ad9" class="bulleted-list" style="list-style-type: disc;" data-ke-list-type="disc">
<li style="list-style-type: disc;">Playbook 작성
<pre id="50021391-d4ba-4e58-96d0-fc0fb3744e45" class="code routeros"><code>- hosts: tnode1
tasks:
- name: Print start play
ansible.builtin.debug:
msg: "Let's start role play"
- name: Install Service by role
ansible.builtin.import_role:
name: my-role</code></pre>
</li>
</ul>
<p id="032544c5-1082-4251-be23-05a07bbfd2c0" class="" data-ke-size="size16"> </p>
<h3 id="29874eed-1e15-41ce-bb3a-ace3c0f2c489" class="" data-ke-size="size23">실습1 - Role을 활용하여 httpd 웹 실행해보기</h3>
<ol id="db68eb8e-64a3-4250-93df-a71a8b37b4ba" class="numbered-list" style="list-style-type: decimal;" start="1" type="1" data-ke-list-type="decimal">
<li>Role 작성을 위해 초기 디렉토리 구성
<pre id="9bce4b36-6d0a-4728-aef7-4d40c3ec1a12" class="code crmsh"><code>ansible-galaxy role init yongho.httpd
cd yongho.httpd</code></pre>
</li>
</ol>
<ol id="70dc4391-606e-4262-a3ba-40f853585433" class="numbered-list" style="list-style-type: decimal;" start="2" type="1" data-ke-list-type="decimal">
<li>httpd 서비스 설치를 위한 task 작성
<pre id="653b7b06-0f84-442d-b823-158907137974" class="code yaml"><code>cat << EOF > tasks/main.yml
---
# tasks file for my-role
- name: install service {{ service_title }}
ansible.builtin.apt:
name: "{{ item }}"
state: latest
# 변수에 정의된 패키지들을 반복하면서 모두 설치
loop: "{{ httpd_packages }}"
# 변수에 정의된 지원되는 배포판의 경우에만 서비스 설치 진행
when: ansible_facts.distribution in supported_distros
# 웹 실행 시 사전에 만들어놓은 index.html 파일을 사용하기 위해 파일 복사 수행
- name: copy conf file
ansible.builtin.copy:
src:"{{ src_file_path }}"
dest: "{{ dest_file_path }}"
# copy가 완료되면 notify에 정의된 행위를 수행. 여기서는 서비스 재시작
notify:
- restart service
EOF</code></pre>
</li>
</ol>
<ol id="f1d7b557-7b6e-45db-aebb-7aa94cdd8e37" class="numbered-list" style="list-style-type: decimal;" start="3" type="1" data-ke-list-type="decimal">
<li>httpd 웹의 메인 페이지인 index.html 파일 작성
<pre id="e9313cc2-8dbc-4347-bbb9-893b8a8a4227" class="code vim"><code>echo "Hello! Ansible" > files/index.html</code></pre>
</li>
</ol>
<ol id="7b6435e5-c17b-4526-958d-d4d8042e1530" class="numbered-list" style="list-style-type: decimal;" start="4" type="1" data-ke-list-type="decimal">
<li>2번 항목의 task에서 사용할 핸들러와 변수 정의
<pre id="f6753494-9ecf-489e-ab99-4a2e4df67496" class="code dts"><code># notify를 통해 실행될 핸들러 정의
cat << EOF > handlers/main.yml
- name: restart service
ansible.builtin.service:
name: "{{ service_name }}"
state: restarted
EOF
# Task에 사용될 변수 정의
cat << EOF > vars/main.yml
service_name: apache2
src_file_path: ../files/index.html
dest_file_path: /var/www/html
httpd_packages:
- apache2
- apache2-doc
supported_distros:
- Ubuntu
EOF</code></pre>
</li>
</ol>
<ol id="12786648-68aa-42d7-8bc9-ab1f0a0338cd" class="numbered-list" style="list-style-type: decimal;" start="5" type="1" data-ke-list-type="decimal">
<li>Role을 수행할 Playbook 작성
<pre id="96278af1-2c49-4b23-b684-e826af7a9940" class="code yaml"><code># Role의 상위 디렉토리에서 Playbook 생성
cd ..
# 인벤토리 생성
cat << EOF > inventory
[all]
tnode1
EOF
# Playbook 작성
cat << EOF > role-example.yml
---
- hosts: all
tasks:
- name: Print start play
ansible.builtin.debug:
msg: "Let's start role play"
- name: Install Service by role
ansible.builtin.import_role:
name: yongho.httpd
EOF</code></pre>
</li>
</ol>
<ol id="9f10b64e-14e6-4aa5-a3de-dad427f77389" class="numbered-list" style="list-style-type: decimal;" start="6" type="1" data-ke-list-type="decimal">
<li>Playbook 실행
<pre id="a5b6f9bf-c24d-450d-b435-766c049f962a" class="code css"><code>ansible-playbook -i inventory role-example.yml</code></pre>
</li>
</ol>
<ol id="1fece1cc-aa92-4092-b896-25cfc2e503c7" class="numbered-list" style="list-style-type: decimal;" start="7" type="1" data-ke-list-type="decimal">
<li>결과 확인
<pre id="df165c50-617f-4209-b4c0-4c72b91f1fdf" class="code nginx"><code>curl tnode1
# 결과
Hello! Ansible</code></pre>
</li>
</ol>
<h3 id="18356a87-51a9-42cc-814d-354eeda2ea7d" class="" data-ke-size="size23">실습2 - 앤서블 갤럭시에서 Role 사용해보기</h3>
<ol id="5fadbcf6-9e2c-49d3-96e2-23bcde2bc556" class="numbered-list" style="list-style-type: decimal;" start="1" type="1" data-ke-list-type="decimal">
<li><a href="https://galaxy.ansible.com/ui/">Ansible Galaxy</a> 접속</li>
</ol>
<ol id="27ba06a3-9e86-47b6-83f6-a24bf2fe7c0a" class="numbered-list" style="list-style-type: decimal;" start="2" type="1" data-ke-list-type="decimal">
<li>역할(Role) 메뉴에서 원하는 키워드 입력 후 검색. 여기서는 Wordpress 설치</li>
</ol>
<ol id="cb37b464-1025-4afb-9a5d-2da9b9b906f1" class="numbered-list" style="list-style-type: decimal;" start="3" type="1" data-ke-list-type="decimal">
<li>정렬 기준을 다운로드 순으로하면 많이 활용되고 있는 Role이 무엇인지 알 수 있음. 상위에 있는 Role 중에 적합한 Role 선택</li>
</ol>
<ol id="6e20af42-b82d-409f-b997-b1e6fe2772af" class="numbered-list" style="list-style-type: decimal;" start="4" type="1" data-ke-list-type="decimal">
<li>선택한 Role의 문서 탭으로 이동하면 설치 방법과 Playbook 작성 방법을 확인할 수 있음</li>
</ol>
<ol id="0754bff4-61b0-41af-9090-4b089000fcf8" class="numbered-list" style="list-style-type: decimal;" start="5" type="1" data-ke-list-type="decimal">
<li>설치 및 Playbook 파일 작성
<pre id="5fab2169-dc6c-4147-90c2-4c354306f19e" class="code sql"><code>ansible-galaxy role install inmotionhosting.wordpress
cat << EOF > wordpress.yml
- hosts: all
roles:
- role: inmotionhosting.wordpress
EOF</code></pre>
</li>
</ol>
<ol id="a0a1464a-45bc-47b9-a970-826c5b53d6dc" class="numbered-list" style="list-style-type: decimal;" start="6" type="1" data-ke-list-type="decimal">
<li>Playbook 실행 및 결과 확인
<pre id="5eba1279-dda7-4619-b5ce-b75a4f02d370" class="code css"><code>ansible-playbook -i inventory wordpress.yml</code></pre>
</li>
</ol>
</div>
</article>
<p data-ke-size="size16"> </p>
<p data-ke-size="size16"> </p>
<p data-ke-size="size16"> </p>
↧