Computer Science

[Ansible] Ubuntu 환경구성해보기

오늘은 Ansible로 ubuntu 환경구성하는 playbook을 직접 짜보려고 한다.

 

배경으로는 팀 내 프로덕트 장비들이 ubuntu 21을 사용하고 있었는데, ubuntu 22가 (작년에) 출시되면서 호환되지않는 장비들이 생겼다. 와이파이 랜카드 등...
이를 이유로 ubuntu 22.04로 드디어 업데이트해보려고 한다. Ansible을 활용해서 구성하면, 사실 업데이트라기보다는 처음부터 새로 구성하는 것이 맞는 말이긴 하다ㅎㅎ.

 


 

1. control node에 ansible, python 설치

복습) 
- managed node(host): 환경 구성의 대상이 되는 컴퓨터들. Host, Target 등등으로도 표현한다.
control node: 앤서블 플레이북을 수행하는 서버. linux/unix 계열 + python 이 설치되어있어야 함.
  • python 설치
  • ansible 설치
sudo apt-get update
sudo apt-get install ansible

 

2. managed node에 SSH 액세스 가능하도록 셋팅

복습)
Ansible은 managed node에는 따로 ansible을 설치하지않고, openSSH을 통해 연결합니다.

control node에서 SSH 키 쌍을 생성해야합니다.

ssh-keygen

~/.ssh/id_rsa는 개인키(⚠️노출금지), ~/.ssh/id_rsa.pub은 공개키이다.

 

3. control node의 SSH 공개키를 managed nodes에 배포

필자의 경우, Managed nodes가 아주 다수이기때문에.. 여러 대의 노드에 SSH키를 배포하기란 여간 귀찮은 일이 아니다.
물론 쉘스크립트를 짤 수 있지만, 앤서블 셋팅하려고 쉘스크립트짜서 돌리기..? 뭔가 모순이다. 

SSH키 배포부터 앤서블을 사용해서 해보려고 한다.

# playbook

- name: SSH 키 배포
  hosts: target_hosts
  tasks:
    - name: 공개 키 추가
      authorized_key:
        user: remote_user
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

* remote_user를 managed nodes에서 사용하는 원격 사용자 이름으로 변경한다.

 

# inventory file

[target_hosts]
x.x.x.x ansible_user=remote_user

* remote_user를 managed nodes에서 사용하는 원격 사용자 이름으로 변경한다.

managed nodes 정보를 제공하는 인벤토리 파일을 작성해야한다. 호스트의 IP주소, 사용자이름의 정보를 포함하면 된다.
인벤토리파일은 디폴트로 /etc/ansible/hosts를 사용하며, 위치를 다른 곳에 두고싶다면 -i 옵션으로 지정하면 된다.

 

# SSH 연결 확인 (핑 테스트)

ansible -m ping target_hosts

>> SUCCESS 라고 쓰면 정상적으로 연결된거다.

 

4. 클린 우분투 설치

- name: Ubuntu 22.04 설치 및 환경 구성
  hosts: target_hosts
  gather_facts: false
  become: true

  tasks:
    - name: Ubuntu 설치
      apt:
        name: ubuntu-minimal
        state: latest
      register: install_result
      changed_when: install_result.changed

ubuntu-minimal 패키지를 통해 Ubuntu22.04를 설치한다. 

참고)

- register: task의 결과를 변수에 저장하도록 함. install_result라는 변수에 task결과를 저장하고, 이후 task에서 사용할 수 있음.

- changed_when: task가 변경 사항을 가지지않았다고 판단되는 경우에도 task를 변경되었다고 표시하는 조건 설정. 

 

5. 패키지 설치

    - name: 패키지 업데이트
      apt:
        update_cache: yes
        upgrade: yes

    - name: 필요한 패키지 설치
      apt:
        name:
          - package1
          - package2
          - package3
        state: present
참고)

`state`: ansible 패키지 모듈 사용시 쓰는 옵션. 패키지 상태 지정.

- present: 패키지가 설치되어있어야 함.
- absent: 패키지가 설치되어있지 않아야 함.
- latest: 패키지를 최신버전으로 업데이트해야 함.
- fixed: 패키지를 특정버전으로 고정해야함. version옵션을 같이 사용해서 버전 지정할 수 있다.

* 설치해야하는 패키지들을 name에 리스트로 작성하면 된다.

 

6. 셋팅(방화벽, 타임존)

    - name: 방화벽 설정
      ufw:
        rule: allow
        port: 22
        state: enabled

    - name: 타임존 설정
      timezone:
        name: Asia/Seoul

 

7. tailscale 구성

필자의 프로덕트는 tailscale vpn network를 사용하므로, tailscale 패키지 설치와 설정파일 생성작업까지 진행해야합니다.

    - name: Tailscale 패키지 다운로드
      get_url:
        url: https://pkgs.tailscale.com/stable/ubuntu/focal/tailscale_{{ tailscale_version }}_amd64.deb
        dest: /tmp/tailscale.deb

    - name: Tailscale 설치
      apt:
        deb: /tmp/tailscale.deb
        state: present

    - name: Tailscale 설정 파일 생성
      ini_file:
        dest: /etc/tailscale/tailscale.conf
        section: "Tailscale"
        option: "AuthKey"
        value: "{{ tailscale_auth_key }}"
        mode: 0600

    - name: Tailscale 서비스 실행
      systemd:
        name: tailscaled
        state: started
        enabled: yes

필자의 경우에는 tailscale.conf파일을 직접 구성하기때문에, tailscale 설정 파일 생성 task를 아래와 같이 작성한다.

    - name: Tailscale 설정 파일 생성
      copy:
        content: |
          [Tailscale]
          AuthKey = {{ tailscale_auth_key }}
          #### 여기에 작성 ######
        dest: /etc/tailscale/tailscale.conf
        mode: 0600

 

 

전체 정리

---
- name: Ubuntu 22.04 설치 및 환경 구성
  hosts: target_hosts
  gather_facts: false
  become: true

  vars:
    tailscale_version: "1.14.0"  # Tailscale 패키지 버전
    tailscale_auth_key: "YOUR_TAILSCALE_AUTH_KEY"  # Tailscale 인증 키

  tasks:
    - name: 공개키 배포
      authorized_key:
        user: your_username
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

    - name: Ubuntu 설치
      apt:
        name: ubuntu-minimal
        state: latest
      register: install_result
      changed_when: install_result.changed

    - name: 패키지 업데이트
      apt:
        update_cache: yes
        upgrade: yes

    - name: 필요한 패키지 설치
      apt:
        name:
          - package1
          - package2
          - package3
        state: present

    - name: 사용자 추가 및 SSH 키 추가
      user:
        name: your_username
        state: present
        createhome: yes
      authorized_key:
        user: your_username
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

    - name: 방화벽 설정
      ufw:
        rule: allow
        port: 22
        state: enabled

    - name: 타임존 설정
      timezone:
        name: Asia/Seoul

    - name: 호스트 이름 설정
      hostname:
        name: your_hostname
      command: hostnamectl set-hostname your_hostname

    - name: Tailscale 패키지 다운로드
      get_url:
        url: https://pkgs.tailscale.com/stable/ubuntu/focal/tailscale_{{ tailscale_version }}_amd64.deb
        dest: /tmp/tailscale.deb

    - name: Tailscale 설치
      apt:
        deb: /tmp/tailscale.deb
        state: present

    - name: Tailscale 설정 파일 생성
      copy:
        content: |
          [Tailscale]
          AuthKey = {{ tailscale_auth_key }}
          #### 여기에 작성 ######
        dest: /etc/tailscale/tailscale.conf
        mode: 0600

    - name: Tailscale 서비스 실행
      systemd:
        name: tailscaled
        state: started
        enabled: yes

이외에도 설치에 포함해야하는 것들이 더 있지만, 우선 이렇게 간단한 구성으로 테스트해보려고,
전체를 포함한 Playbook을 이렇게 작성해보았다.

이미지 백업을 위한 장비를 설정해서, 항상 해당 장비를 dump뜨다가 앤서블을 접하니,
초반 셋팅에는 시간이 들지만, human-readable하게 파일을 정리할 수 있고 쉽게 구성할 수 있어서 너무 편하고 좋다.
역시... 결론. 툴을 잘 사용하면 삶의 질이 상승한다. 

 

앤서블 만세.

 

ref: https://blog.devops.dev/install-and-configure-ansible-on-ubuntu-22-04-d044b6d5f705