본문 바로가기
Development(Web, Server, Cloud)/22) LINUX - Cloud

클라우드 72일차

by tonyhan18 2022. 5. 9.
728x90

 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

 

Install Docker Engine on CentOS

 

docs.docker.com

 

ubuntu

Install Docker Engine on Ubuntu | Docker Documentation

 

Install Docker Engine on Ubuntu

 

docs.docker.com

---
- 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

```

 

 

728x90