vagrant 에서 network 지정을 하지 않아도 KVM 과 연결되어 있다면 kvm에서 제공되는 기본 네트워크 (default;virbr0;192.168.122.0/24) 를 자동으로 연결시켜준다.
vagrant 에서 제공하는 "private_network"는 변수명이고 사설 네트워크이므로 외부와의 연결은 불가하다. 이 네트워크는 우리가 지정해줄 수 있다.
이걸 또 네트워크를 잘라서 독립적인 사설 네트워크로 만들 수도 있다.
외부에서 인스턴스로 들어오기 위해서는 default network의 NAT 기능을 이용해서 forwarded_port로 작성된 host 포트로 접속하면된다.
Vagrantfile에서 privileged 로 해놓은 부분은 root로 실행되는 부분이다.
Vagrant의 단점일 수도 있는데 vagrant를 실행시킨 위치가 곧 인스턴스가 있는 위치라고 봐야한다. 옮기면 무조건 에러난다.
ansible-server에서 newnginx.yaml 파일을 위와같이 작성했는데 yum 모듈을 사용해서 epel-release를 설치해도 된다. 단 이렇게 하면 읽어들인 정보를 사용할 수가 없다.
```
{{ ansible_pkg_mgr }}:
name: epel-release
```
이런거 안된다는 말이다.
뭐 암튼 newnginx.yaml 을 적용해보자
---
- name: nginx install
hosts: all
become: yes
tasks:
- name: centos > epel-release install
yum:
name: epel-release
state: present
when: ansible_distribution == 'CentOS'
- name: centos > nginx
action: "{{ ansible_pkg_mgr }} name=nginx state=present"
when: ansible_distribution == 'CentOS'
- name: ubuntu > nginx
action: "{{ ansible_pkg_mgr }} name=nginx state=present autoremove=yes"
when: ansible_distribution == 'Ubuntu'
- name: centos > copy
copy:
src: index.html
dest: /usr/share/nginx/html
when: ansible_distribution == 'CentOS'
- name: ubuntu > copy
copy:
src: index.html
dest: /var/www/html
when: ansible_distribution == 'Ubuntu'
- name: ubuntu | centos nginx > start
service:
name: nginx
state: started
잘 적용되었다.
이제 다시 지우자
---
- name: remove nginx
hosts: all
become: yes
tasks:
- name: remove epel-release
action: "{{ ansible_pkg_mgr }} name=epel-release state=absent"
when: ansible_distribution == 'CentOS'
- name: remove nginx
action: "{{ ansible_pkg_mgr }} name=nginx state=absent"
when: ansible_distribution == 'CentOS'
- name: remove nginx
action: "{{ ansible_pkg_mgr }} name=nginx state=absent autoremove=yes"
when: ansible_distribution == 'Ubuntu'
- name: remove nginx-common
action: "{{ ansible_pkg_mgr }} name=nginx-common state=absent"
when: ansible_distribution == 'Ubuntu'
erasenginx.yaml 파일이다.
확실하게 삭제된 것을 확인했다.
---
앞서 우리가 작업할때 파일하나에서 전체 작업을 수행했다. 그런데 CentOS는 httpd를 설치하고 Ubuntu는 nginx를 설치하고 index 파일도 다르게 하고 등등. OS 별로 다르게 하는 것을 해보고 싶다.
이렇게 파일을 분리하여 독립적인 작업이 가능하도록 include_task를 활용할 수 있다.
즉, task 내에서 독립적인 별도의 작업이 가능하도록 하는 기능이다.
quiz.
centos는 httpd를 설치(https://www.naver.com > index.html)
ubuntu는 nginx를 설치(https://www.nginx.com > index.html)
파일을 3개만들자
itask_websrv.yaml
itask_centos.yaml
itask_ubuntu.yaml
---
- name: web server installation using include-tasks
hosts: all
become: yes
tasks:
- name: centos websrv
include_tasks: itask_centos.yaml
when: ansible_distribution == 'CentOS'
- name: ubuntu websrv
include_tasks: itask_ubuntu.yaml
when: ansible_distribution == 'Ubuntu'
itask_websrv.yaml
위와같이 작성해주면 자동으로 CentOS일때 itask_centos를 사용하게 된다.
---
- name: centos httpd
action: "{{ ansible_pkg_mgr }} name=httpd state=present"
- name: get naver > centos
get_url: url=https://www.naver.com dest=/var/www/html/index.html
- name: start httpd
service:
name: httpd
state: started
itask_centos.yaml
---
- name: ubuntu nginx
action: "{{ ansible_pkg_mgr }} name=nginx state=present"
- name: nginx-common
action: "{{ ansible_pkg_mgr }} name=nginx-common state=present"
- name: get nginx > ubuntu
get_url: url=https://www.nginx.com dest=/var/www/html/index.html
- name: start nginx
service:
name: nginx
state: started
itask_ubuntu.yaml
특이하게도 각각의 yaml 파일마다 hosts와 become, tasks를 설정해주지 않았다. 그래서 이렇게 하면 모듈별로 작업할 수 있다는 장점이 존재하게 된다.
이걸 나중에 응용해서 zone, ip 주소 등등 정보를 기반으로 배포 위치를 구분해줄 수 있게 된다.
삭제도 나누어서 해보자
itask_websrv_remove.yaml
itask_centos_remove.yaml
itask_ubuntu_remove.yaml
---
- name: web server removing using include-tasks
hosts: all
become: yes
tasks:
- name: centos websrv
include_tasks: itask_centos_remove.yaml
when: ansible_distribution == 'CentOS'
- name: ubuntu websrv
include_tasks: itask_ubuntu_remove.yaml
when: ansible_distribution == 'Ubuntu'
itask_websrv_remove.yaml
---
- name: centos httpd
action: "{{ ansible_pkg_mgr }} name=httpd state=absent"
itask_centos_remove.yaml
---
- name: ubuntu nginx remove
action: "{{ ansible_pkg_mgr }} name=nginx state=absent autoremove=yes"
- name: nginx-common remove
action: "{{ ansible_pkg_mgr }} name=nginx-common state=absent"
itask_ubuntu_remove.yaml
해서 실행을 해보자
잘 삭제된것을 확인해볼 수 있다.
---
앞선 내용을 토대로 우리는 배포판 버전에 맞는 패키지가 설치되도록 하였다.
하지만 지정된 배포판이 아닌경우라고 하더라도 task 내에 들어가서 다른 배포판 버전에 대한 설정에도 매칭을 하는 작업이 진행된다. 물론 자신의 배포판이 아니라면 실행은 되지 않지만 skipping 이라고 표기된다. 이는 내용을 확인하는 작업이 포함된다는 것을 의미한다. 이러한 방식을 적용하게 되면 다수의 서버가 있는 클라우드 환경에서는 불필요한 작업이 대량으로 발생하게 될 것이다.
분기를 시키자. 조건에 따라 나누자. if를 적용하자. 그러면 skipping을 없앨 수 있다.
step1. ansible_distribution을 확인한다.
step2. 만약 distribution이 CentOS나 Ubuntu라면 task로 들어간다.
step3. CentOS는 itask_centos.yaml 만을, Ubuntu는 itask_ubuntu.yaml 만을 실행한다.
---
- name: web server installation by if condition
hosts: all
become: yes
vars:
filename: "{{ 'itask_centos' if ansible_distribution == 'CentOS'
else 'itask_ubuntu' if ansible_distribution == 'Ubuntu'
else 'normal_linux'}}"
tasks:
- name: tasking
include_tasks: "{{ filename }}.yaml"
if_websrv.yaml 파일을 확인하면 위와같이 작성되게 된다.
그러면 ansible_distribution값에 따라서 다른 변수를 넣어놓고
이걸 기반으로 다른 yaml 파일을 쓸 수 있게 되는 것이다.
이렇게 하니까 skipped가 없어진것을 볼 수 있다.
이걸 수정해서 삭제하는 파일도 만들어보자
---
- name: web server remove by if condition
hosts: all
become: yes
vars:
filename: "{{ 'itask_centos_remove' if ansible_distribution == 'CentOS'
else 'itask_ubuntu_remove' if ansible_distribution == 'Ubuntu'
else 'normal_linux' }}"
tasks:
- name: tasking
include_tasks: "{{ filename }}.yaml"
if_websrv_remove.yaml
여기에서도 skip이 없는것을 볼 수 있다.
---
실습 : docker swarm + ansible
AWX를 적용하여 간단한 ci/cd도 적용해보자
server(centos)
ubuntu 2
centos 2
개발자가 yaml 파일을 github에 올리면 이를 clone 하여 내부 노드들에게 배포하도록 설정!!
인벤토리 작성하기
- 기본파일 : /etc/ansible/hosts 파일 => ansible all -m ping -k, ansible-playbook a.yaml -k
- 별도파일 : 파일명.lst => ansible all -i seoul.lst -m ping -k, ansible-playbook -i busan.lst a.yaml -k
기본적인 작성법
[seoul]
1.1.1.1
1.1.1.2
하지만 변수를 이용하여 이를 조합하여 구성할 수도 있다.
[ubuntu]
172.16.1.14
[web]
web1 ansible_host=172.16.1.11
web2 ansible_host=172.16.1.12
[db]
db1 ansible_host=172.16.1.13
db2 ansible_host=172.16.1.14
[seoul]
web1
db1
[busan]
web2
db2
이런식으로 변수를 지정해놓으면 원하는 위치에 변수를 사용할 수 있게 된다.
seoul에만 ping을 보낼 수 있게 된다.
그럼 이제 회사로부터 인스턴스 요청이 들어오게 된다면 클러스터를 나누어서 배포를 하고 한쪽 지역에 manager을 두어서 관리를 쉽게 할 수도 있게된다.
한번 이와 비슷하게 만들어보자
* 참고로 위에 만든 파일들 모두 블로그에 올려놓았으니 github에 잘 올려놓자
다시 원래 서버로 와서
```
vagrant destroy --force
```
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
### ansible node || centos1
config.vm.define "centos1" do |cfg|
cfg.vm.box = "generic/centos7"
cfg.vm.host_name = "centos1"
cfg.vm.network "private_network", ip: "5.5.5.11"
cfg.vm.network "forwarded_port", guest: 22, host: 60011, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 1024
rsc.cpus = 1
end
end
### ansible node || centos2
config.vm.define "centos2" do |cfg|
cfg.vm.box = "generic/centos7"
cfg.vm.host_name = "centos2"
cfg.vm.network "private_network", ip: "5.5.5.12"
cfg.vm.network "forwarded_port", guest: 22, host: 60012, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 1024
rsc.cpus = 1
end
end
### ansible node || ubuntu3
config.vm.define "ubuntu3" do |cfg|
cfg.vm.box = "generic/ubuntu1804"
cfg.vm.host_name = "ubuntu3"
cfg.vm.network "private_network", ip: "5.5.5.13"
cfg.vm.network "forwarded_port", guest: 22, host: 60013, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 1024
rsc.cpus = 1
end
end
### ansible node || ubuntu4
config.vm.define "ubuntu4" do |cfg|
cfg.vm.box = "generic/ubuntu1804"
cfg.vm.host_name = "ubuntu4"
cfg.vm.network "private_network", ip: "5.5.5.14"
cfg.vm.network "forwarded_port", guest: 22, host: 60014, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 1024
rsc.cpus = 1
end
end
### ansible server || CentOS
config.vm.define "server" do |cfg|
cfg.vm.box = "generic/centos7"
cfg.vm.host_name = "server"
cfg.vm.network "private_network", ip: "5.5.5.10"
cfg.vm.network "forwarded_port", guest: 22, host: 60010, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 2048
rsc.cpus = 2
end
end
end
하고 만들어놓자.
하고 생성된 모든 가상머신들은 autostart 기능들을 활성화시켜둔다.
```
virsh autostart test_centos1
virsh autostart test_centos2
virsh autostart test_ubuntu3
virsh autostart test_ubuntu4
virsh autostart test_server
```
나 같은 경우 폴더명이 day04_0503이라서 위와같이 적어주었다.
기존 Vagrantfile에 provision을 추가해주자
ansible-playbook을 -k 없이 바로 실행가능한 이유는 centos가 키와 패스워드로 인증하는데 만약 키가 없다면 본인의 키를 이용하게 된다.
### ansible server || CentOS
config.vm.define "server" do |cfg|
cfg.vm.box = "generic/centos7"
cfg.vm.host_name = "server"
cfg.vm.network "private_network", ip: "5.5.5.10"
cfg.vm.network "forwarded_port", guest: 22, host: 60010, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 2048
rsc.cpus = 2
end
cfg.vm.provision "shell", inline: "yum -y install epel-release && yum -y install ansible"
cfg.vm.provision "file", source: "hosts.yaml", destination: "hosts.yaml"
cfg.vm.provision "shell", inline: "ansible-playbook hosts.yaml"
end
end
하고 hosts.yaml을 이렇게 적어주자
---
- name: hosts define
hosts: localhost
gather_facts: no
tasks:
- name: write /etc/ansible/hosts file
blockinfile:
path: /etc/ansible/hosts
block: |
[centos]
centos1 ansible_host=5.5.5.11
centos2 ansible_host=5.5.5.12
[ubuntu]
ubuntu3 ansible_host=5.5.5.13
ubuntu4 ansible_host=5.5.5.14
[seoul]
centos1
ubuntu3
[busan]
centos2
ubuntu4
```
vagrant provision
```
이제 각 노드(서버포함) 에서 ~/.ssh/id_rsa와 ~/.ssh/id_rsa.pub가 존재한다. 이걸 노드에 authorized_keys로 퍼블릭 키를 던져주면 되고 node는 서버로부터 public 키를 긁어오면서 known_hosts에 등록해주어야 한다.
그럼 기능적으로 보았을때 서버가 클라이언트처럼 행동하고 있다. 그래서 서버는 처음에 노드들에게 자신을 인증해주어야 한다. 그런데 노드가 너무 많아지면 이걸 못하기 때문에 서버에쪽에서는 ssh-keyscan 을 해주어야 한다. 또 자신의 pub file을 known_hosts에게 전달해주어야 한다.
그리고 이번에는 PasswordAuthentication을 하지 말라고 했다. 이렇게 하면 키를 이용한 인증을 할 수 있게 된다. 그래서 각 계정에 .ssh 폴더가 만들어져 있어야 한다.
노드에 가면 .ssh가 있지만 이건 자기에 대한 거니 별 상관이 없다.
각 노드의 /etc/ssh/sshd_config
ubuntu 노드는 PasswordAuthentication no를 추가해야 한다.
centos 노드는 추가할 필요가 없다.
모든 노드 .ssh 만들필요 없음.
서버에서 key-pair를 만들고
/home/vagrant/.ssh/id_rsa
/home/vagrant/.ssh/id_rsa.pub --> /home/vagrant/.ssh/authorized_keys
먼저 ubuntu에서의 작업을 쉽게 하기 위해서 다음과 같이 해보자
server에 우선 들어오자. 여기에서 파일을 만들어서 복붙해서 써보자
1. server에서 key-pair 만들고 퍼블릭키를 복사 한 다음 host 에서 별도의 파일로 만들고 이를 각 노드에 붙여넣기 한다.
```
ssh-keygen -q -f ~/.ssh/id_rsa -N ''
```
이제 나온 키값을 복사해놓자
우리의 원래 server vm으로 와서 txt 파일을 만들어주자
vi serverkey.txt 에 복사한 내용을 붙여넣자
그림상으로 치면 아래쪽이 Host이고 그 위에 Server와 Node들이 있는 상황이다. Server에 pub 키가 있어서 이걸 vagrant를 이용해서 각 노드들에게 집어넣자는 이야기이다. 넣을때 ~/.ssh/authorized_keys에 넣자는 것이다. 물론 각 노드들은 vagrant 계정이다. 그 이후에 노드들로부터 개인적으로 가지고 있던 pub 키를 가지고 오자는 것이다.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
### ansible node || centos1
config.vm.define "centos1" do |cfg|
cfg.vm.box = "generic/centos7"
cfg.vm.host_name = "centos1"
cfg.vm.network "private_network", ip: "5.5.5.11"
cfg.vm.network "forwarded_port", guest: 22, host: 60011, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 1024
rsc.cpus = 1
end
cfg.vm.provision "file", source: "serverkey.txt", destination: "serverkey.txt"
cfg.vm.provision "shell", inline: "cat serverkey.txt >> /home/vagrant/.ssh/authorized_keys"
end
### ansible node || centos2
config.vm.define "centos2" do |cfg|
cfg.vm.box = "generic/centos7"
cfg.vm.host_name = "centos2"
cfg.vm.network "private_network", ip: "5.5.5.12"
cfg.vm.network "forwarded_port", guest: 22, host: 60012, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 1024
rsc.cpus = 1
end
cfg.vm.provision "file", source: "serverkey.txt", destination: "serverkey.txt"
cfg.vm.provision "shell", inline: "cat serverkey.txt >> /home/vagrant/.ssh/authorized_keys"
end
### ansible node || ubuntu3
config.vm.define "ubuntu3" do |cfg|
cfg.vm.box = "generic/ubuntu1804"
cfg.vm.host_name = "ubuntu3"
cfg.vm.network "private_network", ip: "5.5.5.13"
cfg.vm.network "forwarded_port", guest: 22, host: 60013, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 1024
rsc.cpus = 1
end
cfg.vm.provision "file", source: "serverkey.txt", destination: "serverkey.txt"
cfg.vm.provision "shell", inline: "cat serverkey.txt >> /home/vagrant/.ssh/authorized_keys"
cfg.vm.provision "shell", inline: "echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config", privileged: true
cfg.vm.provision "shell", inline: "systemctl restart sshd"
end
### ansible node || ubuntu4
config.vm.define "ubuntu4" do |cfg|
cfg.vm.box = "generic/ubuntu1804"
cfg.vm.host_name = "ubuntu4"
cfg.vm.network "private_network", ip: "5.5.5.14"
cfg.vm.network "forwarded_port", guest: 22, host: 60014, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 1024
rsc.cpus = 1
end
cfg.vm.provision "file", source: "serverkey.txt", destination: "serverkey.txt"
cfg.vm.provision "shell", inline: "cat serverkey.txt >> /home/vagrant/.ssh/authorized_keys"
cfg.vm.provision "shell", inline: "echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config", privileged: true
cfg.vm.provision "shell", inline: "systemctl restart sshd"
end
### ansible server || CentOS
config.vm.define "server" do |cfg|
cfg.vm.box = "generic/centos7"
cfg.vm.host_name = "server"
cfg.vm.network "private_network", ip: "5.5.5.10"
cfg.vm.network "forwarded_port", guest: 22, host: 60010, id: "ssh"
cfg.vm.provider :libvirt do |rsc|
rsc.memory = 2048
rsc.cpus = 2
end
#cfg.vm.provision "shell", inline: "yum -y install epel-release && yum -y install ansible"
#cfg.vm.provision "file", source: "hosts.yaml", destination: "hosts.yaml"
#cfg.vm.provision "shell", inline: "ansible-playbook hosts.yaml"
end
end
Vagrantfile을 위와같이 수정해주면된다. 보면 server 에 provision은 주석처리하고 노드들에는 authorized_keys 부분을 넣어주었다.
만약 모두다 정상적으로 provision이 되었다면 각 노드의 IP 주소를 이용하여 ssh-keyscan을 진행한다!
추가적으로 ubuntu 노드에서는 "/etc/ssh/sshd_config" 파일에 "PasswordAuthentication no"를 추가하고 ssh를 재 실행한다.
```
vagrant provision
```
그러면 최종적으로 우리가 해야하는 건 서버에 들어가서 ssh-keyscan으로 모든 ip 들에 대한 정보를 긁어와야 한다.
```
vagrant ssh server
ssh-keyscan 5.5.5.11 >> .ssh/known_hosts
ssh-keyscan 5.5.5.12 >> .ssh/known_hosts
ssh-keyscan 5.5.5.13 >> .ssh/known_hosts
ssh-keyscan 5.5.5.14 >> .ssh/known_hosts
ansible all -m ping -k
```
최종 성공한 모습을 볼 수 있다.
방화벽 : firewall.yaml 만을 작성하고 각 노드의 배포판을 확인 한 뒤, 반화벽을 중지 시켜두세요.
CentOS : firewalld
Ubuntu : ufw
ansible 홈페이지를 참고하기
---
- name: firewalld stop
hosts: all
become: yes
tasks:
- name: firewalld stop
service:
name: firewalld
state: stopped
enabled: false
when: ansible_distribution == 'CentOS'
- name: ufw stop
ufw:
state: disabled
when: ansible_distribution == 'Ubuntu'
firewalld.yaml 파일을 위와같이 작성해서 적용해주면 된다.
이제 도커 설치를 진행하자
server 쪽 설치
hosts: localhost
node쪽 설치
hosts: all
조건을 부여하여 3개의 파일로 구성하자.
centos
Install Docker Engine on CentOS | Docker Documentation
ubuntu
Install Docker Engine on Ubuntu | Docker Documentation
---
- name: docker installation on local server
hosts: localhost
become: yes
gather_facts: no
tasks:
- name: yum-utils install
yum:
name: yum-utils
state: present
- name: repository
shell: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- name: docker install
yum:
name: ['docker-ce', 'docker-ce-cli','containerd.io','docker-compose-plugin']
- name: start docker
service:
name: docker
state: started
enabled: true
dockerlocal.yaml 파일을 위와같이 작성해주자
```
ansible-playbook dockerlocal.yaml
```
뭐... 이런식으로 centos와 ubuntu에서도 docker을 설치해주자
---
- name: docker installation on local server
hosts: centos
become: yes
gather_facts: no
tasks:
- name: yum-utils install
yum:
name: yum-utils
state: present
- name: repository
shell: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- name: docker install
yum:
name: ['docker-ce', 'docker-ce-cli','containerd.io','docker-compose-plugin']
- name: start docker
service:
name: docker
state: started
enabled: true
docker-centos.yaml
---
- name: docker installation on ubuntu server
hosts: ubuntu
become: yes
gather_facts: no
tasks:
- name: Install prerequisites for Docker repository
apt:
name: ['apt-transport-https', 'ca-certificates', 'curl', 'gnupg2', 'software-properties-common']
update_cache: false
- name: Add Docker GPG apt Key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker Repository
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu focal edge
state: present
update_cache: true
- name: Update apt and install docker-ce
apt:
name: docker-ce
state: latest
update_cache: false
docker-ubuntu.yaml
이제 server에서
```
docker swarm init --advertise-addr 192.168.121.23
```
발행된 토큰을 txt 만들고 이를 각 노드들에게 전달하여 자동으로 모든 노드가 이를 실행하고 실행 후 자동으로 server에 등록되도록 한다.
yaml 파일이 정상적으로 실행되면 server에서 docker node ls를 통해 worker 들을 확인한다.
난 그냥 귀찮아서 ansible로 명령어 전달했다.
```
ansible all -m shell -a "docker swarm join --token SWMTKN-1-2rsxrgzprjpryicxvc4vcja9q0sp41w2fwf01amsjy7f4u52a9-8iib9ecs8nk28mea8dice3892 192.168.121.23:2377" --become
```
'Development(Web, Server, Cloud) > 22) LINUX - Cloud' 카테고리의 다른 글
클라우드 74일차(정리중, gitlab) (0) | 2022.05.10 |
---|---|
클라우드 73일차 (0) | 2022.05.10 |
클라우드 71일차 (0) | 2022.05.09 |
클라우드 70일차(kvm,vagrant, ansible) (1) | 2022.05.03 |
클라우드 69일차(aws-정리중, ansible, ????) (0) | 2022.05.02 |