ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible 101 스터디] 앤서블 1주차 기본 실습 (인벤토리, 플레이북)
    IT/Ansible 2024. 1. 14. 05:29
    728x90
    안녕하세요, 지난 포스팅에 이어서 Ansible 101 스터디 기본 실습을 진행합니다.
    실습 환경을 위한 노드는 다음과 같이 배포됐습니다.
    Node
     
    OS
     
    vCPU
    Memory
    Disk
    NIC IP
    관리자 계정
    기본 계정
    server
    Ubuntu 22.04
    2
    4GB
    30GB
    10.10.1.10
    root / qwe123
    ubuntu / qwe123
    tnode1
    상동
    2
    4GB
    30GB
    10.10.1.11
    root / qwe123
    ubuntu / qwe123
    tnode2
    상동
    2
    4GB
    30GB
    10.10.1.12
    root / qwe123
    ubuntu / qwe123
    tnode3
    상동
    2
    4GB
    30GB
    10.10.1.13
    root / qwe123
    ubuntu / qwe123

     

    1. 앤서블 접근을 위한 SSH 인증 구성

     

    제어 노드에 접속하여, SSH 키를 생성합니다.

    ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa

     

    그러고 나서 공개키를 관리 노드에 복사합니다.

    for i in {1..3}; do ssh-copy-id root@tnode$i; done

     


    키가 복사 됐는지 확인해 봅시다.

    for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i cat ~/.ssh/authorized_keys; echo; done

     

    해당 명령을 통해서 대상 노드 1 / 2 / 3에 공개키가 복사된 것을 확인할 수 있습니다.

    키가 복사되어, ssh로 접근이 가능해졌습니다.

     

    2. 인벤토리를 활용한 자동화 대상 호스트 설정하기

     

    2-1. 인벤토리의 정의

     

    인벤토리란, 텍스트 파일로 관리 호스트 정보를 담고 있습니다.

    다음의 명령어를 수행하여, 인벤토리를 생성합니다.

     

    1) IP를 통한 인벤토리 파일 생성

    cat <<EOT > inventory
    10.10.1.11
    10.10.1.12
    10.10.1.13
    EOT



    또한, 다음의 명령어를 수행하여 생성된 인벤토리를
    검증할 수 있습니다

    -i 명령어를 통해서 특정 인벤토리 지정할 수 있습니다.

    ansible-inventory -i ./inventory --list | jq

     

     

     

    이때, 위와 같이 ip를 설정할 수 있지만, 다음과 같이 대상에 ip가 아니라 호스트명을 넣을 수도 있습니다.

     

    2) 호스트명을 통한 인벤토리 파일 생성

    cat <<EOT > inventory
    tnode1
    tnode2
    tnode3
    
    EOT

     

     

    3) 그룹별 호스트 설정

     

    또한 요건에 따라, 아파치 데몬만 리로드 하고 싶고 db 서버에는 리로드 작업이 필요치 않을 경우,

    다음과 같이 그룹별 호스트를 지정할 수 있습니다.

     

    하기 예시는 webservers와 db-servers로 구분한 경우입니다.

    [webservers]
    web1.example.com
    web2.example.com
    
    [db-servers]
    db01.example.com
    db02.example.com

     

    다음과 같이 인벤토리 그룹을 구성해 봅시다.

    cat <<EOT > inventory
    [web]
    tnode1
    tnode2
    
    [db]
    tnode3
    
    [all:children]
    web
    db
    EOT

     

    그리고, 생성된 인벤토리는 다음의 두 가지 방법으로 확인합니다.

    ansible-inventory -i ./inventory --list | jq
    ansible-inventory -i ./inventory --graph

     

    또한 기본 구성 파일인 ansible.cfg이 세팅되어 있을 경우, -i를 사용하지 않고도 해당 파일에 정의된 인벤토리의 호스트 정보를 확인할 수 있습니다.

     

     

     

    이때, 구성 파일의 적용 순위는 다음과 같습니다.

     

    ANSIBLE_CONFIG(환경 변수)
    ansible.cfg(디렉터리당)
    ~/.ansible.cfg(홈 디렉터리)
    /etc/ansible/ansible.cfg(글로벌)

     

    3. 플레이북 작성

     

    프로젝트 디렉터리에 ansible.cfg 파일을 생성해 보겠습니다.

    이를 통해서 앤서블에 필요한 내용을 정의하고 설정할 수 있습니다.

     

    cat ~/my-ansible/Easy-Ansible/chapter_05.1/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

     

    기본적인 설정으로 defaults, privilege_escalation 섹션으로 나뉘며 해당 섹션들의 정보는 다음과 같습니다.

    [defaults] 섹션 : 앤서블 작업을 위한 기본값 설정
    매개 변수
    설명
    inventory
    인벤토리 파일의 경로를 지정함.
    remote_user
    앤서블이 관리 호스트에 연결할 때 사용하는 사용자 이름을 지정함. 이때, 사용자 이름을 지정하지 않으면 현재 사용자 이름으로 지정됨.
    ask_pass
    SSH 암호를 묻는 메시지 표시 여부를 지정함. SSH 공개 키 인증을 사용하는 경우 기본값은 false임.
    [privilege_escalation] 섹션 :
    보안/감사로 인해 원격 호스트에 권한 없는 사용자 연결 후 관리 액세스 권한을 에스컬레이션하여 루트 사용자로 가져올 때
     
    매개 변수
    설명
    become
    기본적으로 권한 에스컬레이션을 활성화할 때 사용하며, 연결 후 관리 호스트에서 자동으로 사용자를 전환할지 여부를 지정함. 일반적으로 root로 전환되며, 플레이북에서도 지정할 수 있음.
    become_method
    권한을 에스컬레이션하는 사용자 전환 방식을 의미함. 일반적으로 기본값은 sudo를 사용하며, su는 옵션으로 설정할 수 있음.
    become_user
    관리 호스트에서 전환할 사용자를 지정함. 일반적으로 기본값은 root임.
    become_ask_pass
    become_method 매개 변수에 대한 암호를 묻는 메시지 표시 여부를 지정함. 기본값은 false임. 권한을 에스컬레이션하기 위해 사용자가 암호를 입력해야 하는 경우, 구성 파일에 become_ask_pass = true 매개 변수를 설정하면 됨.

     

    실습을 위해서 다음과 같이 정의합니다.

    cat <<EOT > 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
    EOT

     

    [ad-hoc] ansible ping module 테스트하기

     

    ansible ping 모듈을 통해서 ping 모듈을 이용하여 web 그룹의 호스트로 정상 연결(pong반환)이면 ‘SUCCESS’ 출력해 보겠습니다. (이때 사용되는 ping 모듈은 icmp가 아니라 python 모듈입니다.)

     

    1) web 그룹으로 ping 테스트 시

     

    2) db 그룹으로 ping 테스트 시

     

    3) ask-pass 설정으로 비밀번호 확인 후, ping test 

     

    4) 다른 계정으로 접속 시도 시

     

     

    [ad-hoc] ansible shell module 테스트하기

    ansible shell의 경우, 노드들에 명령 구문을 전달하고 해당 결과를 반환하는 모듈입니다.

     

    ansible -m shell -a uptime all
    
    ansible -m shell -a "free -h" web
    
    ansible -m shell -a "tail -n 3 /etc/passwd" db

     

     

    3-1. 플레이북의 정의 

    플레이북은 YAML 포맷으로 작성된 텍스트 파일로,. yml이라는 확장자를 사용하여 저장됩니다.

    대상 호스트나 호스트 집합에 수행할 작업을 정의하고 이를 실행합니다.

    특정 작업 단위를 수행 시 모듈을 적용합니다. vi 편집기를 통해서 다음의 플레이북들을 생성합니다.

     

    my-ansible/first-playbook.yml

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

    my-ansible/first-playbook-with-error.yml

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

     

    위와 같이 두 개의 playbook이 있습니다.

    두 번째 yaml 파일은 보시다시피 msg의 들여 쓰기가 debug 라인과 같습니다. (의도적인 인덴트 에러)

    ansible에서는 문법 체크 기능도 제공하고 있는데요, 다음의 명령어를 수행하여 문법 체크 역시 가능합니다.

     

    결과는 다음과 같습니다.

     

    다음으로, 플레이북을 실행해 봅시다.

    명령어는 다음과 같습니다.

    ansible-playbook <파일명>

     

     

    재시작 플레이북 생성하기

    my-ansible/restart-service.yml

    ---
    - hosts: all
      tasks:
        - name: Restart sshd service
          ansible.builtin.**service**:
            name: sshd
            state: **restarted**
    

     

    위와 같이 재시작 플레이북을 만들고, 실행하면 위와 다르게 TASK에 changed가 표기됩니다.

    해당 내용 로그를 확인하면 다음과 같이 확인 가능합니다.

    감사합니다.

    728x90
    반응형
Designed by Tistory.