업무는 너무 많은데 시간은 충분하지 않은 전형적인 시스템 관리자이신가요? 전체 서버 팜에서 간단하게 DNS 서버를 변경하거나 커널 매개변수를 조정하기가 꺼려지시나요? 아니면 설치된 메모리 또는 릴리스 버전과 같은 가변 시스템 특성에 따라 변경하시나요? 조직의 개발자들이 전하는 이 모든 DevOps 관련 사항을 제대로 이해할 수 있나요?  

Red Hat Ansible Automation은 SSH를 사용하여 플랫 환경 또는 멀티 티어 환경에서 구성 관리, 애플리케이션 배포, 프로비저닝을 조정하고 사람이 읽을 수 있는 에이전트리스 자동화 툴입니다. 이는 세계에서 가장 널리 사용되는 오픈소스 IT 자동화 기술 중 하나로 자리 잡은 오픈소스 Ansible 기술을 기반으로 합니다.

이 블로그 포스트는 Ansible의 기본 사항을 알아보고 시스템 관리자가 Ansible을 사용하여 시스템을 보다 효율적으로 관리할 수 있는 방법을 이해하는 데 도움이 됩니다.

시작하기 전에 몇 가지 용어를 정의해야 합니다.

제어 노드: 관리 노드에서 Ansible을 사용하여 태스크를 실행하는 호스트

관리 노드: 제어 노드에서 구성된 호스트

호스트 인벤토리: 관리 노드 목록

애드혹 명령: 간단한 일회성 태스크

플레이북: 더 복잡한 구성을 위한 반복 가능한 태스크 세트

모듈: 사용자 추가, 패키지 설치 등 특정한 공통 태스크를 수행하는 코드

멱등성: 한 번 수행한 결과가 개입하는 작업 없이 반복했을 때의 결과와 정확히 일치하면 멱등성이 있는 것입니다.

환경

이 블로그 포스트에서 환경은 최소한의 Red Hat Enterprise Linux 7.4가 설치된 가상 환경에서 실행되는 하나의 제어 노드(vm1)와 4개의 관리의 노드(vm2, vm3, vm4, vm5)로 구성되어 있습니다. 간단하게 제어 노드는 /etc/hosts 파일에 다음 항목을 포함하고 있습니다.

192.168.102.211 vm1 vm1.redhat.lab
192.168.102.212 vm2 vm2.redhat.lab
192.168.102.213 vm3 vm3.redhat.lab
192.168.102.214 vm4 vm4.redhat.lab
192.168.102.215 vm5 vm5.redhat.lab

간편하게 사용할 수 있도록 이 데모에서는 제 시스템 사용자에 암호가 없는 sudo를 사용하겠습니다. 여러분의 보안 정책은 다를 수 있으며 Ansible은 다양한 권한 에스컬레이션 활용 사례를 처리할 수 있습니다. 이 사용자 계정은 /etc/sudoers 파일에서 다음 항목을 통해 권한 에스컬레이션용으로 구성되었습니다.

%wheel ALL=(ALL) NOPASSWD: ALL

이는 예시일 뿐이며 각자의 sudo 구성을 다양하게 사용하셔도 됩니다.  

마지막으로, SSH 퍼블릭 키 인증은 제어 노드에서 각 관리 노드까지 이 사용자 계정에 대해 구성 및 검증되었습니다.

설치

Red Hat Enterprise Linux 7용 Ansible은 Extras 채널에 있습니다. Red Hat Enterprise Linux 6을 사용한다면 EPEL 리포지토리를 활성화하세요. Enterprise Linux용 추가 패키지(EPEL)의 경우 고객 포털의 이 솔루션도 유용할 수 있습니다. Fedora 시스템에서는 기본 리포지토리에서 Ansible을 찾을 수 있습니다.

리포지토리를 적절하게 구성한 후에는 빠르고 간단하게 설치할 수 있습니다.

[curtis@vm1 ~]$ sudo yum install -y ansible 

버전을 확인해 봅시다.

[curtis@vm1 ~]$ ansible --version
ansible 2.4.1.0
 config file = /etc/ansible/ansible.cfg
 configured module search path = [u'/home/curtis/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
 ansible python module location = /usr/lib/python2.7/site-packages/ansible
 executable location = /bin/ansible
 python version = 2.7.5 (default, May 3 2017, 07:55:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-14)]

기본 구성 파일을 확인하세요. 또한 최소 Red Hat Enterprise Linux 7.4 설치에는 python이 필요하며 설치되어 있습니다.

구성

이미 사용자 계정, 권한 에스컬레이션, SSH 퍼블릭 키 인증으로 관리 노드를 구성했으므로 이제 제어 노드를 구성해 보겠습니다.

제어 노드는 Ansible 구성 파일과 호스트 인벤토리 파일로 구성됩니다.

구성 파일

방금 확인한 바와 같이 기본 구성 파일은 /etc/ansible/ansible.cfg입니다.

이 전역 구성 파일은 수정하거나 특정 디렉터리에 복사본을 만들 수 있습니다. 구성 파일의 순서는 다음과 같습니다.

  • ANSIBLE_CONFIG(환경 변수)
  • ansible.cfg(디렉터리당)
  • ~/.ansible.cfg(홈 디렉터리)
  • /etc/ansible/ansible.cfg(글로벌)

이 블로그 포스트에서는 이전에 추가한 사용자 계정의 홈 디렉터리에 있는 최소 구성 파일을 사용하겠습니다.

[curtis@vm1 ~]$ cat ansible.cfg
[defaults]
inventory = $HOME/hosts

호스트 인벤토리

기본 호스트 인벤토리 파일은 /etc/ansible/hosts이지만 구성 파일(위 그림)을 통해 변경하거나 Ansible 명령의 -i 옵션을 사용하여 변경할 수 있습니다. 여기에서는 간단한 정적 인벤토리 파일을 사용하겠습니다. 동적 인벤토리도 가능하지만 이 블로그 포스트 범위에 포함되지 않습니다.

우리가 사용하는 호스트 인벤토리는 다음과 같습니다.

[webservers]
vm2
vm3

[dbservers]
vm4

[logservers]
vm5

[lamp:children]
webservers
dbservers

4개의 그룹을 정의했습니다. 즉, vm2 및 vm3의 webservers, vm4의 dbservers, vm5의 logserver, webservers 그룹 및 dbservers 그룹으로 구성된 lamp입니다.

이 구성 파일을 사용하여 모든 호스트를 위치시킬 수 있는지 확인해 보겠습니다.

[curtis@vm1 ~]$ ansible all --list-hosts
 hosts (4):
   vm5
   vm2
   vm3
   vm4

webservers 그룹처럼 개별 그룹에도 비슷합니다.

[curtis@vm1 ~]$ ansible webservers --list-hosts
 hosts (2):
   vm2
   vm3

이제 호스트 인벤토리를 확인했으니 모든 호스트가 실행 중인지 빨리 확인해 보겠습니다. ping 모듈을 사용하는 애드혹 명령을 사용하겠습니다.

[curtis@vm1 ~]$ ansible all -m ping
vm4 | SUCCESS => {
   "changed": false, 
   "failed": false, 
   "ping": "pong"
}
vm5 | SUCCESS => {
   "changed": false, 
   "failed": false, 
   "ping": "pong"
}
vm3 | SUCCESS => {
   "changed": false, 
   "failed": false, 
   "ping": "pong"
}
vm2 | SUCCESS => {
   "changed": false, 
   "failed": false, 
   "ping": "pong"
}

위의 출력에서 모든 시스템의 결과가 성공적이었으며 아무것도 바뀌지 않고 "ping"의 결과는 모드 "pong"임을 확인했습니다.

사용 가능한 모듈의 목록은 다음을 통해 가져올 수 있습니다.

[curtis@vm1 ~]$ ansible-doc -l 

내장형 모듈의 수는 Ansible이 릴리스될 때마다 계속해서 증가합니다.

[curtis@vm1 ~]$ ansible-doc -l | wc -l 
1378 

각 모듈의 도큐멘테이션은 다음에서 확인할 수 있습니다 http://docs.ansible.com/ansible/latest/modules_by_category.html

이 환경의 마지막 설정 태스크는 관리 노드가 추가 패키지를 설치할 수 있도록 Apache와 Red Hat Enterprise Linux 7 Yum 리포지토리를 사용하여 vm1을 구성하는 것입니다.

[root@vm1 ~]# yum install -y httpd
[root@vm1 ~]# systemctl enable httpd
[root@vm1 ~]# systemctl start httpd
[root@vm1 ~]# mkdir /media/iso
[root@vm1 ~]# mount -o loop /root/rhel-server-7.4-x86_64-dvd.iso /media/iso
[root@vm1 ~]# ln -s /media/iso /var/www/html/rhel7

Ansible을 사용할 준비가 되셨나요!

이제 환경을 구성했으며 준비가 되었으니 실제로 Ansible을 사용해 보겠습니다.

관리 노드는 추가 패키지를 설치해야 하므로 첫번째 태스크는 이 구성 파일을 사용하여 각 호스트에 Yum 리포지토리를 구성하는 것입니다.

[curtis@vm1 ~]$ cat dvd.repo
[RHEL7]
name = RHEL 7
baseurl = http://vm1/rhel7/
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled = 1
gpgcheck = 1

다음과 같이 애드혹 명령과 -m 옵션을 사용하는 복사 모듈로 이 파일을 각 관리 노드에 복사하고 -a 옵션을 사용하는 필수 인수를 지정할 수 있습니다.

[curtis@vm1 ~]$ ansible all -m copy -a 'src=dvd.repo dest=/etc/yum.repos.d owner=root group=root mode=0644' -b
vm5 | SUCCESS => {
   "changed": true, 
   "checksum": "c15fdb5c1183f360ce29a1274c5f69e4e43060f5", 
   "dest": "/etc/yum.repos.d/dvd.repo", 
   "failed": false, 
   "gid": 0, 
   "group": "root", 
   "md5sum": "db5a5da08d1c4be953cd0ae6625d8358", 
   "mode": "0644", 
   "owner": "root", 
   "secontext": "system_u:object_r:system_conf_t:s0", 
   "size": 135, 
   "src": "/home/curtis/.ansible/tmp/ansible-tmp-1516898124.58-210025572567032/source", 
   "state": "file", 
   "uid": 0
}

[...]

간결성을 위해 나머지 호스트의 추가 출력은 제거했습니다.

이 시점에서 주목해야 할 항목이 몇 가지 있습니다.

  1. 각 모드는 SUCCESS 및 “changed”를 표시합니다. true는 모듈 실행이 성공적이었으며 파일이 생성/변경되었다는 것을 의미합니다. 해당 명령을 다시 실행하면 출력에는 “changed”가 포함될 것입니다. false는 해당 파일이 이미 존재하며 필요에 따라 구성되었음을 의미합니다. 즉, Ansible은 필요한 변경 사항이 아직 존재하지 않는 경우에만 필요한 변경을 수행합니다. 이를 “멱등성”이라고 합니다.

  2. -b 옵션(http://docs.ansible.com/ansible/latest/become.html 참조)을 사용하면 원격 태스크가 권한 에스컬레이션(예: sudo)를 사용하게 되는데 이는 파일을 /etc/yum.repos.d 디렉터리로 복사하는 데 필요합니다

  3. 다음을 사용하여 복사 모듈이 필요한 인수를 확인할 수 있습니다.

[curtis@vm1 ~]$ ansible-doc copy 

 

플레이북

애드혹 명령은 테스트 및 간단한 일회성 테스트에는 유용하지만 플레이북은 나중에 반복 가능한 태스크 집합을 캡처하는 데 사용할 수 있습니다. 플레이북에는 구성할 호스트 집합과 수행할 태스크 목록을 정의하는 플레이가 하나 이상 포함되어 있습니다.

이 시나리오에서는 웹 서버, 데이터베이스 서버, 중앙집중식 로깅 서버를 구성해야 합니다. 구체적인 요구 사항은 다음과 같습니다.

  1. httpd 패키지가 웹 서버에 설치되었고 사용 가능하며 시작되었습니다.

  2. 각 웹 서버에는 "Welcome to <hostname> on <ip address>"라는 텍스트가 있는 기본 페이지가 있습니다.

  3. 각 웹 서버에는 콘텐츠 관리에 적합한 액세스 권한이 있는 사용자 계정이 있습니다.

  4. MariaDB 패키지가 데이터베이스에 설치되었고 사용 가능하며 시작되었습니다.

  5. 로그 서버 호스트가 원격 로깅 메시지를 수락하도록 구성되었습니다.

  6. webservers 그룹 및 dbservers 그룹의 호스트는 로그 메시지 사본을 로그 서버 호스트로 보냅니다.

 

다음 플레이북(myplaybook.yml)은 우리가 필요한 모든 것을 구성합니다.

플레이북을 검토할 때 다음을 확인하시기 바랍니다.

  1. 사용자 모듈은 일반 텍스트 비밀번호 해시가 필요합니다(자세한 사항은 "ansible-doc user" 참조).  방법은 다음과 같습니다.

    • [curtis@vm1 ~]$ python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())" 비밀번호: $6$rounds=656000$bp7zTIl.nar2WQPS$U5CBB15GHnzBqnhY0r7UX65FrBI6w/w9YcAL2kN9PpDaYQIDY6Bi.CAEL6PRRKUqe2bJYgsayyh9NOP1kUy4w.
  2. 기본 웹 페이지 콘텐츠 호스트에서 수집한 "팩트"를 사용하여 만들어집니다. 설정 모듈을 사용하여 호스트 팩트를 탐색 및 사용할 수 있습니다.

[curtis@vm1 ~]$ ansible vm2 -m setup

---
- hosts: webservers
 become: yes
 tasks:
   - name: install Apache server
     yum:
       name: httpd
       state: latest

   - name: enable and start Apache server
     service:
       name: httpd
       enabled: yes
       state: started

   - name: open firewall port
     firewalld:
       service: http
       immediate: true
       permanent: true
       state: enabled

   - name: create web admin group
     group:
       name: web
       state: present

   - name: create web admin user
     user:
       name: webadm
       comment: "Web Admin"
       password: $6$rounds=656000$bp7zTIl.nar2WQPS$U5CBB15GHnzBqnhY0r7UX65FrBI6w/w9YcAL2kN9PpDaYQIDY6Bi.CAEL6PRRKUqe2bJYgsayyh9NOP1kUy4w.
       groups: web
       append: yes

   - name: set content directory group/permissions 
     file:
       path: /var/www/html
       owner: root
       group: web
       state: directory
       mode: u=rwx,g=rwx,o=rx,g+s

   - name: create default page content
     copy:
       content: "Welcome to {{ ansible_fqdn}} on {{ ansible_default_ipv4.address }}"
       dest: /var/www/html/index.html
       owner: webadm
       group: web
       mode: u=rw,g=rw,o=r

- hosts: dbservers
 become: yes
 tasks:
   - name: install MariaDB server
     yum:
       name: mariadb-server
       state: latest

   - name: enable and start MariaDB server
     service:
       name: mariadb
       enabled: yes
       state: started

- hosts: logservers
 become: yes
 tasks:
   - name: configure rsyslog remote log reception over udp
     lineinfile:
       path: /etc/rsyslog.conf
       line: "{{ item }}"
       state: present
     with_items:
       - '$ModLoad imudp'
       - '$UDPServerRun 514'
     notify:
       - restart rsyslogd

   - name: open firewall port
     firewalld:
       port: 514/udp
       immediate: true
       permanent: true
       state: enabled

 handlers:
   - name: restart rsyslogd
     service:
       name: rsyslog
       state: restarted

- hosts: lamp
 become: yes
 tasks:
   - name: configure rsyslog
     lineinfile:
       path: /etc/rsyslog.conf
       line: '*.* @192.168.102.215:514'
       state: present
     notify:
       - restart rsyslogd

 handlers:
   - name: restart rsyslogd
     service:
       name: rsyslog
       state: restarted

플레이북 실행

우리의 플레이북은 다음을 사용하여 실행할 수 있습니다.

[curtis@vm1 ~]$ ansible-playbook myplaybook.yml 

아래 출력에서 데이터베이스가 vm4(play 2)에 설치되고 logserver(vm5)가 play 3으로 구성되는 동안 웹 서버는 vm2 및 vm3(play 1)에서만 구성됨을 알 수 있습니다. 마지막으로 play 4는 원격 로깅을 위해 "lamp" 그룹을 통해 webservers 호스트 및 dbserver 호스트를 구성합니다.

PLAY [webservers] *********************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [vm2]
ok: [vm3]

TASK [install Apache server] **********************************************************
changed: [vm3]
changed: [vm2]

TASK [enable and start Apache server] *************************************************
changed: [vm2]
changed: [vm3]

TASK [open firewall port] *************************************************************
changed: [vm2]
changed: [vm3]

TASK [create web admin group] *********************************************************
changed: [vm3]
changed: [vm2]

TASK [create web admin user] **********************************************************
changed: [vm3]
changed: [vm2]

TASK [set content directory group/permissions] ****************************************
changed: [vm3]
changed: [vm2]

TASK [create default page content] ****************************************************
changed: [vm3]
changed: [vm2]

PLAY [dbservers] **********************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [vm4]

TASK [install MariaDB server] *********************************************************
changed: [vm4]

TASK [enable and start MariaDB server] ************************************************
changed: [vm4]

PLAY [logservers] *********************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [vm5]

TASK [configure rsyslog remote log reception over udp] ********************************
changed: [vm5] => (item=$ModLoad imudp)
changed: [vm5] => (item=$UDPServerRun 514)

TASK [open firewall port] *************************************************************
changed: [vm5]

RUNNING HANDLER [restart rsyslogd] ****************************************************
changed: [vm5]

PLAY [lamp] ***************************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [vm3]
ok: [vm2]
ok: [vm4]

TASK [configure rsyslog] **************************************************************
changed: [vm2]
changed: [vm3]
changed: [vm4]

RUNNING HANDLER [restart rsyslogd] ****************************************************
changed: [vm3]
changed: [vm2]
changed: [vm4]

PLAY RECAP ****************************************************************************
vm2                        : ok=11 changed=9 unreachable=0    failed=0 
vm3                        : ok=11 changed=9 unreachable=0    failed=0 
vm4                        : ok=6 changed=4 unreachable=0    failed=0 
vm5                        : ok=4 changed=3 unreachable=0    failed=0 

이제 완료했습니다!

webserver 호스트를 확인하는 방법은 다음과 같습니다.

[curtis@vm1 ~]$ curl http://vm2
Welcome to vm2 on 192.168.102.212
[curtis@vm1 ~]$ curl http://vm3
Welcome to vm3 on 192.168.102.213 

webservers 호스트 및 dbservers 호스트에서 로거 명령으로 원격 로깅을 확인하는 방법은 다음과 같습니다.

[curtis@vm1 ~]$ ansible lamp -m command -a 'logger hurray it works'
vm3 | SUCCESS | rc=0 >>

vm4 | SUCCESS | rc=0 >>

vm2 | SUCCESS | rc=0 >>

중앙 로깅 서버에서 확인:

[curtis@vm1 ~]$ ansible logservers -m command -a "grep 'hurray it works$' /var/log/messages" -b
vm5 | SUCCESS | rc=0 >>
Jan 30 13:28:29 vm3 curtis: hurray it works
Jan 30 13:28:29 vm2 curtis: hurray it works
Jan 30 13:28:29 vm4 curtis: hurray it works

팁과 요령

YAML을 처음 사용하신다면 구문은 특히 공백(탭 없음) 사용이 어려울 수 있습니다.

플레이북을 실행하기 전에 구문을 확인하는 방법은 다음과 같습니다.

$ ansible-playbook --syntax-check myplaybook.yml 

vim에서 구문 강조를 사용하면 yaml을 학습할 때뿐 아니라 구문 문제를 찾는 데 도움이 됩니다. yaml 구문에 vim을 사용하는 빠른 방법은 ~/.vimrc 파일에 다음 행을 추가하면 됩니다.

 

autocmd Filetype yaml setlocal tabstop=2 ai colorcolumn=1,3,5,7,9,80

색상 등 몇 가지 추가 기능이 있는 것을 원하시면 여기에서 해당 플러그인을 찾을 수 있습니다.
vim 대신 emacs를 사용하려면 EPEL 리포지토리를 활성화하고 emacs-yaml-mode 패키지를 설치하세요.

다음과 같이 실제 대상 호스트를 변경하지 않고도 플레이북을 테스트할 수 있습니다.

$ ansible-playbook --syntax-check myplaybook.yml 

다음과 같이 플레이북을 단계별로 살펴보는 것도 유용할 수 있습니다.

$ ansible-playbook --syntax-check myplaybook.yml 

셸 스크립트와 마찬가지로 Ansible 플레이북을 실행 가능하게 설정하고 파일 상단에 다음을 추가할 수 있습니다.

#!/bin/ansible-playbook 

임의의 애드혹 셸 명령을 실행하려면 명령 모듈(-m이 지정되지 않은 경우 기본 모듈)을 사용합니다. 리디렉션, 파이프라인 등을 사용해야 하는 경우 셸 모듈을 대신 사용하세요.

도큐멘테이션에서 특정 모듈에 대한 "예시:" 섹션을 확인하여 플레이북을 보다 빠르게 작성하세요.

플레이북에서 문자열 따옴표를 사용하면 문자열 내의 특수 문자 문제를 방지할 수 있습니다.

로깅은 기본적으로 비활성화되어 있습니다. 로깅을 활성화하려면 Ansible 구성 파일에서 log_path 매개 변수를 사용합니다.

이 블로그 포스트를 통해 Ansible이 어떻게 작동하는지, 어떻게 플레이북을 사용하여 시간과 노력을 절약하면서도 쉽고 정확하게 일상 태스크를 기록하고 반복할 수 있는지 아실 수 있었기를 바랍니다. 계속해서 http://docs.ansible.comhttps://www.redhat.com/en/technologies/management/ansible에서 학습을 진행하시기 바랍니다.

즐겁게 자동화하세요!

 

이미지RHCA인 Curtis Rempel은 캐나다에서 근무하는 수석 플랫폼 TAM이며 팀 리더이자 전직 Red Hat 인증 강사 및 심사관(RHCI/RHCX)입니다. 그가 1994년 Jon “maddog” 홀에서 Red Hat Linux 2.1 CD를 통해서 Linux를 처음 사용하게 되었습니다. TAM으로서 그는 자동화, 커널, 스토리지에 대한 전문 지식으로 금융, 통신, 항공 산업의 기업 고객을 지원하고 있습니다. Curtis에 대해 자세히 알아보세요.

Red Hat Technical Account Manager(TAM)는 IT 조직과 협력하여 성공적인 배포를 전략적으로 계획하고 최적의 성능과 성장을 실현하도록 지원하는 전문 제품 전문가입니다. TAM은 세계적 수준의 Red Hat Customer Experience and Engagement 소속으로 문제가 발생하기 전에 식별하고 해결할 수 있도록 사전 예방적 조언과 지침을 제공합니다. 문제가 발생하는 경우, 담당 TAM이 문제를 맡아 고객의 업무 중단을 최소화하면서도 최대한 신속하게 문제를 해결할 수 있도록 최고의 리소스를 활용합니다.

가까운 Red Hat Convergence 이벤트에서 TAM을 만나보세요! Red Hat Convergence는 기술 사용자가 비즈니스 목표를 달성하기 위해 Red Hat 제품에 대한 지식을 심화시키고 오픈소스 기술을 적용할 새로운 방법을 찾을 수 있는 기회를 제공하는 인비테이션 온리(Invitation-only) 무료 이벤트입니다. 해당 이벤트는 전 세계의 도시를 순회하며 Red Hat 전문가 및 업계 동료들에게서 배우고 이들과 교류할 수 있는 편리한 현지 경험을 하루 동안 제공합니다.

오픈소스는 공동의 호기심으로 이루어집니다. 5월 8일~10일 미국 샌프란시스코에서 열리는 Red Hat Summit에 참여하여 TAM 및 그 외 Red Hat 전문가를 직접 만나보세요! CEE18 코드를 사용하여 US$1,100에 지금 등록하세요.

Red Hat Cloud Success는 심층적인 제품 전문성, 지침, 지원을 통해 IT 트랜스포메이션을 간소화하고 클라우드 기술 채택을 가속화할 수 있도록 설계되었습니다. 기술 검증 단계부터 프로덕션 단계에 이르기까지 고도로 숙련된 클라우드 기술 전문가가 협력하여 연속성을 제공하고 클라우드 솔루션을 성공적으로 구현할 수 있도록 지원합니다. 한정된 기간 동안 제공되는 이번 기회를 통해 Red Hat Cloud Success는 클라우드 솔루션을 효과적으로 계획 및 배포하고 미래를 전략적으로 계획할 수 있도록 지원합니다.