Ansible 2일차

AeZan·2024년 7월 1일
0

주석

주석 사용 목적: 코드 비활성화(나중에 사용을 위한), 설명

  • # 을 사용하는 방식: 줄 전체 주석
  • ; 을 사용하는 방식: ; 이후 문자 전부 주석

애드혹 (ad-hoc)

ansible 의 기능 (어떤 명령어가 아닌)

  • 신속성: 플레이북을 작성하지 않고, (모듈을 통해 명령어 한 줄로) 간편한 자동화를 수행 가능

애드혹 명령어
ansible host-pattern -m module [-a module-argument] [-i inventory]

  • host-pattern: 호스트 지정 (인벤토리 내에 지정된)
  • module: 작업을 구현하기 위해 실행되는 작은 프로그램
  • module-argument: 모듈 내의 필요 기능
  • inventory: 인벤토리 지정

애드혹 사용해보기

  1. ad-hoc 디렉토리 생성
    mkdir ad-hoc
    cd ad-hoc

  2. inventory 파일 작성
    vim inventory
    192.168.56.102

  3. ansible.cfg 파일 작성

[defaults]
inventory = ./inventory
  1. 애드혹을 이용한 ping 모듈 사용
  • ping 모듈은 관리 호스트가 파이썬 모듈을 사용할 환경이 갖춰졌는지 확인하는 모듈
  • ICMP 아님

ansible all -m ping

ansible.cfg 에서 remote_user 미 설정 시 master에서 명령어 실행한 유저로 work 노드에서 실행함

모듈의 기능 확인

ansible-doc ping

python 2.7 이상이어야 하는 이유를 위 출력을 보면 알 수 있음. (module 사용 위함)

많이 사용하는 module

파일모듈

  • copy: 관리 호스트에 로컬 파일 복사
  • file: 파일의 사용 권한 및 기타 속성 설정
  • lineinfile: 특정 행이 파일에 있는지 여부 확인

소프트웨어 패키지 모듈

  • package: 운영 체제 고유 자동 인식 패키지 관리 도구를 사용하여 패키지 관리
  • yum: YUM 패키지 관리자를 사용하여 패키지 관리
  • apt: APT 패키지 관리자를 사용하여 패키지 관리
  • dnf: DNF 패키지 관리자를 사용하여 패키지 관리
  • gem: Ruby gem 관리
  • pip: PyPl에서 Python 패키지 관리

시스템 모듈

  • firewalld: firewalld를 사용하여 임의의 포트 및 서비스 관리
  • reboot: 시스템 재부팅
  • service: 서비스 관리
  • user: 사용자 계정 추가, 제거 및 관리

Net Tools 모듈

  • get_url: HTTP, HTTPS 또는 FTP에서 파일 다운로드
  • nmcli: 네트워킹 관리
  • uri: 웹 서비스와 상호작용

모든 모듈에 관한 Docs

module 사용해보기

모듈 사용을 위해 관리 호스트에서 사용자의 아이디, uid 확인

ansible -m user -a 'name=jin uid=1000 state=present' 192.168.56.102


애드혹 이용하여 관리 호스트에 모듈이 아닌 명령어 실행해보기

ansible -m command -a /usr/bin/hostname 192.168.56.102 -> 단순한 명령 실행 (프로그램 실행). 쉘 환경 변수 등 사용X

= ansible -m shell -a hostname 192.168.56.102 -> 쉘 환경에서 명령어 실행함. 쉘 환경 변수 등 사용 가능

ansible -m command -a set 192.168.56.102

ansible -m shell -a set 192.168.56.102

Ansible 명령 옵션

config 파일에 넣었던 항목을 애드혹에서 명령어로 작성 가능

인벤토리: -i
remote_user: -u
become: -b (넣어주면 true)
become_method: --become-method
become_user: --become-user
cd: -K (넣주면 true)

애드혹으로 다양한 옵션 사용하여 키 전달하기

  1. 새로운 키 생성
    ssh-keygen -f ~/.ssh/ad-hoc-key

  2. 키 전달

ansible 192.168.56.102 -i inventory -m copy -a 'src=~/.ssh/ad-hoc-key.pub dest=~/.ssh/authorized_keys' -u=jin -b --become-method=sudo --become-user=jin -K


플레이북

애드혹 기능과 플레이북 비교

애드혹
ansible -m user -a 'name=jin uid=1000 state=present' 192.168.56.102

플레이북 작성
mkdir playbook-adhoc
cd playbook-adhoc
vim inventory
192.168.56.102

vim ansible.cfg

[defaults]
inventory = ./inventory

규칙

  • 첫 줄은 무조건 대시(-) 세 개로 시작
  • 새로운 항목은 대시(-)로 구분
  • 항목 안에서는 같은 칸에 위치 (띄어쓰기 2칸 씩)
  • name은 항목의 이름
  • hosts는 inventory 파일 안에 명시된 호스트 선택
  • task는 실제 작업을 명시
---
- name: user check
  hosts: 192.168.56.102
  tasks:
    - name: user exists with uid 1000
      user:
        name: user
        uid: 1000
        state: present
        #present 존재하지 않으면 설치 (존재 여부 확인)
        #latest 존재 여부 상관없이 최근 버전으로 업데이트 (최신 버전 유지) 
    - name: user exists with uid 1000
      user:
        name: user01
        uid: 1000
        state: present

+) 플레이북 작성 시 작업의 순서를 지켜서 작성해야 함

다른 예시 실습

관리 호스트에서 httpd 패키지 제거
sudo yum -y remove httpd

실습을 위한 셋팅
mkdir playbook-webserver

cd playbook-webserver

vim inventory
192.168.56.102

vim ansible.cfg

[defaults]
inventory = ./inventory

vim webserver.yml // yml 파일로 해봄

---
- name: play to setup web server
  hosts: 192.168.56.102
  tasks:
    - name: latest httpd version installed
      yum:
        name: httpd
        state: latest

---
- name: play to setup web server
  hosts: 192.168.56.102
  become: yes # true 와 같음
  tasks:
    - name: latest httpd version installed
      yum:
        name: httpd
        state: latest

권한 문제로 become 항목 추가 (config 파일에 넣으면 전체 플레이북에 적용, 위에처럼 작성하면 해당 플레이북에만 적용)

작업 결과 확인
ansible-playbook -v [filename.yaml]

-vv : 작업 결과와 작업 구성
-vvv : 관리 호스트의 연결 정보까지 확인
-vvvv : 스크립트를 사용하기 위한 사용자 정보 및 플러그인 사용 정보까지 확인

문법 확인
ansible-playbook --syntax-check [filename.yaml]


예행 연습 확인
권한 상승과 같은 보안 부분은 테스트하지 않음

ansible-playbook -C [filename.yaml]

다중 플레이북

제어 노드에서 플레이북 실행

  • 로컬에 ansible 이용하여 httpd 패키지 설치 후 enable 설정
  • 관리 호스트에 ansible 이용하여 mariadb 설치 후 enable 설정
  1. key.pub 내용 authorized_keys 에 넣어주기
    cat .ssh/id_rsa.pub > .ssh/authorized_keys

  2. no password 권한 추가
    sudo vim /etc/sudoers.d/user-sudoers
    jin ALL=(ALL) NOPASSWD:ALL

  3. 디렉토리 생성
    mkdir playbook-multi
    cd playbook-multi

  4. 인벤토리 파일 작성, 설정 파일 작성
    vim inventory
    localhost
    192.168.56.102

    vim ansible.cfg
    [defaults]
    inventory = ./inventory

  5. 플레이북 작성

---
- name: first play
  hosts: localhost
  become: yes
  tasks:
    - name: first task
      yum:
        name: httpd
        state: present

    - name: second task
      service:
        name: httpd
        enabled: true
- name: second play
  hosts: 192.168.56.102
  become: yes
  tasks:
    - name: first task
      yum:
        name: mariadb-server
        state: present

    - name: second task
      service:
        name: mariadb
        enabled: true


파일 내용 존재 여부에 따라 파일 추가하는 플레이북 작성 및 실행

vim playbook-lineinfile.yml

---
- name: /etc/hosts is up to date
  hosts: 192.168.56.102
  become: true
  tasks:
    - name: master in /etc/hosts
      lineinfile:
        path: /etc/hosts
        line: '192.168.56.101 master'
        state: present

worker node 에서 확인

+) 모듈 확인
모듈 목록 확인 ansible-doc -l [| grep yum]
모듈 자세히 확인 ansible-doc [module name]

+) yaml 파일 형식을 한줄로 작성할 때는 한칸 공백으로 구분
service:name=httpd enabled=true state=started...


변수

변수의 목적

  • 긴 단어를 짧은 변수에 저장하면 입력 속도 증가
  • 관리 용이

변수의 우선순위
낮은것 ------------------- 높은것 순

  • 인벤토리에 정의된 그룹 변수
  • 인벤토리에 정의된 호스트 변수
  • 인벤토리 또는 플레이북과 동일한 디렉토리에 있는 host_vars 하위 디렉토리의 파일에 정의된 변수
  • 플레이북 안의 플레이 변수 (vars 및 vars_files)
  • 작업 변수
  • 명령줄 변수

플레이북에서 변수를 지정하는 방법

- hosts: all
  vars:
    user: user
    home: /home/user
---
- hosts: all
  vars:
    user: jin
    home: /home/jin
  tasks:
    - name: print user variable
      debug:
        var: user # 지정해준 jin

    - name: print home variable
      debug:
        var: home # 지정해준 /home/jin

inventory 에 localhost, 192.168.56.102 두개를 작성해줬기 때문에 2 개씩 결과가 나옴

플레이북에서 파일 내 변수를 지정하는 방법

많이 사용

----user.yaml----
user: user
home: /home/user
-----------------
- hosts: all
  vars_files:
    user.yaml
# user.yml

user: jin
home: /home/jin
# playbook-vars-files.yaml

- hosts: all
  vars_files:
    - user.yml
  tasks:
    - name: print user variable
      debug:
        var: user

    - name: print home variable
      debug:
        var: home


httpd 를 변수로 지정하고 실행하는 플레이북 작성 및 실행
vim playbook-httpd-vars.yml

---
- name: httpd start
  hosts: all
  vars:
    service: httpd
  
  tasks:
    - name: httpd start
      service:
        name: {{ service }}
 # 위에 있는 service 와 겹쳐서 오류 발생 -> " " 로 묶어주면 변수로 받아들임
        state: started

httpd 실행이 안됨

---
- name: httpd start
  hosts: all
  become: yes # 추가
  vars:
    service: httpd
  
  tasks:
    - name: httpd start
      service:
        name: {{ service }}
        state: started

become 추가 후 실행 완료

왜지?
systemctl 명령어이기 때문에 root 권한이 필요함

systemctl status httpd 로 두 노드에서 httpd가 active 상태를 확인함


playbook 에 become: yes 만 작성 시 나머지 요소는 default 값으로 설정됨

아래에서 default 값을 확인할 수 있음
(/etc/ansible/ansible.cfg)


인벤토리에 변수 정의

vim inventory
localhost hostname=master
192.168.56.102 hostname=worker

vim playbook-inventory.yaml

---
- name: inventory vars check
  hosts: all
  tasks:
    - name: vars check
      debug:
        var: hostname

우선순위에 따라 변수를 찾다 찾은 곳이 inventory 파일

명령줄에서 변수 재정의

ansible-playbook inventory-httpd.yml -e "hostname=user

위와 같이 작성 시 일회성 변수임



0개의 댓글

관련 채용 정보