Ansible 초보자 튜토리얼: 플레이북 및 명령어

⚡ 스마트 요약

Ansible은 오픈 소스 에이전트리스 자동화 엔진으로, SSH를 통해 서버를 구성하고, 임시 명령을 실행하며, YAML 플레이북, 역할 및 재사용 가능한 템플릿을 통해 Linux 및 Linux 시스템 전반에 걸쳐 복잡한 배포를 오케스트레이션합니다. Windows 하부 구조.

  • 🧩 에이전트리스 Archi강의: Ansible은 SSH를 통해 클라이언트에 연결하고 모듈을 푸시하므로 관리 대상 노드에 에이전트 소프트웨어를 설치할 필요가 없습니다.
  • 📥 설치: CentOS 또는 RHEL에서는 yum과 EPEL을 사용하여 제어 노드에 Ansible을 설정하고, 다른 운영 체제에서는 apt와 PPA를 사용하여 설정하십시오. Ubuntu 또는 데비안.
  • 임시 명령: 다음과 같은 일회성 작업을 실행합니다. pingansible -m 모듈 구문을 사용하여 인벤토리 전체에 복사 또는 yum을 실행합니다.
  • 📜 플레이북: 여러 서버를 일관되게 구성하기 위해 플레이, 태스크 및 모듈을 그룹화하는 YAML 플레이북에서 원하는 상태를 설명합니다.
  • 🧱 역할 및 템플릿: 대규모 플레이북을 ansible-galaxy로 생성된 재사용 가능한 역할로 분할하고 Jinja2 템플릿을 사용하여 구성 파일을 렌더링합니다.
  • 🔁 담당자 및 정보: 변경 사항 발생 시 알림 기능을 통해 핸들러를 트리거하고, gather_facts 변수를 사용하여 조건부 반복 자동화를 구현합니다.
  • 🎯 사례 연구 : 하나의 p4.yml 플레이북으로 모든 호스트에서 selinux, httpd 및 resolver 역할을 실행할 수 있으며, 각 역할은 태그로 제어됩니다.

Ansible 초보자를 위한 튜토리얼: 설치, 임시 명령, 플레이북, 역할 및 템플릿을 다룹니다.

Ansible은 현대 자동화 분야에서 가장 널리 사용되는 오픈 소스 도구 중 하나입니다. DevOps (개발 운영)Ansible은 에이전트가 필요 없는 설계와 간단하고 읽기 쉬운 설정 파일로 높은 평가를 받고 있습니다. 이 초보자용 Ansible 튜토리얼에서는 Ansible이 무엇인지, 설치 방법, 그리고 실제 예제를 통해 임시 명령, 플레이북, 역할, 템플릿을 사용하는 방법을 설명합니다.

앤서블이란?

책임감있는 는 소프트웨어 프로비저닝, 구성 관리 및 소프트웨어 배포를 위한 오픈 소스 자동화 및 오케스트레이션 도구입니다. 유닉스 계열 시스템을 구성하고 Windows Ansible은 자체 선언적 언어를 통해 코드로 인프라를 제공한다는 점에서 유사한 시스템을 지원합니다. Ansible은 종종 에이전트 기반 도구인 와 비교됩니다. 인형.

Ansible은 간단한 설치, 손쉬운 클라이언트 연결, 그리고 에이전트가 필요 없는 설계로 인기가 높습니다. Ansible은 클라이언트와 다음과 같은 방식으로 연결합니다. SSH따라서 클라이언트 측에 특별한 에이전트가 필요하지 않습니다. Ansible은 각 클라이언트에 모듈을 푸시하고, 모듈은 로컬에서 실행된 후 그 출력을 Ansible 서버로 반환합니다.

Ansible은 SSH를 기반으로 하기 때문에 SSH 키를 사용하여 클라이언트에 쉽게 연결할 수 있어 전체 프로세스를 간소화합니다. 호스트 이름이나 IP 주소, SSH 포트와 같은 클라이언트 세부 정보는 인벤토리 파일이라는 파일에 저장됩니다. 인벤토리 파일을 생성하고 정보를 입력하면 Ansible에서 해당 파일을 사용할 수 있습니다.

왜 앤서블을 사용하는가?

Ansible을 사용하면 다음과 같은 중요한 이점을 얻을 수 있습니다.

  • Ansible의 가장 큰 장점 중 하나는 누구나 무료로 사용할 수 있다는 점입니다.
  • 설치 및 사용에 특별한 시스템 관리자 기술이 필요하지 않으며, 공식 설명서가 매우 자세합니다.
  • 플러그인, 모듈, 인벤토리 및 플레이북 전반에 걸친 모듈식 구조 덕분에 Ansible은 대규모 환경을 오케스트레이션하는 데 매우 유용한 도구입니다.
  • Ansible은 가볍고 일관성이 뛰어나며 운영 체제나 하드웨어에 제약을 받지 않습니다.
  • 에이전트가 필요 없는 설계와 OpenSSH 보안 기능 사용 덕분에 매우 안전합니다.
  • Ansible은 탄탄한 문서와 배우기 쉬운 구조 및 설정을 통해 학습 곡선이 매끄럽습니다.

이러한 강점들은, 특히 다른 요소들과 비교했을 때 더욱 두드러진다. Ansible의 대안이는 해당 제품이 빠르게 도입된 이유를 설명하는 데 도움이 됩니다. 설치하기 전에 프로젝트가 어떻게 발전해왔는지 이해하는 것이 도움이 됩니다.

앤서블의 역사

다음은 Ansible 역사에서 중요한 이정표들입니다.

  • 앤서블 프로젝트는 2012년 2월에 시작되었습니다. 이 프로젝트는 코블러(Cobbler)와 펀크(Func, 페도라 통합 네트워크 컨트롤러)의 개발자인 마이클 드한(Michael DeHaan)이 처음 개발했습니다.
  • 원래 AnsibleWorks Inc.라는 이름으로 Ansible 개발에 자금을 지원했던 이 회사는 2015년에 RedHat에 인수되었고, 이후 RedHat과 함께 Ansible 산하로 편입되었습니다. IBM 우산.
  • 오늘날 Ansible은 Fedora Linux, RHEL, CentOS 등의 배포판에 포함되어 있습니다. Oracle 리눅스.

Ansible에서 사용되는 중요 용어

다음 용어들은 이 Ansible 튜토리얼 전반에 걸쳐 등장하며, 시작하기 전에 알아두면 유용합니다.

앤서블 서버

Ansible이 설치되어 있고 모든 작업과 플레이북이 실행되는 머신입니다.

모듈

모듈은 클라이언트 측에서 실행되도록 설계된 Ansible 명령어 또는 유사한 명령어들의 집합입니다.

태스크

작업이란 완료해야 할 단일 절차로 구성된 부분을 말합니다.

직위별

플레이북에서 나중에 호출할 수 있도록 작업과 관련 파일을 정리하는 방법입니다.

사실

gather_facts 작업을 통해 클라이언트 시스템의 전역 변수에서 가져온 정보입니다.

목록

Ansible 클라이언트 서버에 대한 데이터가 포함된 파일입니다. 이후 예제에서는 hosts 파일로 정의됩니다.

연극

작전 계획서의 실행.

처리기

알림자가 존재할 때만 호출되는 작업입니다.

알리미

출력이 변경될 경우 핸들러를 호출하는 작업에 할당된 섹션입니다.

꼬리표

작업에 이름을 지정하여 나중에 해당 특정 작업 또는 작업 그룹을 실행하는 데 사용할 수 있습니다.

Linux에 Ansible 설치

여러 옵션을 검토한 후 Ansible을 도입하기로 결정했다면, 다음 단계는 시스템에 Ansible을 설치하는 것입니다. 다음은 가장 널리 사용되는 시스템에 Ansible을 설치하는 방법을 간략하게 안내하는 가이드입니다. Linux 분포.

Centos/RedHat 시스템에 Ansible 설치

단계 1) EPEL 저장소를 설치하세요.

[root@ansible-server ~]# sudo yum install epel-release

단계 2) Ansible 패키지를 설치하세요.

[root@ansible-server ~]# sudo  yum install -y ansible

Centos/RedHat 시스템에 Ansible 설치

앤서블 설치 Ubuntu/데비안 시스템

단계 1) 패키지를 업데이트하세요.

$ sudo apt update

단계 2) software-properties-common 패키지를 설치하세요.

$ sudo apt install software-properties-common

단계 3) Ansible 개인 패키지 아카이브를 설치하세요.

$ sudo apt-add-repository ppa:ansible/ansible

단계 4) Ansible을 설치하세요.

$ sudo apt update
$ sudo apt install ansible

Ansible 임시 명령

Ansible을 사용하는 가장 간단한 방법 중 하나는 임시 명령을 이용하는 것입니다. 이러한 명령은 단일 서버 또는 서버 그룹에 명령을 실행하려는 경우 유용합니다. 임시 명령은 저장되지 않지만, 선택한 서버와 빠르게 상호 작용하는 데 효과적입니다.

이 Ansible 튜토리얼에서는 host1과 host2라는 두 개의 서버를 포함하는 간단한 hosts 파일을 구성합니다.

Ansible 서버에서 호스트에 접근 가능한지 확인하려면 다음 명령어를 실행하면 됩니다. ping 모든 호스트에서 명령을 실행합니다.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible 임시 명령

설명 :

  1. 명령 상태(이 경우 SUCCESS)
  2. 명령이 실행된 호스트
  3. -m 매개변수를 통해 실행된 명령은 이 경우 다음과 같습니다. ping
  4. -i 매개변수를 사용하면 호스트 파일을 가리킬 수 있습니다.

필요에 따라 단일 호스트에서 동일한 명령을 실행할 수도 있습니다.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible 임시 명령

설명 :

  1. 제한 매개변수는 호스트 파일의 특정 호스트에만 명령을 실행하는 데 사용할 수 있습니다.
  2. 인벤토리 파일에 정의된 호스트 이름

파일을 여러 위치로 빠르게 복사해야 하는 경우 SCP를 사용하는 복사 모듈을 사용하십시오. 명령어와 출력은 다음과 같습니다.

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Ansible 임시 명령

설명 :

  1. 정의된 복사 모듈
  2. 이 경우 모듈 인수는 소스 절대 경로와 대상 절대 경로입니다.
  3. 복사 명령의 성공과 파일 무결성 검사를 위한 sha1 또는 md5 체크섬 및 소유자, 크기 또는 권한과 같은 메타데이터와 같은 기타 세부 정보를 반영하는 Ansible 명령 출력. 여러 서버에 패키지를 설치하는 것은 어렵지 않습니다. Ansible에는 yum, apt, dnf 등과 같은 사용된 설치 프로그램과 상호 작용하는 여러 모듈이 있습니다.

다음 예제에서는 yum 모듈을 사용하여 두 대의 CentOS 호스트에 패키지를 설치합니다.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible 임시 명령

설명 :

  1. 이 예에서는 Yum 모듈이 사용되었습니다.
  2. 이는 모듈 인수를 정의하며, 이 경우 패키지 이름과 해당 상태를 선택합니다. 예를 들어 상태가 없으면 패키지가 검색되어 발견되면 제거됩니다.
  3. 노란색으로 표시되면 상태가 변경된 ansible 명령의 출력이 표시됩니다. 즉, 이 경우 패키지가 발견되어 설치되었음을 의미합니다.
  4. ansible을 통해 실행된 yum install 명령의 상태입니다. 이 경우 ncdu.x86_64 0:1.14-1.el7 패키지가 설치되었습니다.

물론, 업데이트, 설치, 최신 버전 설치, 제거를 포함한 모든 yum 설치 프로그램 옵션을 Ansible을 통해 사용할 수 있습니다.

아래 예시에서는 이전에 설치된 ncdu 패키지를 제거하기 위해 동일한 명령어를 실행합니다.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible 임시 명령

설명 :

  1. yum 명령의 출력에는 패키지가 제거되었음을 표시합니다.

Ansible의 또 다른 핵심 기능은 시스템에 대한 정보를 수집하는 능력입니다. 하드웨어, 소프트웨어 및 버전 정보를 수집하고 각 값을 나중에 재사용할 수 있는 변수에 저장합니다.

Ansible이 수정할 시스템에 대한 자세한 정보가 필요할 때, 설정 모듈은 시스템 변수에서 이러한 정보를 수집합니다.

Ansible 임시 명령

Ansible 플레이북

Ansible 플레이북 플레이북은 스크립트를 통해 원격 시스템에 명령을 보내는 방법입니다. 플레이북은 복잡한 시스템 환경을 구성하고 하나 이상의 시스템에 대해 단일 스크립트를 실행하여 유연성을 높입니다. 프로그래밍 언어라기보다는 구성 언어에 더 가깝습니다.

플레이북 명령어는 YAML 형식을 사용하므로 구문은 간단하지만 들여쓰기는 반드시 지켜야 합니다. 이름에서 알 수 있듯이 플레이북은 여러 플레이의 모음입니다. 플레이북을 통해 특정 호스트에는 특정 역할을, 다른 호스트에는 다른 역할을 할당하여 하나의 파일로 여러 서버를 관리할 수 있습니다.

플레이북 예제를 계속하기 전에 먼저 태스크를 정의하는 것이 도움이 됩니다. 태스크는 역할 및 플레이북에 대한 Ansible 모듈의 인터페이스입니다.

이제 아래와 같이 여러 작업을 포함하는 하나의 플레이로 구성된 Ansible 플레이북을 살펴보겠습니다.

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Ansible 플레이북

위 플레이북에서 hosts 파일의 group1 호스트는 yum 모듈을 사용하여 lldpad 패키지를 설치하는 대상으로 지정됩니다. 설치 후 생성된 lldpad 서비스는 service 모듈을 사용하여 시작되며, 이 서비스는 주로 systemd 앙상블과 상호 작용합니다.

설명 :

  1. 플레이북이 실행될 호스트 그룹
  2. 이 작업에서는 lldpad 설치를 위해 Yum 모듈이 사용됩니다.
  3. 서비스 모듈은 설치 후 서비스가 실행되고 있는지 확인하는 데 사용됩니다.

각 Ansible 플레이북은 인벤토리 파일을 사용합니다. 인벤토리 파일에는 서버 목록이 그룹별로 정리되어 있어 각 호스트의 IP 주소 및 SSH 포트와 같은 세부 정보를 더욱 효과적으로 관리할 수 있습니다.

이 플레이북 예제의 인벤토리 파일은 다음과 같습니다. group1과 group2라는 두 개의 그룹이 있으며, 각 그룹에는 각각 host1과 host2가 포함되어 있습니다.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Ansible 플레이북

설명 :

  1. 그룹 이름
  2. IP 주소와 SSH 포트가 포함된 호스트 이름(이 경우 기본값은 22)입니다.

다음 Ansible 플레이북 예제에는 두 개의 호스트 그룹에 대한 두 개의 플레이가 포함되어 있습니다. 첫 번째 그룹인 group1의 경우 SELinux가 활성화되어 있으며, 활성화되면 호스트 화면에 메시지가 표시됩니다.

두 번째 그룹의 경우, ansible_os_family가 RedHat이고 ansible_system_vendor가 HP인 경우에만 httpd 패키지가 설치됩니다.

ansible_os_family와 ansible_system_vendor는 gather_facts 옵션을 사용하여 수집되는 변수이며, 이 조건부 예제와 같이 사용할 수 있습니다.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Ansible 플레이북

설명 :

  1. when 절의 예, 이 경우 OS 유형이 Debian인 경우입니다. ansible_os_family 변수는 Gather_facts 기능을 통해 수집됩니다.
  2. 작업 출력은 나중에 사용할 수 있도록 이름이 활성화_selinux로 등록됩니다.
  3. when 절의 또 다른 예입니다. 이 경우 SELinux가 실제로 이전에 활성화된 경우 호스트 사용자에게 메시지가 표시됩니다.
  4. 두 개의 규칙으로 구성된 when 절의 또 다른 예

일반 작업 외에도 핸들러라고 하는 특별한 작업이 있습니다. 핸들러는 플레이북 전체에서 고유한 이름을 가져야 합니다. 핸들러는 일반 작업처럼 작동하지만, 알림 기능을 통해 알림을 받을 수 있습니다.

플레이북 실행 중에 핸들러가 알림을 받지 못하면 실행되지 않습니다. 하지만 둘 이상의 태스크가 핸들러에 알림을 보내는 경우, 모든 태스크가 완료된 후에 한 번만 실행됩니다.

아래 예시에서 특정 작업에는 다른 작업을 호출하는 알림 섹션이 있습니다. 첫 번째 작업의 출력이 변경되면 핸들러 작업이 호출됩니다. 일반적인 예로는 구성 파일을 변경한 후 해당 서비스를 재시작하는 경우가 있습니다.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

이 경우, 첫 번째 작업인 "sshd 설정 파일 포트 수정"이 변경되어 포트가 28675가 아닌 경우, 포트가 수정되고 해당 작업은 동일한 이름의 핸들러에 알림을 보내 sshd 서비스를 재시작합니다.

Ansible 플레이북

설명 :

  1. 알리미의 예
  2. 핸들러의 예

Ansible 역할

대규모 플레이북을 다룰 때는 작업을 역할별로 나누는 것이 더 쉽습니다. 역할은 나중에 작업을 재사용하기에도 편리합니다. 역할은 여러 작업의 모음으로, 각 역할은 하나의 플레이북에서 다른 플레이북으로 이동하여 독립적으로 실행할 수 있지만, 플레이북 파일을 통해서만 실행될 수 있습니다.

역할은 별도의 디렉터리에 저장되며 특정 디렉터리 구조를 따릅니다.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

defaults 디렉터리의 YAML 파일에는 플레이북에서 사용되는 기본 변수가 포함되어 있습니다. handlers 디렉터리에는 핸들러가 저장되고, meta 디렉터리에는 작성자 및 역할 종속성에 대한 정보가 저장됩니다. tasks 디렉터리에는 역할에 대한 기본 YAML 파일이 있습니다.

테스트 디렉터리에는 샘플 YAML 플레이북과 샘플 인벤토리 파일이 포함되어 있으며, 주로 실제 역할이 생성되기 전에 테스트하는 데 사용됩니다.

vars 디렉터리에는 역할에서 사용되는 모든 변수가 정의된 YAML 파일이 있습니다. templates 및 files 디렉터리에는 역할의 작업에서 사용되는 템플릿과 파일이 있습니다.

역할에 대한 디렉터리 트리를 생성하려면 마지막 매개변수로 역할 이름을 사용하여 다음 명령을 실행하십시오.

[root@ansible-server test2]# ansible-galaxy init role1

Ansible은 템플릿과도 잘 작동하며, 템플릿 언어로 Jinja2를 사용합니다.

다음 예제는 기본적인 Jinja2 템플릿의 모습과 역할에서 이를 사용하는 방법을 보여줍니다.

실행 시점에, 예를 들어 서버가 위치한 데이터센터에 따라 resolver_ip_addresses 변수를 사용하여 각 데이터센터에 해당하는 여러 네임서버 중에서 선택할 수 있습니다.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

이 예시에서 플레이북 디렉터리는 resolver_ip_addresses를 포함한 여러 변수를 정의하며, 이러한 변수들은 데이터센터에 따라 서로 다른 값을 가집니다.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver

Ansible 역할

설명 :

  1. 사용할 템플릿의 이름입니다. 템플릿은 역할 경로의 템플릿 디렉토리에 있습니다.
  2. 클라이언트측에서 템플릿으로 대체될 파일 이름의 대상 경로입니다.
  3. 대상 파일의 권한

역할 작업에는 지정된 이름이 있는 태그 필드를 추가할 수 있습니다. 여러 작업이 동일한 태그를 공유할 수 있으며, 플레이북을 실행할 때 태그를 지정하면 해당 태그가 지정된 작업만 실행됩니다.

Ansible 사례 연구

이 섹션에서는 세 가지 역할을 포함하는 필수적인 Ansible 플레이북의 사례 연구를 분석합니다. 목표는 지금까지 다룬 개념들을 실제 사례를 통해 보여주는 것입니다. 이 플레이북에서는 이 튜토리얼의 앞부분에 나온 예제들을 일부 수정하여 재사용했습니다.

아래는 플레이북의 디렉토리 구조입니다. 사용된 YAML 파일은 p4.yml입니다.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

이 플레이북에는 세 가지 역할이 있습니다. 리졸버 역할은 /etc/resolv.conf 파일을 복사하여 서버에 특정 네임서버를 설정합니다. httpd 역할은 yum 모듈을 사용하여 httpd 패키지를 설치하고, 세 번째 역할은 SELinux를 활성화하고 로그인한 사용자에게 시스템 재부팅을 알립니다. 각 역할은 ansible-galaxy 명령어를 사용하여 생성되었습니다.

확인자 역할, main.yml 작업:

Ansible 사례 연구

Httpd 역할, main.yml 작업:

Ansible 사례 연구

Selinux 역할, main.yml 작업:

Ansible 사례 연구

아래는 p4.yml 플레이북입니다. 이 플레이북은 명령줄에서 별도로 지정하지 않는 한 모든 호스트에서 실행되며, 루트 사용자 권한으로 22번 포트(SSH)에서 실행됩니다. 또한, 역할을 실행하기 전에 팩트를 수집하고, 세 가지 역할을 모두 실행합니다. 각 역할은 ansible-playbook 명령줄에서 –t 매개변수를 사용하여 해당 역할의 태그를 지정함으로써 독립적으로 실행할 수 있습니다.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

그런 다음 두 호스트에서 p4.yml 플레이북을 실행하고 출력을 해석할 수 있습니다. 동일한 명령을 –check 매개변수와 함께 실행하여 테스트 실행을 할 수 있으며, -k 매개변수를 사용하여 암호 인증을 사용할 수도 있습니다.

Ansible 사례 연구

설명 :

  1. p4.yml을 실행하는 Ansible-playbook 명령
  2. 플레이북은 SELinux 역할이 이미 활성화되어 있으므로 건너뜁니다.
  3. Ansible은 httpd 패키지가 이미 설치되어 있음을 발견하여 ok를 반환합니다.
  4. 확인자가 설정되었으며 역할 확인자의 상태가 변경되었습니다.

Ansible 명령 치트 시트

Centos/RHEL 시스템에 EPEL 저장소 설치

[root@ansible-server ~]# sudo yum install epel-release

Centos/RHEL 시스템에 Ansible 패키지 설치

[root@ansible-server ~]# sudo  yum install -y ansible

Debian/에서 패키지 업데이트를 수행합니다.Ubuntu 시스템

$ sudo apt update

Debian/에 Software-properties-common 패키지를 설치합니다.Ubuntu 시스템

$ sudo apt install software-properties-common

Debian/에 ansible 개인 패키지 아카이브 설치Ubuntu 시스템

$ sudo apt-add-repository ppa:ansible/ansible

데비안에 앤서블 설치/Ubuntu 시스템

$ sudo apt update
$ sudo apt install ansible

문제 ping hosts라는 이름의 인벤토리 파일에 정의된 모든 서버에서 명령을 실행합니다.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping

문제 ping 호스트2에서만 명령 실행

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

인벤토리 파일의 모든 호스트에 "testfile" 파일을 복사합니다.

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

모든 호스트에 ncdu 패키지 설치

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

모든 호스트에서 ncdu 패키지 제거

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

role1이라는 역할에 대한 디렉터리 구조를 구축합니다.

[root@ansible-server test2]# ansible-galaxy init role1

테스트 실행 p4.yml 플레이북

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

모든 호스트에 대해 비밀번호 인증을 사용하여 p4.yml 플레이북 실행

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

자주 묻는 질문

예. Ansible은 에이전트리스 방식이므로 관리되는 노드에서 소프트웨어가 실행되지 않습니다. SSH 또는 WinRM을 통해 연결됩니다. Windows그리고 대상 시스템에서 실행된 후 제거되는 작은 모듈들을 푸시합니다. 제어 노드에만 Ansible이 필요합니다. Python 설치.

Ansible 플레이북은 사람이 읽기 쉬운 YAML 형식으로 작성되며, 중괄호 대신 들여쓰기를 사용합니다. 템플릿은 Jinja2 템플릿 언어를 사용하고, 팩트와 변수를 통해 하나의 플레이북으로 여러 호스트에 적용할 수 있습니다. 일반적인 프로그래밍 경험이 없어도 시작할 수 있습니다.

Ansible은 에이전트가 필요 없는 푸시 기반 방식으로, SSH를 통해 변경 사항을 전송합니다. 인형 Chef 일반적으로 에이전트 기반 및 풀 기반 방식입니다. Ansible은 YAML을 사용하는 반면, Chef Ansible은 Ruby를 사용하고 Puppet은 자체 DSL을 사용합니다. 많은 팀이 학습 곡선이 낮다는 이유로 Ansible을 선택합니다.

네. Ansible은 Red Hat과 대규모 커뮤니티에서 유지 관리하는 GNU GPL 라이선스의 무료 오픈 소스 소프트웨어입니다. 핵심 엔진과 수천 개의 모듈은 무료로 사용할 수 있습니다. Red Hat은 또한 GUI, 역할 기반 액세스 및 지원 기능을 추가한 유료 제품인 Ansible Automation Platform을 판매합니다.

예. Ansible은 SSH를 통해 접속하는 Linux 및 Unix 호스트 외에도 다양한 호스트를 관리할 수 있습니다. Windows WinRM을 통해 전용 노드를 사용하여 Windows 모듈을 사용합니다. 패키지를 설치하고, 레지스트리를 편집하고, 서비스를 관리하고, PowerShell을 실행할 수 있으므로 Linux와 PowerShell을 혼합하여 사용할 수 있습니다. Windows 함대는 하나의 제어 노드에서 자동화됩니다.

Ansible Galaxy는 커뮤니티 역할 및 컬렉션을 공유하고 다운로드할 수 있는 공개 허브입니다. `ansible-galaxy` 명령어는 역할의 디렉터리 구조를 구성하고 게시된 역할을 설치하므로, 모든 플레이북을 처음부터 작성하는 대신 테스트를 거친 자동화 기능을 재사용할 수 있습니다.

AI 어시스턴트는 일반 언어로 작성된 요청으로부터 YAML 플레이북을 생성하고, 익숙하지 않은 모듈을 설명하며, 실패한 작업이나 구문 오류에 대한 수정 사항을 제안할 수 있습니다. 또한 셸 스크립트를 멱등성 있는 작업으로 변환할 수도 있습니다. 생성된 플레이북을 실행하기 전에 모듈 이름이 올바른지, 멱등성이 충족되는지 항상 검토하십시오.

예. GitHub 부조종사 이 도구는 짧은 설명이나 파일 이름을 입력받아 플레이북 작업, 인벤토리 항목, Jinja2 템플릿을 자동 완성합니다. 생성된 YAML 파일에는 오래된 구문이나 존재하지 않는 모듈이 참조될 수 있으므로, 출력 결과를 시작점으로 활용하고 들여쓰기, 모듈 매개변수, 변수 이름 등을 확인하십시오.

이 게시물을 요약하면 다음과 같습니다.