220706

HyeonKi Jo·2022년 7월 6일
0

Ansible 실습 환경 구축 (이어서)

  • Ubuntu18 가상머신 내보내기

앤서블 실습 환경구축(CPU, RAM용량)

  • Centos7 가져오기
  • ansible-server 1c 1g

가상머신 복제 (centos 서버 생성)

  • ansible-server 를 복제해서 Centos7 서버 2개를 더 만들어준다.
  • 연결된 복제로 만들어준다.
  • 연결된 복제는 스냅샷을 이용해, 링크하여 자원을 공유하는 방식이다.
  • 공간을 덜 사용할 수 있지만, 의존성이 생긴다.
  • 똑같이 02도 만들어준다.
  • Centos7으로 생성하는 서버 3개가 생성되었다.

Ubuntu 서버 생성

  • 이름 : Ubuntu18-node01
  • 메모리 : 1G
  • CPU : 1C
  • Centos와 Ubuntu서버 총 5개가 잘 생성되었다.

각 VM IP주소

centos

  • 192.168.0.254
  • 192.168.0.255

ubuntu

  • 192.168.0.204
  • 192.168.1.2

MobaXterm으로 접속

  • 접속확인하면서, hostnameclt set-hostname [] 으로 호스트이름을 변경시켜준다.
  • Ubuntu에서 root계정으로 접속할 수 있는지 확인한다.
  • vi /etc/selinux/config에서 SELINUX가 disabled로 되어있는지 확인
  • 방화벽 꺼져있는지 확인

베이그런트

  • 베이그런트는 VM을 아주 쉽게 만들 수 있는 방법이다.
  • 그러나 다운로드 등 속도가 느리다는 단점이 있다.
  • 잘 안쓰이지만 한번쯤 경험해보는것이 좋다.
  • 베이그런트(Vagrant)는 가상 시스템 환경을 관리하기위한 도구이다.
  • 가상 환경 세팅 시간을 줄이고 개발환경이나 테스트 환경을 자동으로 설정하도록 도와준다.

다운로드

Vagrant 사용 (CMD에서 사용)

  • C:\Users\johnlee>cd c:\HashiCorp
  • c:\HashiCorp>vagrant init
    • init을 진행하니, 자동으로 환경변수가 편집된 사람도 있고, 편집안된 사람도 있다.
    • 사용자 변수가 편집이 안됬다면, 실행창에 변수를 검색해 시스템환경변수를 편집해준다.

    • CMD창을 끄고 다시 켜서 명령어를 다시 입력하면 실행된다.
  • https://app.vagrantup.com/boxes/search?provider=virtualbox
    • 위 페이지로 가면, Vagrant에서 제공하는 이미지를 내려받을 수 있다.
  • c:\HashiCorp>notepad Vagrantfile
    • Vagrantfile을 notepad로 열 수 있다. 여기서 스크립트를 작성한다.
  • config.vm.box = "centos/7"
    • 여기서 vagrant 사이트로부터 이미지를 가져올 수 있다.
    • 여기서 centos/7은 vagrant에 맞춰진 이미지의 이름이다.
  • config.vm.network "public_network"
    • 주석처리 되어있는것에서 주석처리만 지워주면 된다.
  • c:\HashiCorp>vagrant up
    • Vagrant 실행
    • 이제 VM 이 생성된다.
    • 좀 많이 오래걸린다
  • Virtualbox에 새로운 VM이 실행중이다.
  • 로그인 대기중이다.
  • c:\HashiCorp>vagrant ssh
    • vagrant ssh명령어로 접속해야한다.
    • 명령프롬프트로 실행하게 된다.
    • 방화벽은 꺼져있다.
    • httpd도 잘 작동한다.
  • c:\HashiCorp>vagrant destroy
    • 이제 vagrant를 삭제해준다.

Ansible

Ansible 이해하기

  • 현재 오픈소스버전 (무료버전)과 유료버전이 나뉘어져잇다.
  • Playbook이라는 스크립트로 서버들을 play하듯이 관리한다.
  • 이때, 서버와 통신할떄 SSH프로토콜로 접속하게 된다.
  • 또, Terraform 처럼 프로비저닝까지 확장되었다.
  • VM들의 파이썬 모듈을 사용하게 된다.
  • 클러스터에 존재하는 많은 서버들에게 동시에, 동일한 환경을 한사람이 배포할 수 있게 해준다.

앤서블의 3가지 요소

인벤토리

  • 내가 관리하고 싶은 서버의 IP주소 혹은 Domain주소를 정의해줘야 한다.
  • 어디서 수행할 것인가?
  • 그룹명을 정하고 아래에 IP주소, domain주소를 넣어 인벤토리를 꾸며준다.

플레이북

  • httpd, mariaDB, useradd등 명령을 한번에 작업하기위해 플레이북이 필요하다.
  • 무엇을 수행 할 것인가?
  • 플레이북(각본)은 인벤토리 파일에서 정의한 대상들이 무엇을 수행할 것인지 정의하는 역할을 하며, yaml포맷으로 설정한다.
  • 예시
---
- name: nginx install				# -로 시작한다.
  hosts:all							# 인벤토리(hosts)를 모두사용한다.는 뜻
  become: true						# sudo를 붙이는, 즉, 권한상승의 의미이다.
									  # 실습할때는 root계정이니 필요 없지만, 일반계정으로 진행할 때는 become:true가 필요하다.
  task:								# 실제로 설정이 일어나는 부분이다.
    - name: nginx package install	# 여기 이름은 플레이북을 실행할 때, 화면에 출력되는 메세지다.
      yum:							# 모듈이다. 
        name: nginx					# yum모듈을 통해 nginx를 설치하겠다.
        							# yum이 패키지 매니저니까 name은 패키지가 될 것이다.
        state: installed			# 설치한다.

모듈

  • 미리 정의 되어있는 각본(복잡한 작업)
  • yum 모듈도 존재한다.
    • 이름도 똑같고, 기능도 똑같지만, Python명령어로 할 수 있도록 만들어놓은 모듈이다.
  • 이런 모듈이 500개 이상 존재한다.
  • 어떻게 수행할 것인가?
  • 모듈은 플레이북에서 task가 어떻게 수행될지를 정의하는 요소이다.
  • 실제 작업을 처리하는 단위로, 이 Module이라는 개념을 사용한다.
  • 앤서블은 Python Code를 호출하여 실행하기 때문에 Python이 필수적으로 필요하다.
  • yum, shell, apt 등 모듈을 사용하게 되면, 위 플레이북의 예시에서 yum부분이 yum 모듈을 정의하고 이를 사용하겠다는 의미이다.

앤서블 서버 설치

앤서블 애드혹 (AD-HOC)

vi /etc/ansible/hosts

[centos]
192.168.0.254
192.168.0.255

[ubuntu]
192.168.0.204
192.168.1.2
  • hosts파일을 정의했다.

ansible all -m ping

  • ansible all -m ping : 흔히 자주사용하는 트래픽이 나가는지 확인하는 ping이 아니라, 각 서버들이 접속할 수 있는지 확인하는 기능의 ping 모듈이다.
  • known hosts에 등록시키는 과정이다.
  • SHA256이라는 키와 같이 known host에 등록된다.
  • 아래 빨간 에러는 password를 입력하지 않았기 때문이다.
    • password를 넣어주려면 옵션이 필요하다.
  • ansible all -m ping -k
  • 먼저 SSH password 입력을 받는다.
  • 비밀번호를 입력하면 아래와 같이 정상동작하는지 확인된다.
  • 또, 우분투에 root계정으로 들어갈 수 없다면 빨간글씨로 에러가 날 것이다.

우분투 루트계정 들어가는법

  • vi /etc/ssh/sshd_config
    • /PermitRootLogin으로 검색해서 주석을 해제해주고, 오른쪽 값을 yes로 바꿔준다.
  • sudo systemctl restart sshd : sshd를 리스타트 해준다.
  • sudo su : root계정으로 들어가준다.
  • passwd : root 계정 비밀번호를 수정해준다.

그룹별로 ping 치기

  • ansible centos -m ping -k
  • Centos만 ping치기
  • Ubuntu만 ping치기
  • 이렇게 Ansible서버에서 설치하고 설정을 했지만, 아래 node에서는 따로 설치한것이 없다. (Ubuntu에서 root계정 조작한것 밖에는 없다.) = Agent가 없다.
    • 쉐프와 퍼펫은 이런 agent가 존재하는 불편함이 있다.
  • python이 필요하지만 python은 기본으로 os에 설치되어있었다.

인벤토리 추가 조작하기

  • ansible all --list: 현재 등록된 host들의 리스트를 출력한다.
  • echo "192.168.0.255" >> inventory.list
    • 위와 같이 inventory.list에 IP주소를 추가할 수 있다.
  • ansible all -i inventory.list -m ping -k : 인벤토리 리스트에 모듈을 실행히실 수 있다.(ping, yum 등...)

shell 명령어

  • ansible all -m shell -a "uptime" -k : uptime을 출력한다.
    • shell명령어는 우리가 흔히 사용하는 명령어들을 그대로 사용할 수 있다.
    • ansible all(모든호스트) -m(모듈을 사용한다.) -shell(쉘모듈) -a "uptime"(업타임명령어를 실행) -k(비밀번호를 사용한다.)
  • ansible all -m shell -a "df -h" -k
    • 모든 호스트에 df -h명령어 수행
  • ansible all -m shell -a "free -h" -k
    • 모든 호스트에 메모리 확인
  • ansible all -m user -a "name=kosa" -k : 모든 호스트에 유저 추가
  • ansible all -m shell -a "tail -n 1 /etc/passed" -k
    • etc/passwd의 마지막 첫번째를 출력해본다.
    • /home/kosa가 나오는것을 보니 kosa계정이 잘 생성된 것을 알 수 있다.
  • ansible all -m user -a "name=kosa state=absent" -k
    • 이번엔 kosa계정을 absent로 만든다.
    • ansible에서 absent는 delete의 뜻으로 사용된다.
    • 반대로 생성된 떄는 Presnet로 나온다.
  • ansible all -m shell -a "tail -n 1 /etc/passed" -k로 다시 마지막줄 첫번째 줄을 확인했더니 kosa비밀번호가 삭제되었다.

Centos apache ad-hoc 관리

httpd 설치하고 사용

  • ansible centos -m yum -a "name=httpd state=present" -k
    • centos 호스트그룹에 모듈 yum을 사용해준다.
    • name은 httpd이고, present(설치)해준다.
    • 에러 없이 잘 설치 되었다.
  • curl https://www.nginx.com/ -o index.html
    • index.html파일을 새로 만든다.
    • curl명령어로 nginx사이트에서 나오는 출력을 그대로 index.html을 만들어 줄 것이다.
  • ansible centos -m copy -a "src=index.html dest=/var/www/html/index.html" -k
    • ansible centos 호스트 그룹에서 copy모듈을 사용한다.
    • src는 현재위치의 index.html이고, 목적지는 /var/www/html/index.html로 복사해준다.
  • ansible centos -m service -a "name=httpd state=started" -k
    • ansible centos호스트 그룹에서 서비스 모듈을 사용한다.
    • name은 service의 이름 httpd로 state는 started로 한다.
  • 여기서 ip주소로 접속해보도록 한다.
  • 두 IP 모두 잘 접속된다.
  • ansible centos -m shell -a "systemctl status firewalld" -k
    • 이렇게 shell명령어로 systemctl status firewalld로 실행할 수도 있다.
    • 빨간색이지만 원하는 출력이 나왔다.
  • ansible centos -m shell -a "systemctl start firewalld" -k 방화벽을 시작해주고 다시 상태를 확인해본다.
  • 아까처럼 빨간 글씨가 나오지 않는다.
  • 또 접속이 차단되었다.
  • ansible centos -m shell -a "firewall-cmd --permanent --zone=public --add-service=http" -k
  • ansible centos -m shell -a "systemctl restart firewalld" -k
  • 포트를 뚫고 재시작해준다.
  • 다시 잘 나온다.
  • ansible centos -m service -a "name=httpd state=stopped" -k
    • httpd를 정지한다.
    • 위 이미지에서 위는 처음 명령어를 입력했을 때 노란 글씨로 Change처리 된 것이고, 아래는 반복된 작업이기 때문에 같은 작업을 안하고 그냥 넘어갔다는 초록글씨로 표시된다.
    • 멱등성이 있다는 것을 뜻한다.
  • ansible centos -m shell -a "systemctl stop firewalld" -k 방화벽을 정지해준다.
  • ansible centos -m yum -a "name=httpd state=absent" -k - httpd도 정리해준다.
    • absent는 delete의 의미를 갖는다.

shell명령어

  • shell명령어는 왠만하면 사용을 줄여야 한다.
  • shell은 멱등성이 없다.
  • 똑같은 작업을 또 시키면 반복해서 작업하게 된다.

Ubuntu Apache Ad-hoc 관리

  • ansible ubuntu -m apt -a "name=apache2 state=present" -k
    • ubuntu 호스트그룹에 name=apache2를 설치한다.
    • present는 install을 뜻한다.
    • 잘 설치되었고, Ubuntu특징으로 enable안해도 symlink가 생성되었다.
  • ansible ubuntu -m copy -a "src=index.html dest=/var/www/html/index.html" -k
    • 아까 가져온 index.html을 복사해준다.
    • 잘 넘어갔다.
    • ubuntu IP리스트를 읽고 잘 설치 됬는지 확인하자
    • 굿
    • 참고로 다시 명령어를 입력했을 때, 초록글씨로 skip된것을 알 수 있다.
  • ansible ubuntu -m service -a "name=apache2 state=stopped" -k
  • ansible ubuntu -m service -a "name=apache2 state=started" -k
  • ansible ubuntu -m apt -a "name=apache2 state=absent" -k

멱등성

  • 앤서블은 멱등성(Idempotency)이란 특징을 가진다.
  • 이는 여러 번 적용해도 결과가 바뀌지 않으며,
  • 수정된 부분이 있다면 그 부분만 새롭게 반영되는 특징이 있다.
  • 반복작업을 하지 않고, 쓸데없는 자원을 사용하지 않는다.
  • echo "192.168.0.145" >> inventory.list 명령어로 inventory.list에 IP주소를 넣어준다.
  • 두번 넣으니 똑같은 IP주소가 두번들어갔다.
    • 즉, 멱등성이 없다.
  • ansible localhost -c local -m lineinfile -a "path=inventory.list line=192.168.0.146"
    • 그러나 ansible에서 제공하는 입력방식을 사용하면 멱등성이 지켜진다.
    • localhost(서버호스트)
    • -c(커넥션) local(자체 서버, 현재서버, SSH를 사용하지 않겠다.)
    • -m lineinfile(lineinfile 모듈을 사용한다., file에 line을 넣는다.)
    • -a "path=inventory.list line=192.168.0.146 (inventory.list에 line을 넣는다.)

ssh key 활용

  • ssh-keygen -t rsa : 키 생성
  • 위 IP들에게 키를 보내준다.
  • ssh-copy-id root@192.168.0.254
  • 위와같이 모두 진행해준다.
  • ssh-copy-id root@192.168.0.255
  • ssh-copy-id root@192.168.0.204
  • ssh-copy-id root@192.168.1.2

플레이북 구조

  • YAML 형식으로 작성되는 Playbook들은 하나 이상의 Play을 가지며, 각 Play는 하나 이상의 task(앤서블 모듈)을 실행한다.
  • 절대로 tap키를 쓰면 안된다.

Centos, Ubuntu Apache 설치 플레이북

vi apache_install.yml

  • yaml파일을 yml이라고도 한다.
---									# ---로 시작하고 엔터 2번해준다.

- name: Install apache on centos	# play의 이름이된다.
  hosts: centos
  gather_facts: no					# 자주 사용되는 변수가 이미 정의되어있다. (facts, magic), 정보를 수집하지 않겠다..

  tasks:
    - name: install apache web server	# 이 문구들은 작업이 진행될때 어떤 일이 진행되고 있는지 출력해주는 것이다.
      yum: name=httpd state=present		# yum모듈 (name=httpd state=present)와 다를게 없다.
    - name: upload default index.html for web server
      get_url: url=https://www.nginx.com dest=/var/www/html/ mode=0644	# get_url모듈은 curl >> index.html 한 것을 다른 방법으로 해준 것이다.
    - name: start apache web server		# service httpd를 start해준다. (systemctl start httpd) 
    									# enable할떄는 enabled=yes를 넣어준다.
      service: name=httpd state=started

- name: Install apache on ubuntu
  hosts: ubuntu
  gather_facts: no

  task:
    - name: install apache web server
      apt: name=apache2 state=present
    - name: upload default index.html for web server
      get_url: url=https://www.nginx.com dest=/var/www/html/ mode=0644
    - name: start apache web server
      service: name=apache2 state=started

  • ansible-playbook apache_install.yml: 아까 SSH키를 넘겼기 때문에 -k로 비밀번호 옵션이 필요 없다
  • 총 6개의 태스크가 잘 완료 되었다.
  • 또, ubuntu에서 service start가 필요 없는데, 멱등성을 지켜 필요없는 작업은 skip된것을 볼 수 있다.
  • 웹페이지도 잘 접속 된다. 굿ㄱ수

vi apache_remove.yml

- name: Remove apache on centos
  hosts: centos
  gather_facts: no

  tasks:
    - name: remove apache web server
      yum: name=httpd state=absent

- name: Remove apache on ubuntu
  hosts: ubuntu
  gather_facts: no

  tasks:
    - name: remove apache web server
      apt: name=apache2 state=absent
  • 다시 Playbook으로 apache를 제거해준다.

종료

  • ansible명령어로 VM종료도 된다 ㅎ
profile
Talking Potato

0개의 댓글