mingming

Ansible - 변수 본문

새싹 하이브리드 클라우드/Ansible

Ansible - 변수

mingming_96 2023. 11. 18. 23:12

변수

변수 이름 

  • 변수 이름에는 문자 숫자 밑줄만 포함할 수 있습니다. 
  • 이미 예약된 플레이북 키워드나 Python 키워드는 사용할 수 없습니다. 
  • 변수는 숫자로 시작할 수 없습니다. 
  • 플레이북 예약 키워드
  • Python 예약 키워드 

변수 정의 및 참조 

1. 기본 변수 

기본 변수 정의

remote_install_path: /opt/my_app_config

기본 변수 참조

template:
  src: foo.cfg.j2
  dest: '{{  remote_install_path }}/foo.cfg'

 

2. 목록 변수

목록 변수 정의

region:
  - northeast
  - southeast
  - midwest

목록 변수 참조

region: "{{ region[0] }}"

 

3. 사전 변수

사전 변수 정의

foo:
  filed1: one
  filed2: two

 

사전 변수 참조

foo['field']
foo.filed1

 

4. 등록 변수

등록 변수 사용 : 등록 변수는 모듈의 반환값을 저장하는 변수를 의미합니다. 

---
- hosts:
  tasks:
    - name: Run a shell command and register its outpu as a variable
      shell: /usr/bin/foo
      register: foo_result
      ignore_errors: true
    - name: Run a shell command using output of the previous task
      shell: /usr/bin/bar
      when: foo_result.rc == 5

 

변수 정의 위치  

변수를 정의할 수 있는 위치

  • 인벤토리
  • 플레이북
  • 재사용 가능 파일( 외부 참조 파일 )
  • 명령의 -e 옵션  

1. 인벤토리 

호스트 변수 

[atlanta]
host1 httpd_port=80 maxRequestsPerChild=808
host2 httpd_port=303 maxRequestsPerchild=909

 

그룹 변수

[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=prxy.atlanta.example.com

 

2. 플레이북

플레이북 변수

---
- hosts: webservers
  vars:
    http_port: 80
  tasks:
    - name: ensure apache is at the latest version
      name: apache2
      state: present

 

플레이북 변수 파일 참조

---
- hosts: worker
  remote_user: slave
  vars:
    favcolor: blue
  vars_files:
    - vars.yaml

 

3. 런타임 - e 옵션 

 

키=값 형식 

ansible-playbook release.yaml --extra-vars "version=1.23.45"

 

JSON 문자열 형식

ansible-playbook release.yaml --extra-vars '{"version":"1.23.45"}'

 

JSON 또는 YAML 파일 

ansible-playbook release.yaml --extra-vars "vars.json"

변수 우선순위

변수 실습

변수를 만들고 확인하는 플레이북 ( debug 모듈 ) 

---
- hosts: worker
  remote_user: slave
  vars:
    user: slave
    home: /home/slave
  tasks:
    - name: print user variable
      debug:
        var: user
    - name: print home variable
      debug:
        var: home
        
- hosts: local
  remote_user: master
  vars:
    user: master
    home: /home/{{ user }} 
  tasks:
    - name: print {{ user }} variable
      debug:
        var: user
    - name: print {{ home }} variable
      debug:
        var: home

 

변수 파일 생성 및 변수 참조

vi user.yaml
---
user: master
home: /home/{{ user }}

vi playbook-vars-files.yaml

---
- hosts: worker
  remote_user: slave
  vars_files:
    - user.yaml
  tasks:
    - name: print user variable
      debug:
        var: user
    - name: print home variable
      debug:
        var: home
 
- hosts: local
  remote_user: master
  vars_files:
    - user.yaml
  tasks:
    - name: print {{ user }} variable
      debug:
        var: user
    - name: print {{ home }} variable
      debug:
        var: home

 

httpd를 실행시키는 플레이북

vi playbook-httpd-start
---
- name: worker httpd start
  hosts: worker
  remote_user: slave
  become: yes
  vars:
    service: httpd start
  tasks:
    - name: httpd
      service:
        name: {{ service }}
        state: started
        
 위의 플레이북을 실행시키면 에러가 발생합니다.
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: No JSON object could be decoded

해당 에러는 모듈과 겹치는 변수명을 사용했기 때문입니다. 이땐 양 끝을 "" 로 감싸주면 됩니다.

---
- name: worker httpd start
  hosts: worker
  remote_user: slave
  become: yes
  vars:
    service: httpd start
  tasks:
    - name: httpd
      service:
        name: "{{ service }}"
        state: started

 

실습 과제 

플레이북 internet.yaml 파일 생성 및 실행 

  • 관리 호스트에서 진행
  • firewalld, httpd, mairadb, php, php-mysqld 패키지를 없으면 설치하는 작업 
  • firewalld를 실행하는 작업
  • 80번 포트를 영구적으로 추가하는작업 
  • mairadb를 실행하는 작업   
---
- name: install package
  hosts: worker
  become: yes
  remote_user: slave
  tasks:
    - name: yum install package
      yum:
        name: "{{ item }}"
        state: present
      with_items:
        - firewalld
        - httpd
        - mariadb-server
        - php
        - php-mysqlnd

    - name: service start
      service:
        name: "{{ item }}"
        state: started
        enabled: true
      with_items:
        - firewalld
        - mariadb

    - name: firewalld open 80
      firewalld:
        zone: public
        port: 80/tcp
        permanent: true
        immediate: true
        state: enabled


vi service.yaml
service:
  - firewalld
  - httpd
  - mariadb

    - name: service start
      service:
        name: "{{ item }}"
        state: started
        enabled: true
      loop: "{{ service }}"