- 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개가 잘 생성되었다.
centos
- 192.168.0.254
- 192.168.0.255
ubuntu
- 192.168.0.204
- 192.168.1.2
- 접속확인하면서,
hostnameclt set-hostname []
으로 호스트이름을 변경시켜준다.
- Ubuntu에서 root계정으로 접속할 수 있는지 확인한다.
vi /etc/selinux/config
에서 SELINUX가 disabled로 되어있는지 확인
- 방화벽 꺼져있는지 확인
- 베이그런트는 VM을 아주 쉽게 만들 수 있는 방법이다.
- 그러나 다운로드 등 속도가 느리다는 단점이 있다.
- 잘 안쓰이지만 한번쯤 경험해보는것이 좋다.
- 베이그런트(Vagrant)는 가상 시스템 환경을 관리하기위한 도구이다.
- 가상 환경 세팅 시간을 줄이고 개발환경이나 테스트 환경을 자동으로 설정하도록 도와준다.
- https://www.vagrantup.com/downloads
- ARM 64버전으로 다운로드 받아준다.
- 잘 다운로드 되었다.
- 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를 삭제해준다.
- 현재 오픈소스버전 (무료버전)과 유료버전이 나뉘어져잇다.
- Playbook이라는 스크립트로 서버들을 play하듯이 관리한다.
- 이때, 서버와 통신할떄 SSH프로토콜로 접속하게 된다.
- 또, Terraform 처럼 프로비저닝까지 확장되었다.
- VM들의 파이썬 모듈을 사용하게 된다.
- 클러스터에 존재하는 많은 서버들에게 동시에, 동일한 환경을 한사람이 배포할 수 있게 해준다.
인벤토리
- 내가 관리하고 싶은 서버의 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 모듈을 정의하고 이를 사용하겠다는 의미이다.
yum install epel-release -y
yum --enablerepo=epel -y install ansible
- epel repository를 이용해 ansible을 설치한다.
ansible --version
- 버전이 잘 나온다.
- 앤서블 문서 사이트 https://docs.ansible.com/ansible/latest/index.html
- 앤서블 모듈 사이트 https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.htm
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비밀번호가 삭제되었다.
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은 멱등성이 없다.
- 똑같은 작업을 또 시키면 반복해서 작업하게 된다.
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-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키를 쓰면 안된다.
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종료도 된다 ㅎ