반응형
Ansible Role에 대한 구조와 큰 그림에서의 각 Role, 어떻게 플레이북을 구성할지에 대한 샘플내용입니다.
샘플은 RedHat Ansible Automation을 가지고 작성되었으며, 샘플은 아래 github에 올려놨으니 다운받아 내용을 확인할 수 있습니다.
1. Role 디렉토리 구조
Role 의 파일 구조에 다음 디렉토리 중 하나 이상을 포함해야 하지만 사용되지 않는 디렉토리는 제외해도 무방합니다. 사용 중일 때 각 디렉토리에는 관련 콘텐츠가 포함된 main.yml 파일이 있어야 합니다.
roles
└── apache
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
- 역할 - 모든 역할을 포함하는 디렉토리.
- apache - 역할 파일 트리가 생성되는 역할 이름 디렉토리.
- defaults - 역할의 기본 변수입니다.
- 파일 - 이 역할을 통해 배포할 수 있는 파일을 포함합니다.
- 핸들러 - 이 역할 또는 이 역할 외부에서 사용할 수 있는 핸들러를 포함합니다.
- meta - 이 역할에 대한 일부 메타 데이터를 정의합니다.
- README.md - 파일에는 역할에 대한 방법이 포함되어 있습니다.
- 작업 - 역할에서 실행할 작업의 기본 목록을 포함합니다.
- 템플릿 - 이 역할을 통해 배포할 수 있는 템플릿을 포함합니다.
- 테스트 - 샘플 인벤토리 및 test.yml 플레이북이 포함되어 있습니다. 자동화된 테스트 프로세스에 사용할 수 있습니다.
- vars - 역할에 대한 기타 변수.
2. Role 생성
2.1 firewalld role 생성
- firewall역할을 만듭니다 .
- firewalld를 설치하고 활성화하기 위한 작업을 추가합니다.
- 방화벽 포트 및 서비스를 활성화하는 작업을 추가합니다.
## Step.1
ansible-galaxy init roles/firewall
## Step.2, 3
cat > roles/firewall/tasks/main.yml <<EOF
---
- name: Install Firewalld
yum:
name: firewalld
state: latest
- name: Start firewalld
service:
name: firewalld
enabled: yes
state: started
- name: Open service port
when: firewall_services is defined
firewalld:
service: "{{ __service }}"
state: enabled
immediate: true
permanent: true
loop: "{{ firewall_services }}"
loop_control:
loop_var: __service
- name: Open tcp port
when: firewall_tcp_ports is defined
firewalld:
port: "{{ __tcp_port }}/tcp"
permanent: yes
immediate: yes
state: enabled
loop: "{{ firewall_tcp_ports }}"
loop_control:
loop_var: __tcp_port
- name: Open tcp port
when: firewall_udp_ports is defined
firewalld:
port: "{{ __udp_port }}/udp"
permanent: yes
immediate: yes
state: enabled
loop: "{{ firewall_udp_ports }}"
loop_control:
loop_var: __udp_port
EOF
2.2 MYSQL role 생성
- mysql-server역할을 만듭니다 .
- defaults/main.yml에 변수를 추가합니다.
- mysql 파일 files디렉토리를 복사합니다 .
- tasks/main.yml에 mysql 작업을 추가합니다 .
## Step.1
ansible-galaxy init roles/mysql-server
## Step.2
cat > roles/mysql-server/defaults/main.yml <<EOF
---
mysql_info:
user: devops
privilege: "*.*:ALL,GRANT"
database: userdb
password: redhat
backupfile: userdb.backup
mysql_packages:
- mariadb
- mariadb-server
- python3-PyMySQL
mysql_services:
- mariadb
EOF
## Step.3
mv userdb.backup roles/mysql-server/files
## Step.4
cat > roles/mysql-server/tasks/main.yml <<EOF
---
- name: Install mysql
yum:
name: "{{ __package }}"
state: latest
loop: "{{ mysql_packages }}"
loop_control:
loop_var: __package
- name: Start mysql
service:
name: "{{ __service }}"
enabled: true
state: started
loop: "{{ mysql_services }}"
loop_control:
loop_var: __service
- name: Set user's privileges
mysql_user:
name: "{{ mysql_info.user }}"
priv: "{{ mysql_info.privilege }}"
append_privs: yes
password: "{{ mysql_info.password }}"
host: '%'
- name: Copy database backup
copy:
src: "{{ mysql_info.backupfile }}"
dest: /tmp
- name: Restore database from backup
mysql_db:
name: "{{ mysql_info.database }}"
state: import
target: "/tmp/{{ mysql_info.backupfile }}"
EOF
2.3 Apache(httpd) Role 생성
- apache역할을 만듭니다 .
- defaults/main.yml에 변수를 추가합니다 .
- 이미지 디렉토리를 files dir로 이동합니다 .
- jinja 템플릿에서 index.php를 변환한 다음 templates dir 로 이동합니다.
- handlers/main.yml dir에 핸들러를 추가합니다.
- tasks/main.yml dir에 task를 추가합니다.
## Step.1
ansible-galaxy init roles/apache
## Step.2
cat > roles/apache/defaults/main.yml <<EOF
---
apache_packages:
- httpd
- php
- php-mysqlnd
apache_services:
- httpd
mysql_info:
user: devops
database: userdb
password: redhat
EOF
## Step.3
mv images roles/apache/files
## Step.4
sed -i 's/$db=.*$/$db=mysqli_connect("{{hostvars[groups['\'database_servers\''][0]]['\'inventory_hostname\'']}}","{{mysql_info.user}}","{{mysql_info.password}}","{{mysql_info.database}}");/' index.php
mv index.php roles/apache/templates/index.php.j2
## Step.5
cat > roles/apache/handlers/main.yml <<EOF
---
- name: restart_apache
service:
name: "{{ __service }}"
state: restarted
loop: "{{ apache_services }}"
loop_control:
loop_var: __service
EOF
## Step.6
cat > roles/apache/tasks/main.yml <<EOF
---
- name: Install apache server
yum:
name: "{{ __package }}"
state: latest
loop: "{{ apache_packages }}"
loop_control:
loop_var: __package
- name: Change apache port
replace:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen.*$'
replace: 'Listen 8080'
- name: Copy image directory
copy:
src: images
dest: /var/www/html/
- name: Copy php program template
template:
src: index.php.j2
dest: /var/www/html/index.php
notify:
- restart_apache
- name: Start apache server
service:
name: "{{ __service }}"
state: restarted
loop: "{{ apache_services }}"
loop_control:
loop_var: __service
- name: enable selinux boolean
seboolean:
name: "{{ item }}"
state: yes
persistent: yes
loop:
- httpd_can_network_connect_db
- httpd_can_network_connect
EOF
2.4 Haproxy Role 생성
- haproxy Role을 만듭니다 .
- defaults/main.yml에 변수를 추가합니다 .
- jinja 템플릿에서 haproxy.cfg를 변환한 다음 templates dir 로 이동합니다 .
- handlers/main.yml dir에 핸들러를 추가합니다 .
- tasks/main.yml dir에 task를 추가합니다 .
## Step.1
ansible-galaxy init roles/haproxy
## Step.2
cat > roles/haproxy/defaults/main.yml <<EOF
---
haproxy_packages:
- haproxy
haproxy_services:
- haproxy
EOF
## Step.3
sed -i '/^[[:space:]]*$/d;/^ *server.*$/d' haproxy.cfg
cat >> haproxy.cfg <<EOF
{% for host in groups['backend_servers'] %}
server app{{ loop.index }} {{ host }}:8080 cookie app{{ loop.index }} check
{% endfor %}
EOF
mv haproxy.cfg roles/haproxy/templates/haproxy.cfg.j2
## Step.4
cat > roles/haproxy/handlers/main.yml <<EOF
---
- name: restart_haproxy
service:
name: "{{ __service }}"
state: restarted
loop: "{{ haproxy_services }}"
loop_control:
loop_var: __service
EOF
## Step.5
cat > roles/haproxy/tasks/main.yml <<EOF
---
- name: Install HAproxy
yum:
name: "{{ __package }}"
state: latest
loop: "{{ haproxy_packages }}"
loop_control:
loop_var: __package
- name: Copy HAproxy template
template:
src: haproxy.cfg.j2
dest: /etc/haproxy/haproxy.cfg
notify:
- restart_haproxy
- name: Start HAproxy
service:
name: "{{ __service }}"
state: started
enabled: yes
loop: "{{ haproxy_services }}"
loop_control:
loop_var: __service
EOF
3. Role 사용법
Role를 이용하여 배포를 진행하려면 main.yml 플레이북을 작성하여 사용한다.
inventory 구성정보
[loadbalancers]
frontend.example.com
[backend_servers]
app1.example.com
app2.example.com
[database_servers]
appdb.example.com
## Step.1
cat > main.yml <<EOF
---
- name: Play to setup mysql server
hosts: database_servers
roles:
- role: firewall
vars:
firewall_services:
- mysql
- role: mysql-server
- name: Play to setup apache servers
hosts: backend_servers
roles:
- role: firewall
vars:
firewall_services:
- http
firewall_tcp_ports:
- 8080
- role: apache
- name: Play to setup Haproxy
hosts: loadbalancers
roles:
- role: firewall
vars:
firewall_services:
- http
firewall_tcp_ports:
- 5000
- role: haproxy
EOF
4. playbook 실행
ansible-playbook main.yml
728x90
'IaC (Automation) > Ansible-Playbook' 카테고리의 다른 글
[playbook] node_exporter 설치 playbook (0) | 2021.10.08 |
---|---|
[playbook] Prometheus 설치 playbook (0) | 2021.10.08 |
[Ansible] import vs include 차이점 (0) | 2021.07.29 |
[Ansible] AWS and Openstack Modules (0) | 2021.07.28 |
[Ansible] ansible vault 사용법 (0) | 2021.07.20 |