Profile picture

[Ansible] 앤서블 초보 탈출! 2단계: 변수, 조건, 반복문으로 레벨업하기!

JaehyoJJAng2024년 05월 21일

개요

안녕하세요! 앤서블 1단계 수업을 무사히 마치고 돌아오신 것을 환영합니다. 🥳


지난 시간에는 nginx를 설치하는 간단한 플레이북을 작성하고 실제로 테스트까지 진행하였습니다.

하지만 실제 업무는 그렇게 단순하지 않겠죠?


서버마다 다른 설정을 적용해야 할 때가 있을 것이고, 수많은 사용자를 한꺼번에 만들어야 할 때도 있어요.


이번 수업에서는 변수, 조건문, 그리고 반복문 에 대해서 배워보겠습니다.


1교시: 변수 - 설정 값, 이제 한곳에서 관리하자!

똑같은 값을 여러 곳에 반복해서 쓴다면, 나중에 변경해야 할 때 아주 번거롭습니다.

변수는 이렇게 반복되는 값을 '이름표'를 붙여 저장해두고, 필요할 때마다 이름표를 불러다 쓰는 기능입니다.


오늘의 실습 시나리오

상황

지난번에 설치한 webservers 그룹에 웹 서비스 관리자(webadmin) 계정을 만들어야 합니다.

또한, 앞으로 관리할 서버가 늘어날 것을 대비해 웹 서버 종류(nginx) 와 포트(80) 같은 주요 설정 값을 변수로 관리하고 싶습니다.


목표

  • 1. 플레이북에 변수를 사용하여 nginx 패키지 이름과 사용자 이름 정의하기
  • 2. 정의된 변수를 이용해 webadmin 사용자 생성하고, nginx 설치하기

플레이북에 변수 적용하기

1단계에서 만들었던 nginx_install.yaml 파일을 아래와 같이 수정하겠습니다.

vars 섹션이 추가로 작성되었어요.

---
- name: Manage web server with variables
  hosts: webservers
  become: yes
  vars:
    web_pkg: nginx
    web_user: webadmin

  tasks:
    - name: Install web package
      ansible.builtin.yum:
        name: "{{ web_pkg }}" # 변수 사용
        state: present

    - name: Create a web administrator user
      ansible.builtin.user:
        name: "{{ web_user }}" # 변수 사용
        comment: Web Admin

    - name: Start web service
      ansible.builtin.service:
        name: "{{ web_pkg }}" # 변수 사용
        state: started
        enabled: yes
  • vars:: 이 플레이북에서 사용할 변수들을 정의하는 공간입니다.
  • web_pkg: nginx : web_pkg 라는 변수에 nginx 값을 저장했습니다.
  • web_user: webadmin : web_user 라는 변수에 webadmin 값을 저장했습니다.
  • "{{ 변수명 }}": 정의한 변수를 사용할 때는 이렇게 중괄호 두 개로 감싸줍니다. 이제 나중에 웹 서버를 Apache(httpd)로 바꾸고 싶다면, vars 섹션의 web_pkg 값만 httpd로 수정하면 되겠죠?

테스트

플레이북 실행하고, webadmin 사용자가 정말 만들어졌는지 확인해봅시다.

# 플레이북 실행
ansible-playbook nginx_install.yml

# webservers 그룹 서버에서 /etc/passwd 파일에 webadmin이 있는지 확인
ansible webservers -a 'cat /etc/passwd | grep webadmin'

2교시: 조건문(when) - 상황에 맞게 움직이기

모든 서버에 항상 똑같은 작업을 하지는 않습니다.


예를 들어, CentOS 서버에는 yum으로, Ubuntu 서버에는 apt로 패키지를 설치해야 하죠.

**조건문(when)**은 특정 조건이 참(True)일 때만 해당 작업을 수행하도록 만드는 아주 유용한 기능입니다.


오늘의 실습 시나리오

상황

회사에 Ubuntu 서버(ubuntu_web)가 새로 들어왔습니다. 이 서버도 webservers 그룹에 추가하여 Nginx를 설치해야 합니다.


목표

  • 1. 서버의 운영체제(OS)가 CentOS 계열일 때만 yum 모듈을 사용한다.
  • 2. 서버의 운영체제(OS)가 Debian/Ubuntu 계열일 때만 apt 모듈을 사용한다.

플레이북에 조건문 적용하기

앤서블은 각 서버의 시스템 정보(ansible_facts)를 자동으로 수집합니다.

이 정보 중 OS 종류를 알려주는 ansible_os_family 변수를 활용할 수 있습니다.

---
- name: Manage web server with variables and conditionals
  hosts: webservers
  become: yes
  vars:
    web_pkg: nginx

  tasks:
    - name: Install Nginx on RHEL/CentOS
      ansible.builtin.yum:
        name: "{{ web_pkg }}"
        state: present
      when: ansible_os_family == "RedHat" # OS가 RedHat 계열일 때만 실행

    - name: Install Nginx on Debian/Ubuntu
      ansible.builtin.apt:
        name: "{{ web_pkg }}"
        state: present
      when: ansible_os_family == "Debian" # OS가 Debian 계열일 때만 실행
    
    # ... (서비스 시작 등 나머지 tasks)
  • when: ansible_os_family == "RedHat": ansible_facts가 수집한 OS 제품군 정보가 "RedHat"일 경우에만 이 yum 작업을 실행하라는 뜻입니다.
  • when: ansible_os_family == "Debian": OS 제품군이 "Debian"일 경우 이 apt 작업을 실행합니다.

3교시: 반복문(loop) - 수백 번 할 일도 단번에 처리하기

여러 명의 사용자를 만들거나, 여러 개의 패키지를 설치하거나, 여러 개의 디렉토리를 생성할 때, 똑같은 작업을 복사/붙여넣기 할 건가요?


반복문(loop) 을 사용하면 리스트에 있는 항목들을 하나씩 꺼내어 동일한 작업을 자동으로 반복 수행할 수 있습니다.


오늘의 실습 시나리오

상황

웹 개발팀에서 dev1, dev2, dev3 세 명의 개발자 계정을 서버에 추가해달라는 요청이 왔습니다.


목표

  • 1. loop를 사용하여 3명의 개발자 계정을 한 번의 task로 모두 생성한다.

플레이북에 반복문 적용하기

사용자 생성 작업을 loop를 사용해 아래와 같이 바꿔봅시다.

---
- name: Manage web server with advanced features
  hosts: webservers
  become: yes
  vars:
    developers:
      - dev1
      - dev2
      - dev3

  tasks:
    - name: Create developer accounts
      ansible.builtin.user:
        name: "{{ item }}" # loop를 돌 때마다 리스트의 항목이 item에 담깁니다
        state: present
      loop: "{{ developers }}"
  • loop: "{{ developers }}": developers 라는 변수(리스트)에 있는 항목(dev1, dev2, dev3)의 개수만큼 이 작업을 반복하라는 의미입니다.
  • name: "{{ item }}": loop가 실행될 때 리스트의 각 항목은 item이라는 특수한 변수에 자동으로 할당됩니다. 첫 번째 반복에서는 item이 "dev1", 두 번째에서는 "dev2", 세 번째에서는 "dev3"가 됩니다.

테스트

플레이북을 실행하고, 정말 3명의 계정이 모두 만들어졌는지 확인해봅시다.

# 플레이북 실행
ansible-playbook your_playbook_name.yml

# 3명의 계정이 모두 생성되었는지 확인
ansible webservers -a 'cat /etc/passwd | grep dev'
    Tag -

Loading script...