웹사이트 검색

Ansible 변수 및 사실을 활용하는 방법 - 8부


우리는 이 Ansible 시리즈에서 변수를 언급했으며 여러분의 마음을 조금 흔들어 놓았습니다. 많은 프로그래밍 언어와 마찬가지로 변수는 본질적으로 값을 나타내는 키입니다.

유효한 변수 이름은 무엇으로 구성되나요?

변수 이름에는 문자, 숫자, 밑줄 또는 둘 중 하나 또는 모두의 혼합이 포함됩니다. 그러나 변수 이름은 항상 문자로 시작해야 하며 공백을 포함할 수 없다는 점을 명심하세요.

유효한 변수 이름과 허용되지 않는 변수 이름의 몇 가지 예를 살펴보겠습니다.

유효한 변수 이름 예:

football 
foot_ball
football20 
foot_ball20

유효하지 않은 변수 이름 예:

foot ball
20 
foot-ball

변수 유형에 대해 논의해 보겠습니다.

1. 플레이북 변수

플레이북 변수는 매우 쉽고 간단합니다. 플레이북에서 변수를 정의하려면 들여쓰기를 사용하여 변수를 작성하기 전에 vars 키워드를 사용하면 됩니다.

변수 값에 액세스하려면 변수를 따옴표로 묶은 이중 중괄호 사이에 넣으세요.

다음은 간단한 플레이북 예입니다.

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

위 플레이북에서 greeting 변수는 플레이북이 실행될 때 Hello world! 값으로 대체됩니다. 플레이북은 실행 시 Hello world! 메시지를 인쇄합니다.

또한 다음과 같이 변수 목록이나 배열을 가질 수 있습니다.

아래 플레이북에는 대륙이라는 변수가 나와 있습니다. 변수에는 대륙 이름이라는 5가지 다른 값이 있습니다. 이러한 각 값은 색인 0을 첫 번째 변수로 사용하여 쉽게 액세스할 수 있습니다.

아래 플레이북의 예는 아시아(색인 1)를 검색하고 표시합니다.

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

변수 목록은 다음과 같이 유사하게 구성될 수 있습니다.

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

목록의 모든 항목을 나열하려면 with_items 모듈을 사용하세요. 그러면 배열의 모든 값이 반복됩니다.

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

Ansible 변수의 또 다른 유형은 사전 변수입니다.

사전 변수는 플레이북에서 추가로 지원됩니다. 사전 변수를 정의하려면 사전 변수 이름 바로 아래에 있는 키-값 쌍을 식별하면 됩니다.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

위의 예에서 vlans는 사전 변수이고 idport는 키-값 쌍입니다.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

port_id의 경우 변수가 아닌 텍스트로 값을 시작하므로 중괄호를 묶는 데 따옴표가 필요하지 않습니다.

2. 특수변수

Ansible은 Jinja2 템플릿 및 플레이북에서 참조할 수 있지만 사용자가 변경하거나 정의할 수 없는 사전 정의된 변수 목록을 제공합니다.

Ansible 사전 정의 변수 목록을 통칭하여 Ansible 사실이라고 하며 플레이북이 실행될 때 수집됩니다.

모든 Ansible 변수 목록을 얻으려면 아래와 같이 Ansible 임시 명령에서 setup 모듈을 사용하십시오.

ansible -m setup hostname

그러면 다음과 같이 출력이 JSON 형식으로 표시됩니다.

ansible -m setup localhost

출력에서 Ansible 특수 변수의 예 중 일부는 다음과 같습니다.

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

다른 많은 Ansible 특수 변수가 있으며 이는 단지 몇 가지 예일 뿐입니다.

이러한 변수는 다음과 같이 Jinja2 템플릿에서 사용할 수 있습니다.

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3. 재고변수

마지막으로 목록에는 Ansible 인벤토리 변수가 있습니다. 인벤토리는 Ansible에서 관리할 모든 호스트를 포함하는 INI 형식의 파일입니다.

인벤토리에서는 변수를 호스트 시스템에 할당하고 나중에 플레이북에서 사용할 수 있습니다.

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

위 내용은 다음과 같이 플레이북 YAML 파일에 표시될 수 있습니다.

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

호스트 시스템이 동일한 변수를 공유하는 경우 인벤토리 파일에 다른 그룹을 정의하여 덜 번거롭고 불필요한 반복을 피할 수 있습니다.

예를 들어:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

위의 내용은 다음과 같이 구성될 수 있습니다.

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

그리고 플레이북 YAML 파일에서 이는 다음과 같이 정의됩니다.

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

앤서블 사실

플레이북을 실행할 때 Ansible이 수행하는 첫 번째 작업은 설정 작업을 실행하는 것입니다. 나는 당신이 다음과 같은 결과를 얻었을 것이라고 확신합니다.

TASK:  [Gathering facts] *********

Ansible 사실은 시스템 속성이나 연결된 원격 노드에 대한 정보일 뿐입니다. 이 정보에는 시스템 아키텍처, OS 버전, BIOS 정보, 시스템 시간 및 날짜, 시스템 가동 시간, IP 주소, 하드웨어 정보 등이 포함됩니다.

시스템에 대한 정보를 얻으려면 아래 명령에 표시된 대로 setup 모듈을 사용하면 됩니다.

ansible -m setup hostname

예를 들어:

ansible -m setup database_server

그러면 다음과 같이 JSON 형식으로 대규모 데이터 세트가 인쇄됩니다.

Ansible 사실은 시스템 관리자가 어떤 작업을 수행해야 하는지, 예를 들어 운영 체제에 따라 어떤 소프트웨어 패키지를 설치해야 하는지, 어떻게 구성해야 하는지 등을 알 수 있도록 돕는 데 유용합니다.

사용자 정의 사실

Ansible에서 수집할 수 있는 사용자 정의 사실을 생성할 수 있다는 것도 알고 계셨습니까? 그래 넌 할수있어. 그럼 어떻게 하시겠습니까? 기어를 바꾸고 방법을 살펴보겠습니다.

첫 번째 단계는 관리 노드 또는 원격 노드에 /etc/ansible/facts.d 디렉토리를 생성하는 것입니다.

이 디렉터리 안에 .fact 확장자를 가진 파일을 만듭니다. 이 파일은 플레이북이 Ansible 제어 노드에서 실행될 때 JSON 데이터를 반환합니다. 여기에는 플레이북 실행 후 Ansible이 검색하는 다른 사실이 포함됩니다.

다음은 날짜와 시간을 검색하는 date_time.fact라는 사용자 정의 사실 파일의 예입니다.

mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact

그 안에 다음 줄을 추가하세요.

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

파일을 저장하고 종료합니다.

이제 실행 권한을 할당합니다.

chmod +x /etc/ansible/facts.d/date_time.fact

이제 check_date.yml이라는 Ansible 제어 노드에 플레이북을 만들었습니다.

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

팩트 파일을 ansible_local 변수에 추가합니다. ansible_local은 모든 사용자 정의 사실을 저장합니다.

이제 플레이북을 실행하고 Ansible이 팩트 파일에 저장된 정보를 검색하는 것을 관찰합니다.

ansible_playbook check_date.yml

결론

이것으로 Ansible 변수 및 사실 작업에 대한 이 튜토리얼을 마칩니다.