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 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 하면 컨테이너가 생성 및 시작 (컨테이너는 서버라고 보면 됨)
- client와 docker_host는 하나의 컴퓨터라고 보면 됨
- Registry는 docker hub을 의미