본문으로 바로가기
반응형

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 생성

  1. firewall역할을 만듭니다 .
  2. firewalld를 설치하고 활성화하기 위한 작업을 추가합니다.
  3. 방화벽 포트 및 서비스를 활성화하는 작업을 추가합니다.
## 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 생성

  1. mysql-server역할을 만듭니다 .
  2.  defaults/main.yml에 변수를 추가합니다.
  3. mysql 파일 files디렉토리를 복사합니다 .
  4. 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 생성

  1. apache역할을 만듭니다 .
  2. defaults/main.yml에 변수를 추가합니다 .
  3. 이미지 디렉토리를 files dir로 이동합니다 .
  4. jinja 템플릿에서 index.php를 변환한 다음 templates dir 로 이동합니다.
  5. handlers/main.yml dir에 핸들러를 추가합니다.
  6. 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 생성

  1. haproxy Role을 만듭니다 .
  2. defaults/main.yml에 변수를 추가합니다 .
  3. jinja 템플릿에서 haproxy.cfg를 변환한 다음 templates dir 로 이동합니다 .
  4. handlers/main.yml dir에 핸들러를 추가합니다 .
  5. 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