- 이전 구성 환경
- 인스턴스 삭제
vagrant destory
- Vagrantfile 실행
vagrant up
- Vagrantfile(server, node1, node2, node3)에 퍼블릭 ip를 부여한다.
cfg.vm.network "public_network", :dev => "br0", :mode => "bridge", :type =>"bridge" # public network로 bridge type의 br0를 지정한다.
- vi Vagrantfile
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.define "server" do |cfg0| cfg0.vm.box = "centos/7" cfg0.vm.host_name = "server" cfg0.vm.network "private_network", ip: "10.10.10.10" cfg0.vm.network "public_network", :dev => "br0", :mode => "bridge", :type =>"bridge" cfg0.vm.network "forwarded_port", guest: 22, host: 20010, id: "ssh" cfg0.vm.provision "shell", inline: "yum -y install epel-release && yum -y install ansible" cfg0.vm.provision "file", source: "mykey.pem", destination: "/home/vagrant/.ssh/mykey.pem" cfg0.vm.provision "shell", inline: "chmod 600 /home/vagrant/.ssh/mykey.pem" cfg0.vm.provision "file", source: "ssh_config_mykey", destination: "/home/vagrant/ssh_config_mykey" cfg0.vm.provision "shell", inline: "cat /home/vagrant/ssh_config_mykey >> /etc/ssh/ssh_config" cfg0.vm.provision "shell", inline: "echo '10.10.10.11' >> /etc/ansible/hosts" cfg0.vm.provision "shell", inline: "echo '10.10.10.12' >> /etc/ansible/hosts" cfg0.vm.provision "shell", inline: "echo '10.10.10.13' >> /etc/ansible/hosts" cfg0.vm.provision "shell", inline: "ssh-keyscan 10.10.10.11 >> /home/vagrant/.ssh/known_hosts" cfg0.vm.provision "shell", inline: "ssh-keyscan 10.10.10.12 >> /home/vagrant/.ssh/known_hosts" cfg0.vm.provision "shell", inline: "ssh-keyscan 10.10.10.13 >> /home/vagrant/.ssh/known_hosts" cfg0.vm.provision "shell", inline: "chown vagrant.vagrant /home/vagrant/.ssh/known_hosts" end config.vm.define "node1" do |cfg1| cfg1.vm.box = "centos/7" cfg1.vm.host_name = "node1" cfg1.vm.network "private_network", ip: "10.10.10.11" cfg1.vm.network "public_network", :dev => "br0", :mode => "bridge", :type =>"bridge" cfg1.vm.network "forwarded_port", guest: 22, host: 20011, id: "ssh" cfg1.vm.provision "file", source: "mykey.pem.pub", destination: "/home/vagrant/.ssh/mykey.pem.pub" cfg1.vm.provision "shell", inline: "cat /home/vagrant/.ssh/mykey.pem.pub >> /home/vagrant/.ssh/authorized_keys" end config.vm.define "node2" do |cfg2| cfg2.vm.box = "centos/7" cfg2.vm.host_name = "node2" cfg2.vm.network "private_network", ip: "10.10.10.12" cfg2.vm.network "public_network", :dev => "br0", :mode => "bridge", :type =>"bridge" cfg2.vm.network "forwarded_port", guest: 22, host: 20012, id: "ssh" cfg2.vm.provision "file", source: "mykey.pem.pub", destination: "/home/vagrant/.ssh/mykey.pem.pub" cfg2.vm.provision "shell", inline: "cat /home/vagrant/.ssh/mykey.pem.pub >> /home/vagrant/.ssh/authorized_keys" end config.vm.define "node3" do |cfg3| cfg3.vm.box = "centos/7" cfg3.vm.host_name = "node3" cfg3.vm.network "private_network", ip: "10.10.10.13" cfg3.vm.network "public_network", :dev => "br0", :mode => "bridge", :type =>"bridge" cfg3.vm.network "forwarded_port", guest: 22, host: 20013, id: "ssh" cfg3.vm.provision "file", source: "mykey.pem.pub", destination: "/home/vagrant/.ssh/mykey.pem.pub" cfg3.vm.provision "shell", inline: "cat /home/vagrant/.ssh/mykey.pem.pub >> /home/vagrant/.ssh/authorized_keys" end end
- 키 생성
ssh-keygen -q -f /ansible/project2/mykey.pem -N ""
- vi ssh_config_mykey
Host 10.10.10.* User vagrant IdentityFile /home/vagrant/.ssh/mykey.pem
- playbook은 파일을 의미한다.
- 하나의 playbook에 여러개의 play를 입력하여 사용할 수 있다.
- --- 는 yaml 파일임을 의미한다.
- hosts는 해당 playbook 작업을 적용할 Node를 지정하는데 지정하지 않으면(all) 모든 hosts를 대상으로 하고 인벤토리 파일(session)을 지정해 놓으면 해당하는 hosts를 대상으로 한다.
- become: yes or True 는 root의 권한으로 작업하게 된다.
- gather_facts: no = 노드의 정보들을 끌고 오지 않는다.
- task 는 Play 안의 소작업, task 안에 name은 작업의 이름이며 사용자가 지정한다.
playbook으로 net-tools 설치하기
- ansible_test.yaml
touch ansible_test.yaml
--- - name: install net-tools hosts: all become: yes gather_facts: no tasks: - name: net-tools installation yum: name: net-tools state: present - name: print eth1's ip address shell: "ifconfig eth1 | grep 211.183.3." # shell 모듈을 통해 ip 정보를 출력하는 작업
- 실행
ansible-playbook ansible_test.yaml
- 할당한 IP 확인
ansible all -m shell -a "sudo ifconfig eth2 | grep 211.183."
- seoul.lst - Inventory 파일을 생성
[web] 10.10.10.11 [db] 10.10.10.12
- Inventory 파일을 지정하여 Playbook 에 적용
ansible-playbook -i seoul.lst ansible_test.yml
- web.yaml
--- - name: web configuration hosts: all become: yes tasks: - name: git install yum: name: git state: present - name: httpd install yum: name: httpd state: present - name: httpd start && enable service: name: httpd state: started enabled: true - name: vim install hosts: localhost become: yes tasks: - name: vim installation yum: name: vim state: present
- 실행
ansible-playbook web.yaml
- 노드에게 배정된 IP를 치면 httpd가 실행됨을 알수 있다.
- httpd 삭제하기
--- - name: web delete hosts: all become: yes gather_facts: no tasks: - name: httpd destroy yum: name: httpd state: absent
구성 환경 10.10.10.11 - seoul - web - nginx 10.10.10.12 - seoul - db 10.10.10.13 - jeju - web - nginx
Inventory
- seoul.lst
[web] 10.10.10.11 [db] 10.10.10.12
- jeju.lst
[web] 10.10.10.13
Playbook
- web.yml
--- - name: webtask hosts: web become: yes gather_facts: no tasks: - name: install repo yum: name: epel-release state: latest - name: nginx install yum: name: nginx state: present - name: nginx start service: name: nginx state: started enabled: true
ansible-playbook -i seoul.lst -i jeju.lst web.yml
- nfs.yml을 생성하고 다음의 조건을 만족하는 구성을 완료해보자
server : nfs-server (/home/vagrant/shared) node1~3 : nfs-client (/home/vagrant/remote)
- server에서 /home/vagrant/shared/test.txt를 만들고 이를 node에서 확인하세요
- file -> 디렉토리 생성, 파일의 경우에는 속성을 변경한다!!!
file state: directory -> 디렉토리 생성 file state: file -> 위에서 지정한 파일에 대하여 속성을 변경하겠다.
예)/home/vagrant/test 파일 만들어져 있음
- name: /home/vagrant/test 사용하기 file: src: a dest: b state: link # soft link a -> b - name: /home/vagrant/test파일삭제 file: path: /home/vagrant/test state: absent
- 파일 만들기는 file 모듈 내에서 state: touch 로 사용해야 한다.
- state: file 은 path 로 지정된 파일에 대하여 속성을 적용할 때 사용할 수 있다.
- name: test 접근시간 변경하기
file: path: /home/vagrant/test state: file access_time: now
- lineinfile -> 한줄 단위로 추가한다.
- 여러줄 추가할 때에는 with_items 모듈을 이용한다.
- name: test lineinfile: path: /home/vagrant/test line: "{{ item }}" with_items: - "test1" - "test2"
[해설]
cat nfs.yml # server 는 디렉토리 생성 / exports 설정 / nfs 서비스 시작 작업 --- - name: NFS SERVER hosts: localhost gather_facts: false become: true tasks: - name: nfs installation file: path: /home/vagrant/shared state: directory mode: 0777 - name: configure /etc/exports become: yes lineinfile: path: /etc/exports line: /home/vagrant/shared 10.10.10.0/24(rw,sync) - name: nfs service start become: yes service: name: nfs state: restarted # clinet는 디렉토리 생성 및 mount 작업 - name: NFS CLIENT hosts: all gather_facts: false become: true tasks: - name: nfs utils installation file: path: /home/vagrant/remote state: directory - name: mount directory become: yes mount: path: /home/vagrant/remote src: 10.10.10.10:/home/vagrant/shared fstype: nfs opts: nfsvers=3 state: mounted
ansible-playbook nfs.yml
- 배포하기
- shared에 파일을 생성하게 되면 client에 mount된 remote 디렉토리에서 확인 가능
[vagrant@server ~]$ touch /home/vagrant/shared/yang.txt [vagrant@server ~]$ ansible all -m shell -a "sudo ls /home/vagrant/remote" [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo 10.10.10.13 | CHANGED | rc=0 >> yang.txt 10.10.10.11 | CHANGED | rc=0 >> yang.txt 10.10.10.12 | CHANGED | rc=0 >> yang.txt
nfs-server 파일 생성하기
- name: create file become: yes file: path: /home/vagrant/shared/yang.txt state: touch - name: insert data become: yes lineinfile: path: /home/vagrant/shared/yang.txt line: "{{ item }}" with_items: - "gildong" - "chulsoo" - "minsoo"
- 결과 확인
[vagrant@server ~]$ ansible all -m shell -a "sudo cat /home/vagrant/remote/yang.txt " [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo 10.10.10.13 | CHANGED | rc=0 >> gildong chulsoo minsoo 10.10.10.12 | CHANGED | rc=0 >> gildong chulsoo minsoo 10.10.10.11 | CHANGED | rc=0 >> gildong chulsoo minsoo
replace를 사용하여 내용 수정
- replace 모듈 -> 지정된 문자열을 다른 문자열로 변경할 수 있다.
- name: test hosts: all tasks: - name: Replace replice: path: filename regexp: "{{ item.From }}" # 패턴에 매치되는 문자열 골라내기 replace: "{{ item.To }}" with_items: - { From: '[(gil)(chul)soo]', To: 'testuser'} - { From: '[(kim)(lee)]', To: 'testfname'}
[quiz]
-> soo -> chul -> dong -> min
- name: replace it become: yes replace: path: /home/vagrant/shared/test.txt regexp: "{{item.From}}" replace: "{{item.To}}" with_items: - {From: 'soo',To: 'chul'} - {From: 'dong',To: 'min'}
ansible-playbook nfs.yml
- 실행 확인
[vagrant@server ~]$ ansible all -m shell -a "sudo cat /home/vagrant/remote/yang.txt " [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo 10.10.10.13 | CHANGED | rc=0 >> gilmin chulchul minchul 10.10.10.12 | CHANGED | rc=0 >> gilmin chulchul minchul 10.10.10.11 | CHANGED | rc=0 >> gilmin chulchul minchul
git clone
- nginx를 실습했던 nginx.yml파일을 이용해 git clone 해보기
- name: git clone git: repo: https://github.com/Yangyang0429/tutorial.git dest: /usr/share/nginx/html/shop version: main # branch 이름 update: yes
version : branch 이름 repo 는 저장 소 주소, dest 는 clone 할 경로이다
- 실행
ansible-playbook -i seoul.lst -i jeju.lst nginx.yml
CPU 사용량 및 자원 확인하기
- ansible 서버 노드의 자원 사용량 확인 (xml 파일 --> spec.txt)
[root@localhost project2]# virsh dumpxml project2_server > spec.txt
- server에 자원 할당하기
vi Vagrantfile Vagrant.configure("2") do |config| config.vm.define "server" do |cfg0| cfg0.vm.box = "centos/7" cfg0.vm.provider :libvirt do |resource| resource.cpus = 2 resource.memory = 1024 end
- 적용
vagrant up