Ansible (playbook)- 9.22

양승현·2022년 9월 22일
0

Ansible

목록 보기
3/4
  • 이전 구성 환경
  • 인스턴스 삭제
vagrant destory
  • Vagrantfile 실행
vagrant up

public network 부여

  • 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은 파일을 의미한다.
  • 하나의 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."

Playbook & Inventory

  • seoul.lst - Inventory 파일을 생성
[web]
10.10.10.11

[db]
10.10.10.12
  • Inventory 파일을 지정하여 Playbook 에 적용
ansible-playbook -i seoul.lst ansible_test.yml

git httpd vim 설치하기

  • 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

[quiz] playbook - nfs

  • 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

0개의 댓글