Ansible-퀵 가이드

Ansible 애플리케이션 배포, 내부 서비스 오케스트레이션, 클라우드 프로비저닝 및 기타 여러 IT 도구를 자동화하는 간단한 오픈 소스 IT 엔진입니다.

Ansible은 에이전트 나 사용자 지정 보안 인프라를 사용하지 않기 때문에 배포가 쉽습니다.

Ansible은 플레이 북을 사용하여 자동화 작업을 설명하고 플레이 북은 매우 간단한 언어를 사용합니다. YAML(사람이 읽을 수있는 데이터 직렬화 언어이며 구성 파일에 일반적으로 사용되지만 데이터가 저장되는 많은 애플리케이션에서 사용할 수 있음) 사람이 이해하고 읽고 쓰기가 매우 쉽습니다. 따라서 장점은 IT 인프라 지원 담당자도 플레이 북을 읽고 이해할 수 있으며 필요한 경우 디버그 할 수 있다는 것입니다 (YAML – 사람이 읽을 수있는 형식 임).

Ansible은 다중 계층 배포를 위해 설계되었습니다. Ansible은 한 번에 하나의 시스템을 관리하지 않으며 모든 시스템이 상호 연관되어 있음을 설명하여 IT 인프라를 모델링합니다. Ansible은 완전히 에이전트가 없으므로 Ansible은 ssh (기본값)를 통해 노드를 연결하여 작동합니다. 그러나 Kerberos와 같은 다른 연결 방법을 원할 경우 Ansible은 해당 옵션을 제공합니다.

노드에 연결 한 후 Ansible은 "Ansible 모듈"이라는 작은 프로그램을 푸시합니다. Ansible은 노드에서 해당 모듈을 실행하고 완료되면 제거합니다. Ansible은 간단한 텍스트 파일 (호스트 파일)로 인벤토리를 관리합니다. Ansible은 호스트 파일을 사용하여 호스트를 그룹화하고 플레이 북의 특정 그룹에 대한 작업을 제어 할 수 있습니다.

샘플 호스트 파일

이것은 호스트 파일의 내용입니다-

#File name: hosts
#Description: Inventory file for your application. Defines machine type abc
node to deploy specific artifacts
# Defines machine type def node to upload
metadata.

[abc-node]
#server1 ansible_host = <target machine for DU deployment> ansible_user = <Ansible
user> ansible_connection = ssh
server1 ansible_host = <your host name> ansible_user = <your unix user>
ansible_connection = ssh

[def-node]
#server2 ansible_host = <target machine for artifact upload>
ansible_user = <Ansible user> ansible_connection = ssh
server2 ansible_host = <host> ansible_user = <user> ansible_connection = ssh

구성 관리 란?

Ansible과 관련된 구성 관리는 기업의 하드웨어 및 소프트웨어를 설명하는 세부 정보를 기록하고 업데이트하여 제품 성능의 구성을 유지하는 것을 의미합니다.

이러한 정보에는 일반적으로 설치된 소프트웨어 패키지에 적용된 정확한 버전 및 업데이트와 하드웨어 장치의 위치 및 네트워크 주소가 포함됩니다. 예를 들어 새 버전을 설치하려는 경우WebLogic/WebSphere 기업에있는 모든 컴퓨터에 서버를 설치하는 경우 수동으로 이동하여 모든 컴퓨터를 업데이트하는 것은 불가능합니다.

가장 간단한 방법으로 작성된 Ansible 플레이 북 및 인벤토리를 사용하여 모든 시스템에 WebLogic / WebSphere를 한 번에 설치할 수 있습니다. 인벤토리에서 노드의 IP 주소를 나열하고 WebLogic / WebSphere를 설치하는 플레이 북을 작성하기 만하면됩니다. 제어 시스템에서 플레이 북을 실행하면 모든 노드에 설치됩니다.

Ansible은 어떻게 작동합니까?

아래 그림은 Ansible의 작동 방식을 보여줍니다.

Ansible works 노드에 연결하고 ""라는 작은 프로그램을 푸시하여Ansible 모듈 ". Ansible그런 다음 이러한 모듈 (기본적으로 SSH를 통해)을 실행하고 완료되면 제거합니다. 모듈 라이브러리는 모든 시스템에 상주 할 수 있으며 서버, 데몬 또는 데이터베이스가 필요하지 않습니다.

위 그림에서 관리 노드는 플레이 북의 전체 실행을 제어하는 ​​제어 노드 (관리 노드)입니다. 설치를 실행하는 노드입니다. 인벤토리 파일은 Ansible 모듈을 실행해야하는 호스트 목록을 제공하고 관리 노드는 SSH 연결을 수행하고 호스트 시스템에서 작은 모듈을 실행하고 제품 / 소프트웨어를 설치합니다.

Beauty Ansible은 모듈이 설치되면 모듈을 제거하여 호스트 머신에 효과적으로 연결하고 명령을 실행하며 성공적으로 설치되면 실행 된 호스트 머신에 복사 된 코드를 제거합니다.

이 장에서는 Ansible의 환경 설정에 대해 알아 봅니다.

설치 과정

주로 배포에 대해 이야기 할 때 두 가지 유형의 머신이 있습니다.

  • Control machine − 다른 기계를 관리 할 수있는 기계.

  • Remote machine − 제어 기계에 의해 처리 / 제어되는 기계.

하나의 제어 기계가 처리하는 여러 원격 기계가있을 수 있습니다. 따라서 원격 시스템을 관리하려면 제어 시스템에 Ansible을 설치해야합니다.

제어 기계 요구 사항

Ansible은 Python 2 (버전 2.6 또는 2.7) 또는 Python 3 (버전 3.5 이상)이 설치된 모든 머신에서 실행할 수 있습니다.

Note − Windows는 제어 시스템을 지원하지 않습니다.

기본적으로 Ansible은 ssh 원격 컴퓨터를 관리합니다.

Ansible은 데이터베이스를 추가하지 않습니다. 시작하거나 계속 실행하기 위해 데몬이 필요하지 않습니다. 원격 컴퓨터를 관리하는 동안 Ansibledoes not소프트웨어를 설치하거나 실행중인 상태로 둡니다. 따라서 새 버전으로 이동할 때 업그레이드 방법에 대한 질문이 없습니다.

Ansible은 위에서 언급 한 요구 사항을 다른 방식으로 가진 제어 기계에 설치할 수 있습니다. Apt, yum, pkg, pip, OpenCSW, pacman 등을 통해 최신 릴리스를 설치할 수 있습니다.

Ubuntu Machine에 Apt를 통한 설치

Ansible을 설치하려면 컴퓨터에 PPA를 구성해야합니다. 이를 위해 다음 코드 줄을 실행해야합니다.

$ sudo apt-get update $ sudo apt-get install software-properties-common 
$ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update 
$ sudo apt-get install ansible

위의 코드 줄을 실행하면 Ansible을 통해 원격 머신을 관리 할 수 ​​있습니다. Ansible–version을 실행하여 버전을 확인하고 Ansible이 제대로 설치되었는지 확인합니다.

Ansible은 Ansible 플레이 북을 표현하기 위해 YAML 구문을 사용합니다. 이 장에서는 YAML에 대한 개요를 제공합니다. Ansible은 XML 및 JSON과 같은 다른 데이터 형식과 비교할 때 사람이 이해하고 읽고 쓰기가 매우 쉽기 때문에 YAML을 사용합니다.

마다 YAML 파일은 선택적으로 "---"로 시작하고 "..."로 끝납니다.

YAML 이해

이 섹션에서는 YAML 데이터가 표현되는 다양한 방법을 배웁니다.

키-값 쌍

YAML은 간단한 키-값 쌍을 사용하여 데이터를 나타냅니다. 사전은 키 : 값 쌍으로 표시됩니다.

Note − :과 값 사이에 공백이 있어야합니다.

예 : 학생 기록

--- #Optional YAML start syntax 
james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
… #Optional YAML end syntax

약어

약어를 사용하여 사전을 나타낼 수도 있습니다.

James: {name: james john, rollNo: 34, div: B, sex: male}

대표리스트

YAML로 List를 나타낼 수도 있습니다. 목록의 모든 요소 (구성원)는 "-"(-및 공백)로 시작하는 동일한 들여 쓰기로 새 행에 작성되어야합니다.

---
countries:  
   - America 
   - China 
   - Canada 
   - Iceland 
…

약어

약어를 사용하여 목록을 나타낼 수도 있습니다.

Countries: [‘America’, ‘China’, ‘Canada’, ‘Iceland’]

사전에 나열

사전 내에서 목록을 사용할 수 있습니다. 즉, 키의 값은 목록입니다.

---  
james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 
…

사전 목록

사전 목록도 만들 수 있습니다.

---  
- james: 
   name: james john 
   rollNo: 34 
      div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 

- robert: 
      name: robert richardson 
      rollNo: 53 
      div: B 
      sex: male 
   likes: 
      - biology 
      - chemistry 
…

YAML은 "|"를 사용합니다. 여러 줄을 표시하는 동안 줄 바꿈을 포함하고 여러 줄을 표시하는 동안 줄 바꿈을 억제하려면 ">" 이로 인해 큰 줄을 읽고 편집 할 수 있습니다. 두 경우 모두 의도가 무시됩니다.

우리는 또한 BooleanYAML의 (참 / 거짓) 값. 어디boolean 값은 대소 문자를 구분하지 않을 수 있습니다.

---  
- james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 
   
   result: 
      maths: 87 
      chemistry: 45 
      biology: 56 
      physics: 70 
      english: 80 
   
   passed: TRUE 
   
   messageIncludeNewLines: | 
      Congratulation!! 
      You passed with 79% 
   
   messageExcludeNewLines: > 
      Congratulation!! 
      You passed with 79%

Ansible과 관련된 몇 가지 일반적인 단어입니다.

Service/Server − 서비스를 제공하는 기계의 프로세스.

Machine − 물리적 서버, vm (가상 머신) 또는 컨테이너.

Target machine − Ansible로 구성하려는 머신.

Task − Ansible에서 관리하는 작업 (실행, 삭제) 등.

Playbook − Ansible 명령이 작성되고 yml이 머신에서 실행되는 yml 파일.

Ad Hoc 명령은 빠른 기능을 수행하기 위해 개별적으로 실행할 수있는 명령입니다. 이러한 명령은 나중에 수행 할 필요가 없습니다.

예를 들어 모든 회사 서버를 재부팅해야합니다. 이를 위해 '에서 Adhoc 명령을 실행합니다./usr/bin/ansible'.

이러한 임시 명령은 한 번만 사용되므로 구성 관리 및 배포에 사용되지 않습니다.

ansible-playbook은 구성 관리 및 배포에 사용됩니다.

병렬 처리 및 셸 명령

한 번에 12 개의 병렬 포크로 회사 서버를 재부팅하십시오. 이를 위해 연결을위한 SSHagent를 설정해야합니다.

$ ssh-agent bash 
$ ssh-add ~/.ssh/id_rsa

12 개의 병렬 포크에서 그룹 'abc'의 모든 회사 서버에 대해 재부팅을 실행하려면-

$ Ansible abc -a "/sbin/reboot" -f 12

기본적으로 Ansible은 현재 사용자 계정에서 위의 Ad-hoc 명령을 실행합니다. 이 동작을 변경하려면 다음과 같이 Ad-hoc 명령에 사용자 이름을 전달해야합니다.

$ Ansible abc -a "/sbin/reboot" -f 12 -u username

파일 전송

수행을 위해 임시 명령을 사용할 수 있습니다. SCP (Secure Copy Protocol) 여러 컴퓨터에서 병렬로 많은 파일.

많은 서버 / 컴퓨터로 파일 전송

$ Ansible abc -m copy -a "src = /etc/yum.conf dest = /tmp/yum.conf"

새 디렉토리 생성

$ Ansible abc -m file -a "dest = /path/user1/new mode = 777 owner = user1 group = user1 state = directory"

전체 디렉토리 및 파일 삭제

$ Ansible abc -m file -a "dest = /path/user1/new state = absent"

패키지 관리

Ad-hoc 명령은 yum 및 apt에 사용할 수 있습니다. 다음은 yum을 사용하는 몇 가지 임시 명령입니다.

다음 명령은 yum 패키지의 설치 여부를 확인하지만 업데이트하지는 않습니다.

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = present"

다음 명령은 패키지가 설치되지 않았는지 확인합니다.

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = absent"

다음 명령은 최신 버전의 패키지가 설치되었는지 확인합니다.

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = latest"

사실 수집

팩트는 플레이 북에서 조건문을 구현하는 데 사용할 수 있습니다. 다음 Ad-hoc 명령을 통해 모든 사실의 임시 정보를 찾을 수 있습니다.

$ Ansible all -m setup

이 장에서는 Ansible의 플레이 북에 대해 알아 봅니다.

플레이 북은 Ansible 코드가 작성되는 파일입니다. 플레이 북은 YAML 형식으로 작성됩니다. YAML은 Yet Another Markup Language의 약자입니다.PlaybooksAnsible의 핵심 기능 중 하나이며 Ansible에 실행할 작업을 알려줍니다. 작업 목록이 포함 된 Ansible의 할 일 목록과 같습니다.

플레이 북에는 사용자가 특정 컴퓨터에서 실행하려는 단계가 포함되어 있습니다. 플레이 북은 순차적으로 실행됩니다. 플레이 북은 Ansible의 모든 사용 사례를위한 빌딩 블록입니다.

플레이 북 구조

각 플레이 북은 하나 이상의 플레이를 모아 놓은 것입니다. Playbook은 Plays를 사용하여 구성됩니다. 플레이 북에는 둘 이상의 플레이가있을 수 있습니다.

연극의 기능은 특정 호스트에 대해 정의 된 일련의 명령을 매핑하는 것입니다.

YAML은 엄격한 유형의 언어입니다. 따라서 YAML 파일을 작성하는 동안 특별한주의가 필요합니다. 다른 YAML 편집기가 있지만 notepad ++와 같은 간단한 편집기를 사용하는 것이 좋습니다. Notepad ++를 열고 아래 yaml을 복사하여 붙여넣고 언어를 YAML (Language → YAML)로 변경하십시오.

YAML은 --- (하이픈 3 개)로 시작합니다.

플레이 북 만들기

샘플 YAML 파일을 작성하여 시작하겠습니다. yaml 파일로 작성된 각 섹션을 살펴 보겠습니다.

--- 
   name: install and configure DB
   hosts: testServer
   become: yes

   vars: 
      oracle_db_port_value : 1521
   
   tasks:
   -name: Install the Oracle DB
      yum: <code to install the DB>
    
   -name: Ensure the installed service is enabled and running
   service:
      name: <your service name>

위는 플레이 북의 기본 구문을 다루는 샘플 플레이 북입니다. 위의 내용을 다른 이름으로 파일에 저장test.yml. YAML 구문은 올바른 들여 쓰기를 따라야하며 구문을 작성하는 동안 약간주의해야합니다.

다른 YAML 태그

이제 다른 YAML 태그를 살펴 보겠습니다. 다른 태그는 아래에 설명되어 있습니다.

이름

이 태그는 Ansible 플레이 북의 이름을 지정합니다. 이 플레이 북이 무엇을 할 것인지와 마찬가지로. 플레이 북에 모든 논리적 이름을 지정할 수 있습니다.

호스트

이 태그는 작업을 실행하려는 호스트 또는 호스트 그룹의 목록을 지정합니다. 호스트 필드 / 태그는 필수입니다. 나열된 작업을 실행할 호스트를 Ansible에 알려줍니다. 작업은 동일한 시스템 또는 원격 시스템에서 실행할 수 있습니다. 하나는 여러 컴퓨터에서 작업을 실행할 수 있으므로 호스트 태그에는 호스트 항목 그룹도 포함될 수 있습니다.

vars

Vars 태그를 사용하면 플레이 북에서 사용할 수있는 변수를 정의 할 수 있습니다. 사용법은 모든 프로그래밍 언어의 변수와 유사합니다.

작업

모든 플레이 북에는 실행할 작업 또는 작업 목록이 포함되어야합니다. 작업은 수행해야하는 작업 목록입니다. 작업 필드에는 작업 이름이 포함됩니다. 이것은 사용자를위한 도움말 텍스트로 작동합니다. 필수는 아니지만 플레이 북을 디버깅하는 데 유용합니다. 각 작업은 내부적으로 모듈이라고하는 코드에 연결됩니다. 실행해야하는 모듈 및 실행하려는 모듈에 필요한 인수입니다.

역할은 완전히 독립적이거나 상호 의존적 인 변수, 작업, 파일, 템플릿 및 모듈 모음을위한 프레임 워크를 제공합니다.

Ansible에서 역할은 플레이 북을 여러 파일로 나누는 기본 메커니즘입니다. 이것은 쓰기를 단순화합니다complex playbooks, 재사용이 더 쉽습니다. 플레이 북을 분리하면 플레이 북을 재사용 가능한 구성 요소로 논리적으로 분리 할 수 ​​있습니다.

각 역할은 기본적으로 특정 기능 또는 원하는 출력으로 제한되며, 해당 역할 자체 또는 종속성으로 나열된 다른 역할에서 해당 결과를 제공하는 데 필요한 모든 단계가 있습니다.

역할은 플레이 북이 아닙니다. 역할은 독립적으로 사용할 수 있지만 플레이 북 내에서 사용해야하는 작은 기능입니다. 역할을 직접 실행할 수있는 방법은 없습니다. 역할에는 역할이 적용될 호스트에 대한 명시적인 설정이 없습니다.

최상위 플레이 북은 인벤토리 파일의 호스트를 해당 호스트에 적용해야하는 역할로 연결하는 다리입니다.

새 역할 생성

역할의 디렉터리 구조는 새 역할을 만드는 데 필수적입니다.

역할 구조

역할은 파일 시스템에서 구조화 된 레이아웃을 갖습니다. 기본 구조는 변경할 수 있지만 지금은 기본값을 유지하겠습니다.

각 역할은 그 자체로 디렉토리 트리입니다. 역할 이름은 / roles 디렉토리 내의 디렉토리 이름입니다.

$ ansible-galaxy -h

용법

ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...

옵션

  • -h, --help −이 도움말 메시지를 표시하고 종료합니다.

  • -v, --verbose − Verbose 모드 (자세한 내용은 -vvv, 연결 디버깅을 활성화하려면 -vvvv)

  • --version − 프로그램의 버전 번호를 표시하고 종료합니다.

역할 디렉토리 생성

위의 명령은 역할 디렉토리를 생성했습니다.

$ ansible-galaxy init vivekrole 
ERROR! The API server (https://galaxy.ansible.com/api/) is not responding, please try again later. 

$ ansible-galaxy init --force --offline vivekrole - vivekrole was created successfully $ tree vivekrole/ 
vivekrole/ 
├── defaults 
│   └── main.yml 
├── files ├── handlers 
│   └── main.yml 
├── meta 
│   └── main.yml 
├── README.md ├── tasks 
│   └── main.yml 
├── templates ├── tests │   ├── inventory 
│   └── test.yml 
└── vars 
    └── main.yml 
 
8 directories, 8 files

모든 디렉토리가 예제에서 사용되는 것은 아니며 예제에서 이들 중 일부의 사용을 보여줄 것입니다.

플레이 북에서 역할 활용

이것은 데모 목적으로 작성한 플레이 북의 코드입니다. 이 코드는 플레이 북 vivek_orchestrate.yml의 것입니다. 호스트를 정의했습니다.tomcat-node 두 가지 역할을 install-tomcatstart-tomcat.

문제는 Ansible을 통해 머신에 배포해야하는 전쟁이 있다는 것입니다.

--- 
- hosts: tomcat-node 
roles: 
   - {role: install-tomcat} 
   - {role: start-tomcat}

플레이 북을 실행하는 디렉토리 구조의 내용.

$ ls 
ansible.cfg  hosts  roles  vivek_orchestrate.retry vivek_orchestrate.yml

각 디렉터리 아래에는 작업 디렉터리가 있으며 여기에는 main.yml이 포함됩니다. install-tomcat의 main.yml 내용은 다음과 같습니다.

--- 
#Install vivek artifacts 
-  
   block: 
      - name: Install Tomcat artifacts
         action: > 
            yum name = "demo-tomcat-1" state = present 
         register: Output 
          
   always: 
      - debug: 
         msg: 
            - "Install Tomcat artifacts task ended with message: {{Output}}" 
            - "Installed Tomcat artifacts - {{Output.changed}}"

시작 tomcat의 main.yml의 내용은 다음과 같습니다.

#Start Tomcat          
-  
   block: 
      - name: Start Tomcat 
      command: <path of tomcat>/bin/startup.sh" 
      register: output 
      become: true 
   
   always: 
      - debug: 
         msg: 
            - "Start Tomcat task ended with message: {{output}}" 
            - "Tomcat started - {{output.changed}}"

플레이 북을 역할로 나누는 이점은 Tomcat 설치 기능을 사용하려는 사람은 누구나 Tomcat 설치 역할을 호출 할 수 있다는 것입니다.

플레이 북을 역할로 나누기

역할이 아닌 경우 각 역할의 main.yml 내용을 플레이 북에 복사 할 수 있습니다. yml파일. 그러나 모듈화를 위해 역할이 생성되었습니다.

재사용 가능한 기능으로 재사용 할 수있는 모든 논리적 엔티티는 역할로 이동할 수 있습니다. 이에 대한 예는 위에 나와 있습니다.

플레이 북을 실행하는 명령을 실행했습니다.

-vvv option for verbose output – verbose output 
$ cd vivek-playbook/

플레이 북을 실행하는 명령입니다.

$ sudo ansible-playbook -i hosts vivek_orchestrate.yml –vvv 
-----------------------------------------------------------------
-----------------------------------------------------------------------

산출

생성 된 출력은 화면에 표시됩니다.

사용 /users/demo/vivek-playbook/ansible.cfg 구성 파일로.

PLAYBOOK: vivek_orchestrate.yml *********************************************************
*********************************************************** 
1 plays in vivek_orchestrate.yml 

PLAY [tomcat-node] **********************************************************************
******** ************************************************* 
 
TASK [Gathering Facts] *************************************************
****************************** ********************************************* 
Tuesday 21 November 2017  13:02:05 +0530 (0:00:00.056) 0:00:00.056 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/system/setup.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249525.88-259535494116870 `" && 
   echo ansible-tmp-1511249525.88-259535494116870="` 
   echo /root/.ansible/tmp/ansibletmp-1511249525.88-259535494116870 `" ) && sleep 0' 
<localhost> PUT /tmp/tmpPEPrkd TO 
   /root/.ansible/tmp/ansible-tmp-1511249525.88259535494116870/setup.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/ 
   /root/.ansible/tmp/ansible-tmp-1511249525.88259535494116870/setup.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/setup.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/" > /dev/null 2>&1 && sleep 0' 
ok: [server1] 
META: ran handlers 
 
TASK [install-tomcat : Install Tomcat artifacts] ***********************************
*************************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:5 
Tuesday 21 November 2017  13:02:07 +0530 (0:00:01.515)       0:00:01.572 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/packaging/os/yum.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249527.34-40247177825302 `" && echo 
   ansibletmp-1511249527.34-40247177825302="` echo 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302 `" ) && sleep 0' 
<localhost> PUT /tmp/tmpu83chg TO 
   /root/.ansible/tmp/ansible-tmp-1511249527.3440247177825302/yum.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/ 
   /root/.ansible/tmp/ansible-tmp-1511249527.3440247177825302/yum.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/yum.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/" > /dev/null 2>
   &1 && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "invocation": { 
      "module_args": { 
         "conf_file": null, 
         "disable_gpg_check": false, 
         "disablerepo": null, 
         "enablerepo": null, 
         "exclude": null, 
         "install_repoquery": true, 
         "installroot": "/", 
         "list": null, 
         "name": ["demo-tomcat-1"], 
         "skip_broken": false, 
         "state": "present", 
         "update_cache": false, 
         "validate_certs": true 
      } 
   }, 
   "msg": "", 
   "rc": 0, 
   "results": [ 
      "Loaded plugins: product-id, 
      search-disabled-repos, 
      subscriptionmanager\nThis system is not registered to Red Hat Subscription Management. 
      You can use subscription-manager to register.\nResolving Dependencies\n--> 
      Running transaction check\n---> 
      Package demo-tomcat-1.noarch 0:SNAPSHOT-1 will be installed\n--> Finished Dependency 
      Resolution\n\nDependencies Resolved\n
      \n================================================================================\n 
      Package Arch Version Repository         
      Size\n==================================================================\nInstalling:\n 
      demo-tomcat-1 noarch SNAPSHOT-1 demo-repo1 7.1 M\n\nTransaction 
      Summary\n==================================================================\nInstall  1 
      Package\n\nTotal download size: 7.1 M\nInstalled size: 7.9 M\nDownloading 
         packages:\nRunning transaction 
      check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : 
      demotomcat-1-SNAPSHOT-1.noarch 1/1 \n  Verifying  : 
      demo-tomcat-1-SNAPSHOT-1.noarch 1/1 \n\nInstalled:\n  
      demo-tomcat-1.noarch 0:SNAPSHOT-1 \n\nComplete!\n" 
   ] 
} 
 
TASK [install-tomcat : debug] **********************************************************
*************************************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:11 
Tuesday 21 November 2017  13:02:13 +0530 (0:00:06.757) 0:00:08.329 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": [ 
      "Install Tomcat artifacts task ended with message: {
         u'msg': u'', u'changed': True, u'results': 
         [u'Loaded plugins: product-id, 
         search-disabledrepos, 
         subscription-manager\\nThis system is not registered to Red Hat Subscription Management. 
         You can use subscription-manager to register.\\nResolving Dependencies\\n--> 
         Running transaction check\\n---> 
         Package demo-tomcat-1.noarch 0:SNAPSHOT-1 will be installed\\n--> 
         Finished Dependency Resolution\\n
         \\nDependencies 
         Resolved\\n\\n==================================================================\\n 
         Package Arch Version Repository         
         Size\\n======================================================================== 
         =====\\nInstalling:\\n demo-tomcat-1 noarch SNAPSHOT-1 demo-repo1 7.1 M\\n\\nTransaction 
         Summary\\n=========================================================\\nInstall  1 
         Package\\n\\nTotal download size: 7.1 M\\nInstalled size: 7.9 M\\nDownloading 
            packages:\\nRunning 
         transaction check\\nRunning transaction test\\nTransaction test succeeded\\nRunning 
            transaction\\n  
         Installing : demo-tomcat-1-SNAPSHOT-1.noarch 1/1 \\n  Verifying  : 
         demo-tomcat-1-SNAPSHOT-1.noarch
         1/1 \\n\\nInstalled:\\n  demo-tomcat-1.noarch 0:SNAPSHOT-1  \\n\\nComplete!\\n'], u'rc': 0
      }", 
      "Installed Tomcat artifacts - True" 
   ] 
} 
 
TASK [install-tomcat : Clean DEMO environment] ****************************************
************************************************************ 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:19 
Tuesday 21 November 2017  13:02:13 +0530 (0:00:00.057) 0:00:08.387 ****** 
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or 
   {% %}. Found: {{installationOutput.changed}} 
 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/files/file.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.13-128345805983963 `" && echo 
   ansible-tmp-1511249534.13-128345805983963="` echo 
   /root/.ansible/tmp/ansibletmp-1511249534.13-128345805983963 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp0aXel7 TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.13128345805983963/file.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.13128345805983963/file.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/file.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
      "diff": { 
         "after": { 
            "path": "/users/demo/DEMO", 
            "state": "absent" 
      }, 
      "before": { 
         "path": "/users/demo/DEMO", 
         "state": "directory" 
      } 
   },

   "invocation": { 
      "module_args": { 
         "attributes": null, 
         "backup": null, 
         "content": null, 
         "delimiter": null, 
         "diff_peek": null, 
         "directory_mode": null, 
         "follow": false, 
         "force": false, 
         "group": null, 
         "mode": null, 
         "original_basename": null, 
         "owner": null, 
         "path": "/users/demo/DEMO", 
         "recurse": false, 
         "regexp": null, 
         "remote_src": null, 
         "selevel": null, 
         "serole": null, 
         "setype": null, 
         "seuser": null, 
         "src": null, 
         "state": "absent", 
         "unsafe_writes": null, 
         "validate": null 
      } 
   }, 
   "path": "/users/demo/DEMO", 
   "state": "absent" 
} 
 
TASK [install-tomcat : debug] ********************************************************
************************************************************* 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:29 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.257)       0:00:08.645 ****** 
ok: [server1] => {
   "changed": false, 
   "msg": [ 
      "Clean DEMO environment task ended with message:{u'diff': {u'after': {u'path': 
         u'/users/demo/DEMO', u'state': u'absent'}, 
      u'before': {u'path': u'/users/demo/DEMO', u'state': u'directory'}}, u'state': u'absent', 
         u'changed': True, u'path': u'/users/demo/DEMO'}", 
      "check value  :True" 
   ] 
} 
 
TASK [install-tomcat : Copy Tomcat to user home] *************************************
******************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:37 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.055)       0:00:08.701 ****** 
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or 
   {% %}. Found: {{installationOutput.changed}} 
 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/commands/command.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.43-41077200718443 `" && echo 
   ansibletmp-1511249534.43-41077200718443="` echo 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp25deWs TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.4341077200718443/command.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.4341077200718443/command.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443/command.py; rm -rf 
   "/root/.ansible/tmp/ansibletmp-1511249534.43-41077200718443/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "cmd": [ 
      "cp", 
      "-r", 
      "/opt/ansible/tomcat/demo", 
      "/users/demo/DEMO/" 
   ],
   "delta": "0:00:00.017923", 
   "end": "2017-11-21 13:02:14.547633", 
   "invocation": { 
      "module_args": { 
         "_raw_params": "cp -r /opt/ansible/tomcat/demo /users/demo/DEMO/", 
         "_uses_shell": false, 
         "chdir": null, 
         "creates": null, 
         "executable": null, 
         "removes": null, 
         "warn": true 
      } 
   }, 
   "rc": 0, 
   "start": "2017-11-21 13:02:14.529710", 
   "stderr": "", 
   "stderr_lines": [], 
   "stdout": "", 
   "stdout_lines": [] 
} 
 
TASK [install-tomcat : debug] ********************************************************
********************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:47 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.260)       0:00:08.961 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": "Copy Tomcat to user home task ended with message {
      'stderr_lines': [], u'changed': True, u'end': u'2017-11-21 13:02:14.547633', u'stdout': 
      u'', u'cmd': [u'cp', u'-r', u'/opt/ansible/tomcat/demo', u'/users/demo/DEMO/'], u'rc': 0, 
      u'start': u'2017-11-21 13:02:14.529710', u'stderr': u'', u'delta': u'0:00:00.017923', 
      'stdout_lines': []}" 
} 
 
TASK [start-tomcat : Start Tomcat] **************************************************
********************************************************** 
task path: /users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:5 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.044)       0:00:09.006 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/commands/command.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.63-46501211251197 `" && echo 
   ansibletmp-1511249534.63-46501211251197="` echo 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp9f06MQ TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.6346501211251197/command.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.6346501211251197/command.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197/command.py; rm -rf 
   "/root/.ansible/tmp/ansibletmp-1511249534.63-46501211251197/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "cmd": [ "/users/demo/DEMO/bin/startup.sh" ], 
   "delta": "0:00:00.020024", 
   "end": "2017-11-21 13:02:14.741649", 
   "invocation": { 
      "module_args": { 
         "_raw_params": "/users/demo/DEMO/bin/startup.sh", 
         "_uses_shell": false, 
         "chdir": null, 
         "creates": null, 
         "executable": null, 
         "removes": null, 
         "warn": true 
      } 
   }, 
   "rc": 0, 
   "start": "2017-11-21 13:02:14.721625", 
   "stderr": "", 
   "stderr_lines": [], 
   "stdout": "Tomcat started.", 
   "stdout_lines": [ "Tomcat started." ] 
} 
 
TASK [start-tomcat : debug] *************************************************
********************************************************************** 
task path: /users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:10 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.150)       0:00:09.156 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": [ 
      "Start Tomcat task ended with message: {'
         stderr_lines': [], u'changed': True, u'end': u'2017-11-21 13:02:14.741649', u'stdout': 
         u'Tomcat started.', u'cmd': [u'/users/demo/DEMO/bin/startup.sh'], u'rc': 0, u'start': 
         u'2017-11-21 13:02:14.721625', u'stderr': u'', u'delta': u'0:00:00.020024', 
         'stdout_lines': [u'Tomcat started.']}", 
      "Tomcat started - True" 
   ] 
} 
META: ran handlers 
META: ran handlers 
 
PLAY RECAP ******************************************************************************* 
********************************************************* 
server1  : ok = 9    changed = 4    unreachable = 0    failed = 0 
 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.042)       0:00:09.198 ****** 
=============================================================================== 
install-tomcat : Install Tomcat artifacts ------------------------------- 6.76s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:5 -------------- 
Gathering Facts --------------------------------------------------------- 1.52s 
 ------------------------------------------------------------------------------ 
install-tomcat : Copy Tomcat to user home ------------------------------- 0.26s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:37 ------------- 

install-tomcat : Clean DEMO environment --------------------------------- 0.26s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:19 ------------- 

start-tomcat : Start Tomcat --------------------------------------------- 0.15s 
/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:5 ----------------

install-tomcat : debug -------------------------------------------------- 0.06s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:11 ------------- 

install-tomcat : debug -------------------------------------------------- 0.06s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:29 ------------- 

install-tomcat : debug -------------------------------------------------- 0.04s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:47 ------------- 

start-tomcat : debug ---------------------------------------------------- 0.04s 
/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:10 ---------------

다음 URL을 누르면 아래와 같은 페이지로 이동합니다. http://10.76.0.134:11677/HelloWorld/HelloWorld

배포 된 전쟁에는 "Hello World"를 표시하는 서블릿이 있습니다. 자세한 출력은 ansible.cfg 파일에 추가 된 항목 때문에 각각의 모든 작업에 소요 된 시간을 보여줍니다-

[defaults] 
callback_whitelist = profile_tasks

플레이 북의 변수는 very similar모든 프로그래밍 언어에서 변수를 사용하는 것. 변수에 값을 사용 및 할당하고 플레이 북의 어느 곳에서나 사용할 수 있도록 도와줍니다. 변수 값 주위에 조건을 설정하고 그에 따라 플레이 북에서 사용할 수 있습니다.

- hosts : <your hosts> 
vars:
tomcat_port : 8080

위의 예에서는 변수 이름을 정의했습니다. tomcat_port 해당 변수에 값 8080을 할당하고 필요할 때마다 플레이 북에서 사용할 수 있습니다.

이제 공유 된 예제에서 참조를 가져옵니다. 다음 코드는 역할 (install-tomcat) 중 하나입니다.

block: 
   - name: Install Tomcat artifacts 
      action: > 
      yum name = "demo-tomcat-1" state = present 
      register: Output 
          
   always: 
      - debug: 
         msg: 
            - "Install Tomcat artifacts task ended with message: {{Output}}" 
            - "Installed Tomcat artifacts - {{Output.changed}}"

여기서 출력은 사용 된 변수입니다.

위 코드에서 사용 된 모든 키워드를 살펴 보겠습니다.

  • block − 주어진 블록을 실행하는 Ansible 구문.

  • name − 블록의 관련 이름-로깅에 사용되며 모든 블록이 성공적으로 실행 된 것을 디버깅하는 데 도움이됩니다.

  • action− 작업 태그 옆에있는 코드는 실행할 작업입니다. 액션은 yaml에서 사용되는 Ansible 키워드입니다.

  • register − 동작의 출력은 register 키워드를 사용하여 등록되며 Output은 동작 출력을 보유하는 변수 이름입니다.

  • always − 다시 Ansible 키워드는 아래에서 항상 실행됨을 나타냅니다.

  • msg − 메시지를 표시합니다.

변수 사용-{{Output}}->

이것은 변수 Output의 값을 읽을 것입니다. 또한 msg 탭에서 사용되므로 출력 변수의 값을 인쇄합니다.

또한 변수의 하위 속성도 사용할 수 있습니다. {{Output.changed}} 출력이 변경되었는지 여부를 확인하고 그에 따라 사용하는 경우와 같습니다.

플레이 북의 예외 처리

Ansible의 예외 처리는 모든 프로그래밍 언어의 예외 처리와 유사합니다. 플레이 북에서 예외 처리의 예는 다음과 같습니다.

tasks: 
   - name: Name of the task to be executed 
      block: 
         - debug: msg = 'Just a debug message , relevant for logging' 
         - command: <the command to execute> 
      
      rescue: 
         - debug: msg = 'There was an exception.. ' 
         - command: <Rescue mechanism for the above exception occurred) 
      
      always: 
         - debug: msg = "this will execute in all scenarios. Always will get logged"

다음은 예외 처리 구문입니다.

  • rescuealways 예외 처리와 관련된 키워드입니다.

  • 블록은 코드가 작성되는 곳입니다 (유닉스 머신에서 실행되는 모든 것).

  • 블록 기능 내부에 작성된 명령이 실패하면 실행이 복구 블록에 도달하여 실행됩니다. 블록 기능 아래 명령에 오류가없는 경우 구조가 실행되지 않습니다.

  • Always 모든 경우에 실행됩니다.

  • 따라서 Java와 동일한 것을 비교하면 try, catch 및 finally 블록과 유사합니다.

  • 여기, Block ~와 비슷하다 try block 실행할 코드를 작성하고 rescue ~와 비슷하다 catch blockalways ~와 비슷하다 finally.

루프

다음은 Ansible에서 루프 사용을 보여주는 예입니다.

작업은 한 디렉토리에서 tomcat webapps 폴더로 모든 war 파일 세트를 복사하는 것입니다.

아래 예에서 사용 된 대부분의 명령은 이전에 이미 다루었습니다. 여기서는 루프 사용에 집중할 것입니다.

처음에는 'shell'명령에서 ls * .war을 수행했습니다. 따라서 디렉토리에있는 모든 war 파일을 나열합니다.

해당 명령의 출력은 output이라는 변수에서 가져옵니다.

반복하려면 'with_items'구문이 사용됩니다.

with_items : "{{output.stdout_lines}}"-> output.stdout_lines는 한 줄씩 출력을 제공 한 다음 Ansible의 with_items 명령으로 출력을 반복합니다.

with_items 명령에서 stdout_lines를 사용하는 방법을 이해하기 위해 예제 출력을 첨부합니다.

--- 
#Tsting 
- hosts: tomcat-node 
   tasks: 
      - name: Install Apache 
      shell: "ls *.war" 
      register: output 
      args: 
         chdir: /opt/ansible/tomcat/demo/webapps 
      
      - file: 
         src: '/opt/ansible/tomcat/demo/webapps/{{ item }}' 
         dest: '/users/demo/vivek/{{ item }}' 
         state: link 
      with_items: "{{output.stdout_lines}}"

                

블록

전체 플레이 북은 블록으로 나뉩니다. 실행할 가장 작은 단계는 블록에 기록됩니다. 특정 명령어를 블록에 작성하면 기능을 분리하고 필요한 경우 예외 처리로 처리하는 데 도움이됩니다.

블록의 예는 위의 변수 사용, 예외 처리 및 루프에서 다룹니다.

조건부

조건은 조건에 따라 특정 단계를 실행해야하는 경우에 사용됩니다.

--- 
#Tsting 
- hosts: all 
   vars: 
      test1: "Hello Vivek" 
   tasks: 
      - name: Testing Ansible variable 
      debug: 
         msg: "Equals" 
         when: test1 == "Hello Vivek"

이 경우 test1 변수가 when 조건에서 언급 한 것과 같으므로 Equals가 인쇄됩니다. when 모든 프로그래밍 언어에서와 같이 논리 OR 및 논리 AND 조건과 함께 사용할 수 있습니다.

Hello Vivek에서 test1 변수의 값을 변경하여 Hello World를 말하고 출력을 확인하십시오.

이 장에서는 Ansible을 사용한 고급 실행이 무엇인지 알아 봅니다.

작업 별 실행을 제한하는 방법

이것은 전체 플레이 북이 아닌 하나의 실행 만 실행하면되는 매우 중요한 실행 전략입니다. For example, 서버를 중지 (프로덕션 문제가 발생하는 경우) 한 다음 서버 만 시작하려는 패치를 적용한 후 게시한다고 가정합니다.

여기 원래 플레이 북에서 중지와 시작은 동일한 플레이 북에서 다른 역할의 일부 였지만 태그를 사용하여 처리 할 수 ​​있습니다. 우리는 다른 역할에 다른 태그를 제공 할 수 있으며 (이는 작업을 가질 것입니다) 따라서 실행자가 제공 한 태그를 기반으로 지정된 역할 / 작업 만 실행됩니다. 따라서 제공된 위의 예에서 다음과 같은 태그를 추가 할 수 있습니다.

- {role: start-tomcat, tags: ['install']}}

다음 명령은 태그 사용에 도움이됩니다-

ansible-playbook -i hosts <your yaml> --tags "install" -vvv

위의 명령을 사용하면 start-tomcat 역할 만 호출됩니다. 제공된 태그는 대소 문자를 구분합니다. 정확한 일치가 명령에 전달되는지 확인하십시오.

호스트 별 실행을 제한하는 방법

특정 호스트에서 특정 단계를 실행하는 방법에는 두 가지가 있습니다. 특정 역할의 경우 특정 역할이 실행되어야하는 특정 호스트에 대해 호스트를 정의합니다.

- hosts: <A> 
   environment: "{{your env}}" 
   pre_tasks: 
      - debug: msg = "Started deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
     
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}" 
 
- hosts: <B> 
   pre_tasks: 
      - debug: msg = "started.... 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
        
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed the task.. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"

위의 예에 따라 제공된 호스트에 따라 각 역할 만 호출됩니다. 이제 내 호스트 A와 B가 호스트 (인벤토리 파일)에 정의되어 있습니다.

대체 솔루션

다른 솔루션은 변수를 사용하여 플레이 북의 호스트를 정의한 다음 다음을 통해 특정 호스트 주소를 전달하는 것입니다. --extra-vars

# file: user.yml  (playbook) 
--- 
- hosts: '{{ target }}' 
   user: ... 
playbook contd….

플레이 북 실행

ansible-playbook user.yml --extra-vars "target = "<your host variable>"

{{target}}이 정의되지 않은 경우 플레이 북은 아무 작업도 수행하지 않습니다. 필요한 경우 호스트 파일의 그룹을 전달할 수도 있습니다. 추가 변수가 제공되지 않으면 해를 끼치 지 않습니다.

단일 호스트를 대상으로하는 플레이 북

$ ansible-playbook user.yml --extra-vars "target = <your hosts variable>" --listhosts

Ansible 플레이 북을 디버깅하는 가장 일반적인 전략은 아래에 주어진 모듈을 사용하는 것입니다.

디버그 및 등록

이 두 가지는 Ansible에서 사용할 수있는 모듈입니다. 디버깅을 위해 두 모듈을 신중하게 사용해야합니다. 아래에 예가 나와 있습니다.

Verbosity 사용

Ansible 명령을 사용하면 자세한 수준을 제공 할 수 있습니다. 상세 수준 1 (-v) 또는 2 (-vv)로 명령을 실행할 수 있습니다.

중요 사항

이 섹션에서는 몇 가지 개념을 이해하기 위해 몇 가지 예를 살펴 보겠습니다.

변수로 시작하는 인수를 인용하지 않는 경우. 예를 들면

vars: 
   age_path: {{vivek.name}}/demo/ 
   
{{vivek.name}}

오류가 발생합니다.

해결책

vars: 
   age_path: "{{vivek.name}}/demo/" – marked in yellow is the fix. 
 
How to use register -> Copy this code into a yml file say test.yml and run it  
--- 
#Tsting 
- hosts: tomcat-node 
   tasks: 
 
   - shell: /usr/bin/uptime 
      register: myvar 
      - name: Just debugging usage 
         debug: var = myvar

Ansible-playbook -i hosts test.yml 명령을 통해이 코드를 실행하면 아래와 같은 출력이 표시됩니다.

yaml이 보이면 명령의 출력을 변수에 등록한 것입니다. myvar 출력을 인쇄했습니다.

노란색으로 표시된 텍스트는 추가 흐름 제어에 사용할 수있는 변수 –myvar의 속성에 대해 알려줍니다. 이렇게하면 특정 변수에 노출 된 속성을 알 수 있습니다. 다음 디버그 명령이 도움이됩니다.

$ ansible-playbook -i hosts test.yml 

PLAY [tomcat-node] ***************************************************************
**************** ****************************************************************
*************** ****************************** 
 
TASK [Gathering Facts] *****************************************************************
************** *****************************************************************
************** ************************** 
Monday 05 February 2018  17:33:14 +0530 (0:00:00.051) 0:00:00.051 ******* 
ok: [server1] 
 
TASK [command] ******************************************************************
************* ******************************************************************
************* ********************************** 
Monday 05 February 2018  17:33:16 +0530 (0:00:01.697) 0:00:01.748 ******* 
changed: [server1] 
 
TASK [Just debugging usage] ******************************************************************
************* ******************************************************************
************* ********************* 
Monday 05 February 2018  17:33:16 +0530 (0:00:00.226) 0:00:01.974 ******* 
ok: [server1] => { 
   "myvar": { 
      "changed": true, 
      "cmd": "/usr/bin/uptime", 
      "delta": "0:00:00.011306", 
      "end": "2018-02-05 17:33:16.424647", 
      "rc": 0, 
      "start": "2018-02-05 17:33:16.413341", 
      "stderr": "", 
      "stderr_lines": [], 
      "stdout": " 17:33:16 up 7 days, 35 min,  1 user,  load average: 0.18, 0.15, 0.14", 
      "stdout_lines": [ 
         " 17:33:16 up 7 days, 35 min,  1 user,  load average: 0.18, 0.15, 0.14" 
      ] 
   } 
} 
 
PLAY RECAP ****************************************************************************
**********************************************************************************
 ************************************** 
server1 : ok = 3    changed = 1    unreachable = 0    failed = 0

일반적인 플레이 북 문제

이 섹션에서는 몇 가지 일반적인 플레이 북 문제에 대해 알아 봅니다. 문제는-

  • Quoting
  • Indentation

Playbook은 yaml 형식으로 작성되었으며 위의 두 가지는 yaml / playbook에서 가장 일반적인 문제입니다.

Yaml은 탭 기반 들여 쓰기를 지원하지 않고 공백 기반 들여 쓰기를 지원하므로 이에 대해주의해야합니다.

Note − yaml 작성을 마치면이 사이트를 엽니 다 (https://editor.swagger.io/) 왼쪽에 yaml을 복사하여 붙여 넣어 yaml이 제대로 컴파일되는지 확인합니다. 이것은 단지 팁입니다.

Swagger는 경고 및 오류의 오류를 검증합니다.