초보자를 위한 Ansible 튜토리얼: 플레이북, 명령 및 예

앤서블이란?

책임감있는 소프트웨어 프로비저닝, 구성 관리, 소프트웨어 배포를 위한 오픈 소스 자동화 및 조정 도구입니다. Ansible은 Unix 계열 시스템을 쉽게 실행하고 구성할 수 있습니다. Windows 코드형 인프라를 제공하는 시스템입니다. 여기에는 시스템 구성 및 관리를 위한 자체 선언적 프로그래밍 언어가 포함되어 있습니다.

Ansible은 설치의 단순성, 클라이언트 연결과 관련된 사용 용이성, Ansible 클라이언트용 에이전트 부족 및 다양한 기술로 인해 인기가 높습니다. 다음을 통해 연결하여 작동합니다. SSH 클라이언트 측에 특수 에이전트가 필요하지 않으며 클라이언트에 모듈을 푸시하면 모듈이 클라이언트 측에서 로컬로 실행되고 출력이 Ansible 서버로 다시 푸시됩니다.

SSH를 사용하므로 SSH 키를 사용하여 클라이언트에 매우 쉽게 연결할 수 있어 전체 프로세스가 간소화됩니다. 호스트 이름이나 IP 주소 및 SSH 포트와 같은 클라이언트 세부 정보는 인벤토리 파일이라는 파일에 저장됩니다. 인벤토리 파일을 만들고 채우면 ansible에서 사용할 수 있습니다.

왜 앤서블을 사용하는가?

Ansible 사용의 몇 가지 중요한 장점/이점은 다음과 같습니다.

  • Ansible의 가장 중요한 장점 중 하나는 누구나 무료로 사용할 수 있다는 것입니다.
  • Ansible을 설치하고 사용하는 데 특별한 시스템 관리자 기술이 필요하지 않으며 공식 문서는 매우 포괄적입니다.
  • 플러그인, 모듈, 인벤토리 및 플레이북과 관련된 모듈성은 Ansible을 대규모 환경을 조율하는 데 완벽한 동반자로 만듭니다.
  • Ansible은 매우 가볍고 일관성이 있으며, 운영 체제나 기본 하드웨어와 관련된 제약이 없습니다.
  • 또한 에이전트 없는 기능과 OpenSSH 보안 기능 사용으로 인해 매우 안전합니다.
  • Ansible 채택을 장려하는 또 다른 이점은 포괄적인 문서화와 배우기 쉬운 구조 및 구성에 의해 결정되는 원활한 학습 곡선입니다.

앤서블의 역사

다음은 앤서블의 역사에서 중요한 랜드마크입니다.

  • 2012년 XNUMX월 Ansible 프로젝트가 시작되었습니다. Cobbler와 Fedora 통합 네트워크 컨트롤러인 Func의 창시자인 Michael DeHaan이 처음 개발했습니다.
  • 처음에는 AnsibleWorks Inc라고 불렸으며 Ansible 도구에 자금을 제공한 회사는 2015년 RedHat에 인수되었고 나중에 RedHat과 함께 다음과 같은 산하로 이전되었습니다. IBM.
  • 현재 Ansible은 Fedora Linux, RHEL, Centos 및 같은 배포판에 포함되어 있습니다. Oracle 리눅스.

Ansible에서 사용되는 중요 용어

  • 앤서블 서버

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

  • 모듈

    기본적으로 모듈은 클라이언트 측에서 실행되는 명령 또는 유사한 Ansible 명령 세트입니다.

  • 태스크

    작업은 완료할 단일 절차로 구성된 섹션입니다.

  • 직위별

    나중에 플레이북에서 호출할 작업 및 관련 파일을 구성하는 방법

  • 사실

    gather-facts 작업을 통해 전역 변수에서 클라이언트 시스템에서 가져온 정보

  • 목록

    ansible 클라이언트 서버에 대한 데이터를 포함하는 파일입니다. 이후 예제에서는 호스트 파일로 정의됩니다.

  • 연극

    플레이북 실행

  • 처리기

    알림자가 있는 경우에만 호출되는 작업

  • 알리미

    출력이 변경되면 핸들러를 호출하는 작업에 속하는 섹션

  • 꼬리표

    나중에 해당 특정 작업이나 작업 그룹을 발행하는 데 사용할 수 있는 작업에 설정된 이름입니다.

Linux에 Ansible 설치

옵션을 비교하고 평가한 후 Ansible을 선택하기로 결정했다면 다음 단계는 Ansible을 시스템에 설치하는 것입니다. 우리는 다양한 설치 단계를 거치게 됩니다. Linux 가장 인기 있는 배포판은 다음 작은 튜토리얼에서 다루겠습니다.

Centos/RedHat 시스템에 Ansible 설치

단계 1) EPEL 저장소 설치

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

단계 2) 앤서블 패키지 설치

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

Centos/RedHat 시스템에 Ansible 설치

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

단계 1) 패키지 업데이트 수행

$ sudo apt update

단계 2) 소프트웨어 속성 공통 패키지 설치

$ sudo apt install software-properties-common

단계 3) ansible 개인 패키지 아카이브 설치

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

단계 4) 앤서블 설치

$ sudo apt update
$ sudo apt install ansible

Ansible 임시 명령

Ansible을 사용할 수 있는 가장 간단한 방법 중 하나는 임시 명령을 사용하는 것입니다. 이는 서버 또는 여러 서버에서 일부 명령을 실행하려고 할 때 사용할 수 있습니다. 임시 명령은 나중에 사용하기 위해 저장되지 않지만 원하는 서버와 상호 작용하는 빠른 방법을 나타냅니다.

이 Ansible 튜토리얼에서는 호스트 1과 호스트 2를 포함하는 간단한 두 개의 서버 호스트 파일이 구성됩니다.

모든 호스트에서 ping 명령을 실행하여 Ansible 서버에서 호스트에 액세스할 수 있는지 확인할 수 있습니다.

[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를 사용하는 ansible의 복사 모듈을 사용할 수 있습니다. 따라서 명령과 출력은 다음과 같습니다.

[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 등과 같은 사용된 설치 프로그램과 상호 작용하는 여러 모듈이 있습니다.

다음 예에서는 두 개의 Centos 호스트에 yum 모듈을 통해 패키지를 설치하는 방법을 알아봅니다.

[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 플레이북 스크립트를 통해 원격 시스템에 명령을 보내는 방법입니다. Ansible 플레이북은 하나 이상의 시스템에 스크립트를 실행하여 유연성을 높이기 위해 복잡한 시스템 환경을 구성하는 데 사용됩니다. Ansible 플레이북은 프로그래밍 언어보다 구성 언어에 가깝습니다.

Ansible 플레이북 명령은 YAML 형식을 사용하므로 필요한 구문은 많지 않지만 들여쓰기를 준수해야 합니다. 이름에서 알 수 있듯이 플레이북은 연극 모음집입니다. 플레이북을 통해 일부 호스트에는 특정 역할을 지정하고 다른 호스트에는 다른 역할을 지정할 수 있습니다. 이렇게 하면 매우 다양한 시나리오의 여러 서버를 하나의 플레이북에서 모두 오케스트레이션할 수 있습니다.

Ansible 플레이북 예제를 계속하기 전에 모든 세부 사항을 정확하게 파악하려면 먼저 작업을 정의해야 합니다. 이는 역할 및 플레이북에 대한 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 플레이북

위의 Ansible 플레이북 예시에서 호스트 파일의 호스트 그룹 1은 yum 모듈을 사용하여 lldpad 패키지 설치를 대상으로 하며 이후 설치 후 생성된 서비스 lldpad는 주로 systemd 앙상블과 상호 작용하는 데 사용되는 서비스 모듈을 사용하여 시작됩니다.

설명 :

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

각 ansible 플레이북은 인벤토리 파일과 함께 작동합니다. 인벤토리 파일에는 다음과 같은 세부 정보를 더 잘 제어할 수 있도록 그룹으로 구분된 서버 목록이 포함되어 있습니다. IP 주소 각 호스트에 대한 SSH 포트.

이 Ansible 플레이북 예시에 사용할 수 있는 인벤토리 파일은 아래와 같습니다. 각각 Host1과 Host2를 포함하는 group1과 group2라는 두 개의 그룹이 있습니다.

[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 파일에는 플레이북과 함께 사용할 기본 변수 목록이 포함되어 있습니다. 핸들러 디렉토리는 핸들러를 저장하는 데 사용됩니다. 메타 디렉터리에는 작성자 및 역할 종속성에 대한 정보가 있어야 합니다. 작업 디렉터리에는 역할에 대한 기본 yaml 파일이 있습니다.

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

vars 디렉터리에는 역할에 사용되는 모든 변수가 정의되는 yaml 파일이 포함되어 있습니다. 디렉터리 템플릿과 디렉터리 파일에는 역할의 작업에서 사용할 파일과 템플릿이 포함되어야 합니다.

역할에 대한 디렉토리 트리를 만들려면 마지막 매개변수인 역할 이름과 함께 다음 명령을 사용해야 합니다.

[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 사례 연구

이번 섹션에서는 세 가지 역할을 가진 필수 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)에서 루트 사용자로 실행되고, 역할을 실행하기 전에 팩트를 수집하고, 앞서 언급한 세 가지 역할을 모두 실행합니다. 각 역할은 –t 매개변수로 ansible-playbook 명령줄에서 태그를 지정하여 독립적으로 실행할 수 있습니다.

---

- 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 명령을 실행합니다.

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

Host2에서만 ping 명령을 실행하십시오.

[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

요약

기술이 끊임없이 빠른 속도로 변화하고 동시에 엄청나게 빠르게 성장하는 세상에서 시스템 관리자와 DevOps 엔지니어는 일상적인 작업을 자동화하고 대규모 서버 풀을 조율하는 방법에 대해 다양한 접근 방식을 생각해야 합니다.

거기에 많은 앤서블의 대안 (Chef, Puppet) 약간의 차이점은 있지만 동일한 작업을 수행하는 Ansible은 단순성, 향상된 보안 및 가장 중요한 원활한 학습 곡선을 통해 모든 것보다 뛰어났습니다. Ansible의 이러한 특성과 빠른 채택 덕분에 우리는 Ansible 작업 시 훨씬 더 원활하게 첫 경험을 할 수 있도록 예제로 가득한 튜토리얼을 만들었습니다.

이 Ansible 기본 튜토리얼에서 우리는 Ansible을 설명하고 그 역사에 대해 조금 이야기했습니다. 우리는 Ansible의 강점과 Ansible이 다양한 규모의 인프라 자동화 및 오케스트레이션에 가져올 수 있는 이점을 언급했습니다. 우리는 필수적인 Ansible 사용 용어를 정의하고 Ansible 플레이북의 구조를 정의했습니다. 모든 정보와 함께 철저한 예제가 자세한 설명과 함께 제공되었습니다.