KOSA 클라우드 솔루션즈 아키텍트 양성과정

[7.7] Ansible(환경 설정 자동화, nginx, wordpress 설치)

굽이굽이 2022. 7. 7. 17:04

--- 앤서블 환경 설정 자동화

# vi keyscan.yml
- name: Setup for the Ansible's Environment
  hosts: localhost
  gather_facts: no
  
  tasks:
    - name: Generate keyscan
      shell: "{{ item }}"
      with_items:
        - "ssh-keyscan 192.168.0.241 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.245 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.211 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.251 >> ~/.ssh/known_hosts"
=> 미리 known_hosts를 설정해서, 수 많은 서버가 있을 때 일일이 known_hosts등록하겠냐는 메시지 안 나오게 함

# ansible-playbook keyscan.yml

# vi ansible_env.yml
- name: Setup for the Ansible's Environment
=> name은 단순히 설명이기에 넣지 않고 바로 hosts부터 시작해도 무관
  hosts: localhost
=> Ansible 서버 자기 자신을 위한 셋팅이기에 localhost를 지정
  gather_facts: no
=> no(=false)
  
  tasks:
    - name: Add "/etc/ansible/hosts"
      blockinfile: 
=> blockinfile은 모듈의 이름(tasks에서 name과 같은 선상에 있는 것은 전부 모듈이라고 보면 됨)
=> file에 block을 넣는다는 의미
        path: /etc/ansible/hosts
=> 해당 경로에 block을 넣겠다는 의미
        block: |
=> 개행 문자를 사용하지 않고 자연스럽게 엔터를 주기 위해서는 |를 주게 됨
          [centos]
          192.168.0.145
          192.168.0.146

          [ubuntu]
          192.168.0.147 ansible_python_interpreter=/usr/bin/python3
          192.168.0.148 ansible_python_interpreter=/usr/bin/python3
=> 제어되는 노드에는 python3 이상을 사용

    - name: Configure Bashrc
      lineinfile:   
        path: /root/.bashrc
        line: "{{ item }}"
=> 반복문
      with_items:
        - "alias ans='ansible'"
        - "alias anp='ansible-playbook'"
=> 여러 개의 항목이 있을 때 구분 짓기 위해 - 를 사용
=> ansible이나 ansible-playbook을 타이핑할 때 편리함을 위해 alias를 주게 됨
=> with_items의 아래 내용을 반복해서 {{ item }} 부분에 넣게됨

# ansible-playbook ansible_env.yml

** alias가 적용되기 위해서는 exit 하고 다시 접속해야 함

 

--- keypair 설정

# vi keypair_new.yml
- name: Create known_hosts between server and nodes
  hosts: all
=> magic 변수 때문에 hosts를 all로 설정
  connection: local
=> connection은 local인데 hosts는 all이면 ssh 접속하지 않고 앤서블 서버에서 작업하겠다는 의미
  serial: 1
=> 매직 변수에 들어가야 할 hosts 파일의 내용 중 누락이 생길 경우에 대비해 한 개씩 대입하라는 의미
  gather_facts: no

  tasks:
    - name: ssh-keyscan for known_hosts file
      command: /usr/bin/ssh-keyscan -t ecdsa {{ ansible_host }} 
=> 매직 변수 ansible_host 활용하여 hosts ip 호출
=> 상단의 hosts: all => 인벤토리에 있는 모든 IP정보를 ansible_host라는 매직 변수에 하나씩 가져옴
      register: keyscan
=> 아직 known_hosts에 저장하지 않고, keyscan이라는 register에 저장

    - name: input key
      lineinfile:
        path: ~/.ssh/known_hosts
=> ~/ = /root와 같은 의미
        line: "{{ item }}"
        create: yes
=> known_hosts라는 파일이 없으면 만들고, 있으면 거기에 넣으라는 의미
      with_items:
        - "{{ keyscan.stdout_lines }}"
=> keyscan 레지스터에 저장된 내용을 한 줄씩 표준 출력하겠다는 의미

- name: Create authorized_keys between server and nodes
  hosts: all
  connection: local
  gather_facts: no
  vars:
    ansible_password: root계정의 패스워드

  tasks:
    - name: ssh-keygen for authorized_keys file
      openssh_keypair: 
        path: ~/.ssh/id_rsa
        size: 2048
        type: rsa
        force: False 
=> force는 overwrite여부를 묻는 것으로 해당 경로에 이미 파일이 있다면 False로 지정 하여 overwrite하지 않게 함

    - name: input key for each node
      connection: ssh
=> 키를 배포하는 tasks는 ssh 를 사용
=> 상단의 hosts: all의 모든 IP를 대상으로 key를 배포하기 위함
      authorized_key:
=> authorized_key는 퍼블릭 키를 의미
        user: root
        state: present
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
=> lookup : 해당 경로에 있는 id_rsa.pub퍼블릭 키를 가져와서, 인벤토리 파일 내에 있는 서버에 배포

# anp keypair.yml

--- 센토스, 우분투 엔진엑스 설치 플레이북

# vi nginx_install.yml
- name: Install nginx on centos
  hosts: centos
  gather_facts: no

  tasks:
    - name: install epel-release
      yum: 
        name: epel-release
        state: latest
    - name: install nginx web server
      yum: name=nginx state=present
    - name: upload default index.html for web server
      get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644
    - name: start nginx web server
      service: name=nginx state=started

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

  tasks:
    - name: install nginx web server
      apt: pkg=nginx state=present update_cache=yes
    - name: Upload default index.html for web server
      get_url: url=https://www.nginx.com dest=/var/www/html/
               mode=0644 validate_certs=no

# ansible-playbook nginx_install.yml

--- 센토스, 우분투 엔진엑스 삭제 플레이북

# vi nginx_remove.yml
- name: Remove nginx on centos
  hosts: centos
  gather_facts: no

  tasks:
    - name: remove nginx web server
      yum: name=nginx state=absent

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

  tasks:
    - name: remove nginx web server
      apt: pkg=nginx* state=absent

# ansible-playbook nginx_remove.yml

 

** apt install --reinstall python3 python python3-minimal --fix-broken

=> 파이썬을 삭제했다면 재설치


--- 센토스, 우분투 NFS 설치 플레이북

 

# vi nfs.yml
- name: Setup for nfs server
  hosts: localhost
  gather_facts: no

  tasks:
    - name: make nfs_shared directory
      file:
        path: /root/nfs_shared
        state: directory
        mode: 0777

    - name: configure /etc/exports
      lineinfile:
        path: /etc/exports
        line: /root/nfs_shared 192.168.0.0/20(rw,sync)

    - name: Install NFS
      yum:
        name: nfs-utils
        state: present

    - name: nfs service start
      service:
        name: nfs-server
        state: restarted
=> start상태면 그대로 start, 아니라면 start해줌
        enabled: yes
=> 시스템이 껐다 켜져도 그대로 실행될 수 있도록 해줌

- name: Setup for nfs clients
  hosts: centos
  gather_facts: no

  tasks:
    - name: make nfs_client directory
      file:
        path: /root/nfs
        state: directory

    - name: Install NFS
      yum:
        name: nfs-utils
        state: present

    - name: mount point directory as client
      mount:
        path: /root/nfs
        src: 192.168.0.186:/root/nfs_shared
        fstype: nfs
        state: mounted

- name: Setup for nfs clients U
  hosts: ubuntu
  gather_facts: no

  tasks:
    - name: make nfs_client directory
      file:
        path: /root/nfs
        state: directory

    - name: Install NFS-U
      apt:
        pkg: nfs-common
        state: present
        update_cache: yes

    - name: mount point directory as client
      mount:
        path: /root/nfs
        src: 192.168.0.186:/root/nfs_shared
        fstype: nfs
        opts: nfsvers=3
=> 우분투의 버전을 넣어줘야 함
        state: mounted

# ansible-playbook nfs.yml -k

--- 워드프레스 만들기

 

vi ansible_env.yml : webserver와 dbserver구분

# vi wordpress.yml
- name: Setup for webserver
  hosts: webserver
  gather_facts: no

  tasks:
    - name: Install http
      yum:
        name: "{{ item }}"
        state: present
      with_items:
        - httpd
        - php
        - php-mysql
        - php-gd
        - php-mbstring
        - wget
        - unzip

    - name: Unarchive a file that needs to be downloaded (added in 2.0)
      ansible.builtin.unarchive:
        src: https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
        dest: /var/www/html
        remote_src: yes
=> 타깃 서버의 소스 경로에 압축 파일을 푸는 모듈

    - name: chown
      file:
        path: /var/www/html/wordpress
        owner: "apache"
        group: "apache"
        recurse: "yes"

    - name: web service restart
      service:
        name: httpd
        state: restarted

- name: Setup for dbserver
  hosts: dbserver
  gather_facts: no

  tasks:
    - name: Install mariadb
      apt:
        pkg: mariadb-server
        state: present
        update_cache: yes

    - name: Install pymysql
      apt:
        pkg: python-pymysql
        state: present

    - name: Install pymysql
      apt:
        pkg: python3-pymysql
        state: present

    - name: set root password
      mysql_user:
        name: 'root'
        password: '{{ mysql_root_password }}'
        login_unix_socket: /var/run/mysqld/mysqld.sock
        state: present

    - name: edit file
      replace:
        path: /etc/mysql/mariadb.conf.d/50-server.cnf
        regexp: "bind-address"
        replace: "#bind-address"

    - name: db service restart
      service:
        name: mysql
        state: restarted

    - name: Create database
      mysql_db:
        db: wordpress
        login_unix_socket: /var/run/mysqld/mysqld.sock
        state: present

    - name: Create database user
      mysql_user:
        user: wpuser
        password: wppass
        priv: "wordpress.*:ALL,GRANT"
        host: '%'
        login_unix_socket: /var/run/m ysqld/mysqld.sock
        state: present

# anp wordpress.yml --extra-vars "mysql_root_password=kosa0401"

 

* 도커(Docker)

 

-- 도커의 세 가지 기능:

 => Docker 이미지를 만드는 기능: docker image build

        - 여러 실행 파일, 이미지 파일들을 tar로 archive하여 build하면 이미지가 만들어짐

 => Docker 이미지를 공유하는 기능: docker image push/pull 

        - 배포 : 도커 이미지를 저장해 놓는 '도커 허브' 존재, push 명령어를 통해 도커 허브에 업로드, pull을 통해 가져오기

 => Docker 컨테이너를 작동시키는 기능: docker container run

        - 이미지 파일을 pull 해서 run 하면 컨테이너가 생성 및 시작 (컨테이너는 서버라고 보면 됨)

 

 

Docker 아키텍처

- client와 docker_host는 하나의 컴퓨터라고 보면 됨

- Registry는 docker hub을 의미