본문 바로가기
카테고리 없음

Ansible을 활용한 시스템 구축과 환경 설정 자동화

by AI의 미래 2024. 12. 2.
Ansible을 사용하여 복잡한 시스템 구축과 환경 설정을 쉽고 빠르게 자동화할 수 있는 방법을 알려드립니다. 이번 블로그에서는 여러 사례와 함께 단계별로 설명합니다.

Ansible 소개 및 필요성

Ansible은 서버 구성 관리 및 애플리케이션 배포를 자동화하기 위한 오픈소스 도구로, 인프라의 효율적인 관리와 운영을 가능하게 합니다. 본 섹션에서는 Ansible의 기본 개념과 특징을 살펴보고, 자동화의 필요성과 Ansible이 제공하는 장점에 대해 설명하겠습니다.

Ansible의 기본 개념 및 특징

Ansible은 에이전트리스(Agentless) 방식의 자동화 도구로, SSH 또는 WinRM을 통해 원격 서버에 접근합니다. 이는 복잡한 클라이언트 소프트웨어를 설치하거나 관리할 필요가 없어 간편합니다.

주요 특징:

  • 쉬운 사용성: YAML 기반의 플레이북을 사용하여 구성 파일을 작성하기 때문에 문법이 간단하며 사람의 눈에도 쉽게 이해할 수 있습니다.
  • 모듈화: Ansible은 수많은 사전 정의된 모듈을 제공하여 복잡한 작업을 간단하게 수행할 수 있도록 도와줍니다.
  • 확장성: 여러 시스템에 대해 동시에 작업을 수행할 수 있어 대규모 인프라의 관리가 용이합니다.
  • 장기 지원: 커뮤니티와 기업이 활발히 지원하고 있어, 지속적인 업데이트와 개선이 이루어지고 있습니다.

"Ansible을 통해 시스템을 구축하고 환경 설정을 자동화해보자."

 

자동화의 필요성과 Ansible의 장점

자동화는 IT 운영에서 필수적으로 요구되는 요소로, 시간 절약, 오류 감소, 일관성 유지 등의 이점을 제공합니다. Ansible은 이러한 자동화를 훌륭하게 지원하기 위한 여러 장점을 가지고 있습니다.

자동화의 필요성:

  • 시간 절약: 수작업으로 이루어지는 시스템 설정 및 배포 과정을 자동화함으로써, 시간과 인력을 절감할 수 있습니다.
  • 오류 감소: 반복적인 작업에서 발생할 수 있는 인적 오류를 피할 수 있습니다.
  • 일관성 유지: 각 서버 간에 동일한 설정을 보장하여, 환경 구성이 일관되게 유지됩니다.

Ansible의 장점:

장점 설명
에이전트 필요 없음 추가적으로 에이전트를 설치할 필요 없이 SSH로 모든 작업 가능
유연성 모든 종류의 서버와 네트워크 장비를 지원하여 다양한 환경에서 사용 가능
상태 기반 관리 인프라의 상태를 항상 파악하여 필요한 작업만 수행
풍부한 모듈 지원 거의 모든 클라우드 서비스 및 운영체제와 연동 가능

Ansible을 사용하면 시스템의 설정 및 관리가 보다 간편해지고, 인프라의 확장성이 높아집니다. 더불어 실제 예를 들자면, Ansible 플레이북을 이용해 사용자 계정을 자동으로 생성하고 암호를 설정하는 과정을 통해 수많은 서버에서 일관된 설정을 손쉽게 적용할 수 있습니다. 이는 특히 대규모 환경에서 매우 유용합니다.

결론

Ansible은 자동화하고자 하는 모든 작업을 손쉽게 처리할 수 있는 강력한 도구입니다. 다양한 장점을 가진 Ansible을 통해 인프라 관리의 효율성을 극대화하고, 운영 비용을 줄일 수 있는 기회를 제공받을 수 있습니다. 이제 Ansible을 활용하여 효율적인 시스템 관리 시대를 열어보세요! 🚀

사용자 계정 생성하기

이번 섹션에서는 사용자 계정 생성에 대해 다루고, Ansible Vault를 통해 암호화된 사용자 정보를 관리하는 방법과 사용자 계정을 생성하는 플레이북을 작성하는 과정을 상세히 설명하겠습니다.

Ansible Vault를 통한 암호화

Ansible Vault는 비밀번호 및 기타 민감한 정보를 암호화하여 보관할 수 있게 해주는 Ansible의 기능입니다. 사용자 계정과 패스워드는 보안상의 이유로 반드시 암호화하여 관리해야 합니다.

Vault 파일 생성 과정

  1. 먼저, 암호화를 위한 Vault 파일을 생성합니다. 아래의 명령어를 사용하여 secret.yml 파일을 생성합니다.
    bash ansible-vault create vars/secret.yml
  2. 파일을 생성한 후, 다음과 같은 형식으로 사용자 정보를 입력합니다:
    ```yaml

user_info:
- userid: "ansible"
userpw: "ansiblepw1"
- userid: "stack"
userpw: "stackpw1"
```

  1. 마지막으로, 생성한 Vault 파일이 제대로 있는지 확인합니다:
    bash ls -l vars/secret.yml

사용자를 생성할 때 암호는 Vault를 통해 암호화되므로, 이를 통해 보안성이 한층 높아집니다.

 

사용자 계정 생성 플레이북 작성하기

이제 암호화된 정보를 활용하여 사용자 계정을 생성하는 Ansible 플레이북을 작성해보겠습니다.

플레이북 구조 설계

  1. 프로젝트 디렉터리를 생성합니다. 폴더 구조는 다음과 같이 설정합니다:
    ~/my-ansible/ ├── chapter_09.1/ │ ├── ansible.cfg │ └── inventory │ └── create_user.yml └── vars/ └── secret.yml
  2. ansible.cfg 파일의 내용은 다음과 같습니다:
    ini [defaults] inventory = ./inventory remote_user = ubuntu ask_pass = false inject_facts_as_vars = false gathering = smart
  3. inventory 파일을 설정합니다:
    ```ini
    [web]
    tnode1
    tnode2

[db]
tnode3

[all:children]
web
db
```

사용자 계정 생성 플레이북 개발

다음으로 사용자 계정을 생성하는 플레이북을 작성합니다. create_user.yml 파일의 내용은 다음과 같습니다:

--- - hosts: all vars_files: - vars/secret.yml tasks: - name: create user ansible.builtin.user: name: "{{ item.userid }}" password: "{{ item.userpw | password_hash('sha512', '' ) }}" state: present shell: /bin/bash loop: "{{ user_info }}"

  • user 모듈을 사용하여 사용자 계정을 생성합니다.
  • 사용자 ID와 비밀번호는 Vault에서 암호화된 값을 사용합니다.
  • 패스워드는 SHA-512 해시 함수로 암호화하여 관리합니다.

플레이북 실행하기

플레이북을 문법 체크한 후, 실제로 실행해 보세요.

ansible-playbook --ask-vault-pass create_user.yml

사용자 계정 생성 확인하기

마지막으로 생성한 사용자 계정이 제대로 생성되었는지 확인합니다.

ansible -m shell -a "tail -n 3 /etc/passwd" all

해당 명령어를 통해 시스템의 사용자 목록을 확인하여, 새로 만들어진 계정이 있는지 판단할 수 있습니다.


이렇게 Ansible을 활용하여 사용자 계정 생성과 관련된 과정을 마쳤습니다. Vaulet를 통한 암호화 기법을 사용하여 사용자 정보의 보안을 강화할 수 있음을 기억해 주세요.

SSH 키 생성 및 복사

SSH(신뢰할 수 있는 셸) 키는 보안적인 이유로 서버에 접속할 때 비밀번호 대신 사용하는 인증 방법입니다. SSH 키를 생성하고 이를 리모트 서버에 복사하는 방법에 대해 알아보겠습니다.

SSH 키 생성 과정 설명

SSH 키를 생성하는 프로세스는 간단합니다. OpenSSH 클라이언트를 사용하면 몇 가지 명령어로 손쉽게 SSH 키 쌍을 생성할 수 있습니다. 다음은 SSH 키를 생성하는 기본적인 방법입니다. 🔐

  1. SSH 키 쌍 생성: 첫 번째 단계는 터미널에서 다음과 같은 명령어를 입력하여 SSH 키 쌍을 생성하는 것입니다.

bash ssh-keygen -t rsa -b 2048

  • 위치 및 이름 지정: 키 파일을 저장할 위치와 이름을 지정하라는 메시지가 표시되면 기본값을 그대로 치거나 원하는 경로를 입력합니다. 일반적으로 ~/.ssh/id_rsa로 저장됩니다.
  • 비밀번호 입력(Optional): 보안을 위해 비밀번호를 설정할 수 있지만, 비밀번호 없이 진행할 수도 있습니다.
  • 완료: 이제 SSH 키 쌍이 생성되었습니다. id_rsaid_rsa.pub 두 개의 파일이 생성되어 있는 것을 확인할 수 있습니다. 여기서 id_rsa.pub는 공개 키입니다. 이를 사용하여 다른 서버의 인증에 사용합니다.
  • “라스베가스에서 사람들은 주먹보다 더 많은 것을 믿지 않습니다.”

     

    플레이북을 통한 SSH 키 복사 방법

    Ansible을 사용하여 SSH 키를 원격 서버에 복사하는 과정은 다음과 같습니다. 플레이북을 이용하면 배포 작업을 자동화할 수 있습니다. 😃

    1. 플레이북 작성: SSH 키를 생성하고 이를 복사하는 플레이북을 작성합니다. 플레이북 파일명은 create_sshkey.yml로 설정합니다.

    --- - hosts: localhost tasks: - name: create ssh key ansible.builtin.user: name: "{{ userid }}" generate_ssh_key: true ssh_key_bits: 2048 ssh_key_file: "/home/{{ userid }}/.ssh/id_rsa" - hosts: tnode tasks: - name: copy ssh pub key ansible.posix.authorized_key: user: "{{ userid }}" state: present key: "{{ lookup('file', '/home/{{ userid }}/.ssh/id_rsa.pub') }}"

    1. 플레이북 실행: 플레이북을 실행할 때 SSH 키를 복사할 사용자의 ID를 매개변수로 지정하여 실행합니다.

    ansible-playbook -e userid=ansible create_sshkey.yml

    1. 문제 확인: 가끔 SSH 키 파일 권한 때문에 문제가 발생할 수 있습니다. 이는 SSH 키가 생성된 후 다른 사용자가 이 파일에 접근하지 못하도록 제한해야 하기 때문입니다. 이 경우 ansible.cfg 파일에서 적절한 사용자 권한을 설정해야 할 수 있습니다.
    2. 결과 확인: SSH 키가 제대로 복사되었는지 확인하려면, 해당 서버에 접속하여 SSH를 통해 로그인해 보세요.

    이렇게 SSH 키를 자동으로 생성하고 복사하는 과정은 인프라 형성의 필수적인 부분입니다. 특히, 많은 서버를 관리해야 할 경우 이 방법이 더욱 효과적입니다. 🚀

    NTP 서버 설치 및 설정

    NTP(Network Time Protocol) 서버는 컴퓨터 네트워크에서 시간을 동기화하는 데 사용됩니다. 시스템의 시간을 정확하게 유지하는 것은 다양한 응용 프로그램과 서비스의 안정성을 보장하는 데 중요합니다. 이번 섹션에서는 NTP 서버의 중요성과 설치 필요성, 그리고 Ansible 롤을 이용한 NTP 서버 자동화 방법에 대해 알아보겠습니다.

    NTP의 중요성과 설치 필요성

    네트워크 상의 모든 클라이언트는 정확한 시간을 기반으로 작업을 수행해야 합니다. 정확한 시간 동기화는 데이터베이스의 트랜잭션, 로그 기록, 보안 인증 및 시스템 운영에 매우 중요합니다.

    "시간은 모든 것의 기준이다."

    이러한 이유로 NTP 서버를 설치하고 구성을 해야 하는데, 구체적인 이유는 다음과 같습니다.

    1. 일관성 있는 로그 관리: 모든 시스템의 로그가 동일한 시간대를 기준으로 기록되어야 하며, 이를 통해 오류 분석이나 보안 사고 발생 시의 조사가 용이해집니다.
    2. 보안성 향상: 인증서와 같은 보안 기반 시스템은 시간 변경으로 인해 실패할 수 있기 때문에, 올바른 시간 동기화가 필수적입니다.
    3. 네트워크 효율 향상: 제품이나 서비스의 사용 시간에 따라 할당된 리소스를 최적화하기 위해 정확한 시간 동기화가 필요합니다.

    Ansible 롤을 이용한 NTP 서버 자동화

    Ansible을 이용하면 서버 설정과 환경 구성을 쉽게 자동화할 수 있습니다. NTP 서버 설치 또한 Ansible의 롤을 통해 간단하게 처리할 수 있습니다.

    플레이북 설계

    NTP 서버 설치를 위한 기본적인 플레이북 구조는 다음과 같습니다.

    --- - hosts: ntp_server become: yes roles: - myrole.ntp

    롤 내의 구성

    1. vars: NTP 서버의 주소와 경로를 정의합니다.

    <div class="intro-box" style="background-color: #ffaa00;; padding: 36px 36px; margin: 30px 0; border-radius: 24px; font-size: 18px; color: #000000;; box-shadow: 0 2px 4px rgba(0,0,0,0.05);">vars/main.yml</div> ntp_server: "0.kr.pool.ntp.org"

    1. tasks:
    2. OS에 따라 NTP 패키지를 설치합니다 (Ubuntu의 경우 apt 모듈 사용, CentOS의 경우 dnf 모듈 사용).

    <div class="intro-box" style="background-color: #ffaa00;; padding: 36px 36px; margin: 30px 0; border-radius: 24px; font-size: 18px; color: #000000;; box-shadow: 0 2px 4px rgba(0,0,0,0.05);">tasks/main.yml</div> - name: install NTP package ansible.builtin.package: name: ntp state: present - name: copy chrony config file ansible.builtin.template: src: chrony.conf.j2 dest: /etc/chrony/chrony.conf notify: restarting ntp service - name: start and enable NTP service ansible.builtin.service: name: ntp state: started enabled: true

    1. templates: Jinja2 템플릿을 사용하여 NTP 설정 파일을 동적으로 생성합니다.

    <div class="intro-box" style="background-color: #ffaa00;; padding: 36px 36px; margin: 30px 0; border-radius: 24px; font-size: 18px; color: #000000;; box-shadow: 0 2px 4px rgba(0,0,0,0.05);">templates/chrony.conf.j2</div> server {{ ntp_server }} driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync

    1. handlers: NTP 서비스를 재시작하기 위한 핸들러를 설정합니다.

    <div class="intro-box" style="background-color: #ffaa00;; padding: 36px 36px; margin: 30px 0; border-radius: 24px; font-size: 18px; color: #000000;; box-shadow: 0 2px 4px rgba(0,0,0,0.05);">handlers/main.yml</div> - name: restart ntp service ansible.builtin.service: name: ntp state: restarted

    플레이북 실행

    위 구성을 현재 환경에 맞게 조정한 후 아래 명령어로 NTP 서버를 설치할 수 있습니다.

    ansible-playbook -i inventory install_ntp.yml

    마무리

    NTP 서버를 통해 네트워크의 클라이언트들이 정확한 시간을 유지할 수 있도록 설정하고, 이를 Ansible 롤을 활용하여 자동화하는 방법까지 살펴보았습니다. 이를 통해 시스템 관리의 효율성을 높이고, 정확한 시간 동기화를 통해 다양한 보안 및 운영 이슈를 미연에 방지할 수 있습니다. ⏰

    네트워크 IP 설정

    네트워크 IP 설정은 시스템의 통신 및 데이터 지향성을 보장하기 위해 매우 중요한 작업입니다. 이 섹션에서는 운영 체제(OS)별 네트워크 설정 방식과 Ansible 롤을 통해 IP 설정을 자동화하는 방법에 대해 살펴보겠습니다. 🌐

    OS에 따른 네트워크 설정 방식

    운영 체제에 따라 IP 설정 방법은 차이가 있습니다. 일반적으로 리눅스 배포판에서는 두 가지 주요 방식이 있습니다: NetplanNMCLI입니다.

    OS 종류 설정 방법 설명
    Ubuntu Netplan YAML 파일을 통해 네트워크 설정을 관리하고 적용함.
    CentOS/RedHat NMCLI 콘솔에서 편리하게 네트워크 설정 및 관리 가능.

    리눅스 환경에서의 네트워크 설정은 보통 다음 절차로 진행됩니다:
    1. IP 주소 및 서브넷 마스크 설정.
    2. 게이트웨이 및 DNS 설정.
    3. 설정 파일 적용 및 서비스 재시작.

    위와 같은 방법을 통해 각 운영체제의 네트워크 환경을 설정할 수 있습니다. 특히, 구체적인 파일 구조와 설정 내용은 OS마다 다를 수 있으니 주의가 필요합니다.

    "효율적인 네트워크 관리를 위해 자동화는 필수적입니다."

     

    Ansible 롤을 통한 IP 설정 자동화

    Ansible을 사용하면 이러한 네트워크 설정 작업을 자동화할 수 있습니다. Ansible 롤을 이용하여 두 가지 주요 작업을 수행할 수 있습니다.

    1. Netplan을 통한 Ubuntu IP 설정
      • myrole.netplan 롤을 만들어 YAML 템플릿을 통해 IP 설정 파일을 생성합니다. 이를 위해 주어진 변수들과 Jinja2 템플릿을 활용하여 자동으로 /etc/netplan/에 설정 파일을 복사하고, netplan apply 명령어로 적용합니다.

      예를 들어, 01-netplan-ansible.yaml.j2 템플릿 파일은 다음과 같이 작성될 수 있습니다:
      yaml network: version: 2 ethernets: {% for item in net_info %} {{ item.con_name }}: dhcp4: no addresses: [{{ item.ip_addr }}] gateway4: {{ item.ip_gw }} nameservers: addresses: [{{ item.ip_dns }}] {% endfor %}

    2. NMCLI를 통한 CentOS/RedHat IP 설정
      • myrole.nmcli 롤을 만들어 community.general.nmcli 모듈을 사용하여 각 NIC에 대한 IP 설정을 자동화합니다. 이때 네트워크 인터페이스가 실제 존재하는지 Ansible의 팩트를 통해 확인한 뒤 설정을 진행합니다.

      예를 들어, 설정 시 스크립트는 다음과 같은 형태가 될 수 있습니다:
      yaml - name: setup nic ip community.general.nmcli: type: ethernet conn_name: "{{ item.con_name }}" ip4: "{{ item.ip_addr }}" gw4: "{{ item.ip_gw }}" dns4: "{{ item.ip_dns }}" state: present loop: "{{ net_info }}" when: net_info[0].con_name in ansible_facts.interfaces

    이와 같이 Ansible을 이용하면 시스템의 IP 설정을 손쉽게 자동화할 수 있으며, 이는 관리자의 부담을 줄여줍니다. 🎉 이를 통해 한 번의 코드 실행으로 여러 시스템을 동시에 관리할 수 있는 장점이 있습니다. 효율적인 IP 관리는 네트워크 안정성과 보안성을 높이는 열쇠입니다.

    DB 애플리케이션 설치 및 관리

    이번 섹션에서는 Ansible Galaxy를 통해 MySQL을 설치하고, 애플리케이션 설정을 자동화하는 방법을 단계별로 설명하겠습니다. 이러한 과정을 통해 서버 관리의 효율성을 높이고, 반복작업을 줄일 수 있습니다. 🚀

    Ansible Galaxy를 통한 MySQL 설치

    Ansible Galaxy에서 제공하는 geerlingguy.mysql 롤을 활용하여 MySQL을 설치하는 과정을 살펴보겠습니다.

    1. 프로젝트 디렉토리 생성
      먼저, MySQL을 설치할 프로젝트 디렉토리를 생성합니다.

    bash mkdir ~/ansible-project/chapter_10.4 cd ~/ansible-project/chapter_10.4

  • Ansible 설정 파일 작성
    ansible.cfginventory 파일을 생성하여, 관리할 호스트 정보를 정의합니다.
  • ```bash
    cat < ansible.cfg
    [defaults]
    inventory = ./inventory
    remote_user = ansible
    ask_pass = false
    roles_path = ./roles

    [privilege_escalation]
    become = true
    become_method = sudo
    become_user = root
    become_ask_pass = false
    eot

    cat < inventory
    [db]
    tnode2

    [tnode]
    tnode1
    tnode2
    tnode3
    eot
    ```

  • Ansible Galaxy에서 MySQL 롤 설치
    Galaxy에서 MySQL 롤을 설치합니다. geerlingguy.mysql 롤을 사용하여 설치할 수 있습니다.
  • bash ansible-galaxy role install -p ./roles geerlingguy.mysql

  • 플레이북 작성
    이제 MySQL을 설치할 플레이북을 작성합니다.
  • bash touch ~/ansible-project/chapter_10.4/install_mysql.yml

    다음 코드를 install_mysql.yml 파일에 추가합니다.

    ```yaml

    • hosts: db
      roles:
      • role: geerlingguy.mysql
        ```
  • 플레이북 실행
    작성한 플레이북을 실행하여 MySQL을 설치합니다.

    bash ansible-playbook install_mysql.yml -u ubuntu --private-key=~/.ssh/sigrid-gashida.pem

    설치가 완료되면 MySQL의 상태를 확인합니다.

    bash ssh tnode2 sudo systemctl status mysql

    성공적으로 설치되었다면, MySQL 서비스가 `active (running)` 상태여야 합니다.
  • "자동화된 시스템 관리 도구들은 반복적인 작업을 줄이고, 운영 환경의 일관성을 유지하는 데 매우 중요한 역할을 합니다."

    애플리케이션 설정 자동화 방법

    애플리케이션 설정을 자동화하는 과정은 주로 플레이북을 통해 이루어집니다. 다음은 핵심 단계입니다.

    1. 변수 파일 작성
      필요한 변수들을 정의한 파일을 작성하여, 반복적으로 사용할 정보를 중앙 관리합니다.

      bash touch ~/ansible-project/chapter_10.4/vars/main.yml

      변수 파일에 설치할 데이터베이스의 설정값을 추가합니다.

      ```yaml

      mysql_root_password: 'secure_password'
      mysql_databases:
      - name: 'mydb'
      encoding: 'utf8'
      ```

    2. 사용자 설정 자동화
      사용자와 권한을 자동으로 생성하도록 users.yml 파일을 수정합니다.

    yaml - name: ensure default user is present mysql_user: name: '{{ mysql_user }}' password: '{{ mysql_user_password }}' priv: '*.*:ALL' state: present

  • 전체 플레이북 실행
    설정이 완료된 후 다시 전체 플레이북을 실행하여 설정들을 적용합니다.
  • bash ansible-playbook install_mysql.yml -u ubuntu --private-key=~/.ssh/sigrid-gashida.pem

    이렇게 Ansible을 활용하여 DB 애플리케이션 설치 및 관리를 쉽고 효율적으로 수행할 수 있습니다. 자동화된 환경 설정을 통해 운영 비용과 시간을 절약하세요!

    🔗 같이보면 좋은 정보글!