Ssoon

[ Part-3 ] 앤서블 활용 - 시스템 구축 자동 본문

Ansible 101 Study

[ Part-3 ] 앤서블 활용 - 시스템 구축 자동

구구달스 2024. 2. 3. 18:28
CloudNet@ 가시다님이 진행하는 Ansible 101 Study
"앤서블로 시작하는 인프라 자동화" (한빛미디어) 로 진행

사용자 계정 생성

ansible 의 playbook 작성 = playbook 개발 = 사전 분석 + playbook 설계

💠 사전 분석

  • 사용자 계정과 패스워드는 Vault 를 이용해 암호화
  • 사용자 계정 생성은 ansible.builtin.user 모듈 사용

💠 playbook 설계

  • playbook 의 파일 이름
  • playbook을 구성할 task 명
  • task 에서 사용할 모듈과 변수
  • 변수명과 변수를 선언할 위치

💠 playbook 개발

  • ansible.cfg
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false

[priviledge_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
  • inventory
tnode1-centos.exp.com
tnode2-ubuntu.exp.com
tnode3-rocky.exp.com
  • ansible-vault
    • 사용자 계정 정보가 정의된 변수 파일 생성

user_info:
  - userid: "ansible"
    userpw: "ansiblePw1!"
  - userid: "stack"
    userpw: "stackPw1!"
  • create_user.yml
    • 사용자 계정 생성 playbook 작성
    • 모든 호스트에 동일하게 생성
    • vault로 작성된 변수 파일 읽어 사용
- hosts: all

  vars_files:
    - vars/secret.yml

  tasks:
  - name: Create user
    ansible.builtin.user:
      name: "{{ item.userid }}"
      password: "{{ item.userpw | password_hash('sha512', 'mysecret') }}"
      state: present
    loop: "{{ user_info }}"

💠 playbook 실행

  • aneible-playbook --syntax-check 로 create_user.yml 파일 문법 체크

  • --ask-vault-pass 옵션으로 create_user.yml 실행

SSH 키 생성 및 복사

💠 사전 분석

  • 사용자 아이디는 외부 변수로
  • ansible-server 에서 ansible 계정 만들고 SSH 키 생성
  • ansible-server에서 생선된 SSH 공개 키를 각 tnode에 복사

💠 playbook 설계

  • ansible contens collection 에서 SSH 키 생성 모듈과 SSH 키 복사 모듈 검색

💠 playbook 개발

  • inventory
[tnode]
tnode1-centos.exp.com
tnode2-ubuntu.exp.com
tnode3-rocky.exp.com
  • create_sshkey.yml
    • task 가 실행될 호스트별로 task 가 작성
    • localhost (ansible-server) 에서 SSH 공개키 생성
    • tnode 호스트 그룹의 각 서버에 복사
- 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') }}"

💠 playbook 실행

  • -e 옵션 : userid 변수 정의 => playbook 실행 시 외부 변수로 정의

  • ansible-server 에서 ansible로 계정 변경우 SSH 키 생성 확인

  • tnode /home/ansible/.ssh 에 authorized_keys 확인

  • ansible-server 에서 tnode 에 패스워드 입력없이 SSH 로그인 확인

NTP 서버 설치 및 설정

💠 사전 분석

  • NTP 서버 주소는 메인 playbook 정의
  • centos, rocky 는 dnf 모듈 사용 , ubuntu는 apt 모듈 사용 chrnoy 설치
  • jinja2 템플릿 방식의 chrony.conf 파일을 대상 호스트로 복사
  • 설정 파일 복사 후 chrony 서비스 재시작
  • role 이용

💠 playbook 설계

  • 복잡한 설계는 큰 그림을 먼저 나중에 상세하게
  • role 에 대한 상세 설계 : chrony 서비스 설치 role
    • 변수 정의 vars
    • 환경 설정 템플릿 templates
    • 태스크 정의 tasks
    • 환경 설정 후 chrony 서비스 재시작을 위한 handler 사용

💠 playbook 개발

  • role 생성
  • --init-path : role 이 생성될 경로를 ./role로 설정

  • role 디렉터리 이동 /vars/main.yml 생성
---
# vars file for myrole.chrony

package_name: chrony
service_name: chronyd

fedora_os:
  - CentOS
  • /roles/myrole.chrony/templates/chrony.conf.j2 
    • 외부로부터 입력받은 ntp_server 변수 사용
pool {{ ntp_server }}
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.0.0/16
local stratum 10
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
  • /roles/myrole.chrony/handlers/main.yml
    • chrony 서비스 재시작
- name: Restart chrony
  ansible.builtin.service:
    name: "{{ service_name }}"
    state: restarted
  • /roles/myrole.chrony/tasks/main.yml
    • ansible_facts.distribution 변수 : 다른 파일에서 task 포함
    • when : 운영체제 별로 설정 파일 복사
    • notify : 'Restart chrony' 핸들러 호출
- name: Import playbook
  ansible.builtin.include_tasks:
    file: "{{ ansible_facts.distribution }}.yml"

- name: Copy chrony config file when Ubuntu
  ansible.builtin.template:
    src: chrony.conf.j2
    dest: /etc/chrony/chrony.conf
  notify: "Restart chrony"
  when: ansible_facts.distribution == "Ubuntu"

- name: Copy chrony config file when Other OS
  ansible.builtin.template:
    src: chrony.conf.j2
    dest: /etc/chrony.conf
  notify: "Restart chrony"
  when: ansible_facts.distribution in fedora_os
  • /roles/myrole.chrony/tasks/
    • 운영체제별 playbook 작성
- name: Install chrony using dnf
  ansible.builtin.dnf:
    name: "{{ package_name }}"
    state: latest

- name: Install chrony using apt
  ansible.builtin.apt:
    name: "{{ package_name }}"
    state: latest
  • /ansible-project/chapter_09.3/install_ntp.yml
    • myrole.chrony role 추가
    • ntp_server 변수를 선언
- hosts: tnode
  roles:
    - role: myrole.chrony
      ntp_server: 0.kr.pool.ntp.org

💠 playbook 실행

  • ansible 계정을 이용 -> 각 tnode ansible 계정에 패스워드 없이 sudo 권한 줄수 있도록 설정
echo "ansible ALL=(root) NOPASSWD:ALL" | tee -a /etc/sudoers.d/ansible

chmod 0440 /etc/sudoers.d/ansible

  • install_ntp.yml : role을 호출하는 main playbook 의 대상 호스트를 변경하면 해당 호스트만 실행
- hosts: tnode1-centos.exp.com
  roles:
    - role: myrole.chrony
      ntp_server: 0.kr.pool.ntp.org

Comments