DevOps/Ansible

Ansible study 1주차

Rainbound-IT 2024. 1. 9. 13:16
반응형

목차

     

     

     

    앤서블 특징

    • no 에이전트
    • 멱등성 - 여러번 연산을 해도 같은 결과
    • 쉬운 사용법과 다양한 모듈 제공

     

    Ansible Architecture

    https://blog.knoldus.com/why-we-need-ansible/

     

     

    제어노드

    • 앤서블이 설치되는 노드
    • 파이썬이 같이 설치되어 있어야한다.

    관리노드

    • 앤서블이 제어하는 시스템 또는 호스트
    • 윈도우, 리눅스, 퍼블릭클라우드, 프라이빗 클라우드
    • 앤서블은 별도의 에이전트를 설치하지 않음
      ⇒ 관리 노드는 제어 노드와 ssh 통신이 가능해야하며 파이썬이 설치 되어 있어야함

    인벤토리

    • 제어노드가 관리하는 관리 노드의 목록을 나열해 놓은 파일
    • 앤서블은 인벤토리에 미리 정의 되어 있는 관리노드에만 접근할 수 있다.
    • 인벤토리 목록을 다음과 같이 성격에 따라 구분할 수 있다.

    모듈

    • 앤서블은 관리 노드의 작업을 수행할 때 SSH 를 통해 연결한 후 ‘앤서블 모듈’ 이라는 스크립트를 푸시하여 작동
    • 대부분의 모듈은 원하는시스템상태를 설명하는 매개변수를 허용하며, 모듈 실행이 완료되면 제거됨

    플러그인

    • 모듈이 대상 시스템에서 별도의 프로세스로 실행되는 동안 플러그인은 제어 노드에서 실행된다.
    • 핵심기능(데이터 변환, 로그출력, 인벤토리 연결등)에 대한 옵션 및 확장 기능을 제공

    플레이북

    • 플레이북은 관리 노드에서 수행할 작업들을 YAML 문법을 이용해 순서대로 작성해 놓은 파일
    • 이 파일을 가지고 ssh로 접근해 작업 수행

     

    기본 사용법

     

    사전 요건

    sshd root 접속을 허용해야한다.(/etc/ssh/sshd_config)

    방화벽 열려있어야함

     

    자동화 대상 호스트 설정

    실행하는 폴더내에 inventory 라는 파일을 생성하여 주소를 넣을수 있다.

    ip를 넣어야하지만 /etc/hosts에 도메인 매핑 해주면 도메인으로도 넣을수 잇다.

    중괄호는 그룹화 한거고

    중첨그룹의 경우는 :childeren이라는 접미사를 추가하면 된다.

     

    key공유

    ssh-keygen

    ssh-copy-id root@10.0.20.10

     

    [webservers]
    webl.example.com
    web2.example.com
    
    [db]
    db01.example.com
    db02.example.com
    
    [datacenter:children]
    webservers
    dbserver

     

     

    인벤토리확인

    ansible-inventory -i ./inventory --list

     

    json 형태로 나온다.

     

    플레이북 작성

     

    ansible.cfg 파일 작성

    [defaults]
    inventory = ./inventory
    remote_user = root
    ask_pass = false
    
    [privilege_escalation]
    become = true
    become_method = sudo
    become_user = root
    become_ask_pass = false

     

     

    [default]

    매개변수 설명
    inventory 인벤토리 파일경로 지정
    remote_user 원격으로 연결할 사용자 이름 지정(defualt: 현재사용자이름)
    ask_pass ssh 암호 넣을지

     

     

    [privilege_escalation]

    매개변수 설명
    become 에스컬레이션 활성화 할때, 자동으로 사용자 전환시 사용(default: root)
    become_method 사용자 전환 방식
    become_user 관리 호스트에서 전환할 사용자 지정(default: root)
    become_ask_pass 에스컬레이션 할때 암호 물을지 여부

     

     

    플레이북 작성

    ---
    - hosts: all
      tasks:
        - name: Print message
          debug:
            msg: Hello CloudNet@ Ansible Study

     

    탭을 사용하면 안되는게 좋으며 space 두번으로 구조를 구분

    playbook.yml 이런식으로  확장자는 지키되 파일명은 아무거나해도 된다.

     

     

    문법체크

    ansible-playbook -syntax-check first-playbook.yml

     

     

    플레이북 실행

    ansible-playbook playbook.yml

    ansble-playbook으로 실행

     

     

     

    변수

    그룹변수

    - 그룹명 뒤에 vars를 붙이면된다.

    [web]
    tnodel-centos.exp.com
    tnode2-ubuntu.exp.com
    
    [db]
    tnode3-rhel.exp.com
    
    [all:children]
    web
    db
    
    [all:vars]
    user=ansible

     

     

    호스트 변수

    호스트 뒤에 변수를 붙이면 된다.

    [web]
    tnodel-centos.exp.com
    tnode2-ubuntu.exp.com
    
    [db]
    tnode3-rhel.exp.com user=ansiblel
    
    [all: children]
    web
    db

     

     

    플레이 변수

    플레이 북에 직접 변수 입력하는 방식

    - hosts: all
      vars:
        user: ansible2
      tasks:
      - name: Create User {{ user }}
        ansible.builtin.user:
          name: "{{ user }}"
          state: present

     

     

    추가변수

    ansible-playbook 실행 시 변수를 넣어주는 방식

    옵션은 -e

    ansible-playbook -e user=ansible5 create-user.yml

     

     

    작업 우선순위

    추가변수 > 플레이변수 > 호스트 변수 > 그룹 변수

     

     

     

    Ansible Vault

     

    암호화 방법

    ansible-vault create mysecret.yml

     

     

     

     

     

    암호화 한파일 보기

    ansible-vault view mysecret.yml

     

     

     

    암호화 할때 암호 별도 저장하여 사용하기

    ansible-vault create --vault-pass-file ./vault-pass myscret1.yml

     

    볼때도 같은 옵션 주면된다.

    ansible-vault view --vault-pass-file ./vault-pass myscret1.yml

     

    기존파일 암호화

    ansible-vault encrypt create-user.yml

     

    기존파일 복호화

    ansible-vault decrypt create-user.yml

     

    암호 변경

    ansible-vault rekey mysecret.yml

     

    암호화된 플레이북 실행

    ansible-playbook -vault-id @prompt create-user.yml

     

    설정

    ---
    
    - hosts: els
      vars_filies:
        - mysecret.yml
    
      task:
      - name: Create User {{ user }}
        ansible.builtin.user:
          name: "{{ user }}"
          state: present

     

    그냥 실행하면 위와 같은 에러가 발생한다.

     

     

     

     

    팩트

    • 앤서블이 관리 호스트에서 자동으로 검색한 변수
    • 플레이, 조건문, 반복문 또는 관리 호스트에서 수집한 값에 의존하는 기타 명령문의 일반 변수처럼 사용 가능한 호스트별 정보가 포함
      •  호스트 이름
      •  커널 버전
      •  네트워크인터페이스이름
      •  운영체제 버전
      •  CPU 개수
      •  사용 가능한 메모리
      •  스토리지 장치의 크기 및 여유 

    사용법

     facts.yml 파일을 다음과 같이 생성

    ---
    
    - hosts: els
    
      tasks:
      - name: Print all facts
        ansible.builtin.debug:
          var: ansible_facts

     

     

     ansible-playbook facts.yml 로 실행

    어마어마한 내용이 나온다.

     

    ip 정보 가져오기

    ---
    
    - hosts: els
    
      tasks:
      - name: Print all facts
        ansible.builtin.debug:
          msg: >
            The default IPv4 address of {{ ansible_facts.fqdn }}
            is {{ ansible_facts.default_ipv4.address }}

    이렇게 나온다.

     

     

    팩트  ansible_facts.* 표기법
    호스트명  ansible_facts.hostname
    도메인 기반 호스트명 ansible_facts.fqdn
    기본 IPv4 주소 ansible_facts.default_ipv4.address
    네트워크 인터페이스 이름 목록 ansible_facts.interfaces
    /dev/vda1 디스크 파티션크기 ansible_facts.device.vda.partitions.vda1.size
    DNS 서버 목록 ansible_facts.nameservers
    현재 실행중인 커널 버전 ansible_facts.kernel
    운영체제 종류 ansible_facts.distribution

     

     

    팩트 수집 끄기

    팩트 수집을 위해 해당 호스트에 특정 패키지를 설치해야만 하는 경우가 있다.

    특정 이유로 패키지를 설치 할수 없는 경우에 앤서블도 팩트 수집을 할수 없게 되거나 부하가 걸리지 않게 하려고 끄는경우가 있다.

     

    사용방법은 다음을 플레이북에 입력하면된다.

     

    gather_facts: no

    이런식으로 에러가 난다.

     

     

     

    끝!

    반응형