본문 바로가기

클라우드/Ansible

[Ansible] 실습 환경 만들기

 

EC2에 가상서버를 여러개 두고 실습 할수있는 환경이 아니기에 아래처럼 실습한다

1. mac os / windows 도커 설치

2. 도커 이미지로 우분투 3개 컨테이너 실행 (호스트네임 vm1 ,vm2, ansible-server) 3대 실행

3. 각 컨테이너 ssh설정, 같은네트워크 설정, ansible-server 접근하여 ssh 연결을 위한 host 설정

4. ansible에서 명령어 입력하여 시스템 상태및 vm1 vm2 동시에 프로그램설치 확인 

5. 추후 nginx 실행테스트예정

 

 

 

 

우선 내pc 도커를 설치한다.

https://docs.docker.com/desktop/setup/install/windows-install/

 

 

Windows

Get started with Docker for Windows. This guide covers system requirements, where to download, and instructions on how to install and update.

docs.docker.com

 

 

docker 설치확인

* 오늘은  git bash 터미널에서 진행해봅니다.

 

 

**주의: 관리자권한이 없으면 아래같은 에러가 발생합니다. 관리자권한으로 실행하기

 

**주의2 docker login도 해줍니다

https://try-it.tistory.com/49

 

 

 

우분투 이미지 다운로드

 

 

 

➜  test git:(master) ✗ docker run -it -d --name vm1 -p 8080:80 ubuntu
71894c5be163e821f49ac83aa3f1f485470d5a2ea91e6ad447dc0d5fc1f39685

➜  test git:(master) ✗ docker run -it -d --name vm2 -p 8081:80 ubuntu

 

 

docker exec -it vm1 /bin/bash

apt-get update
apt-get install -y openssh-server
apt-get install -y vim


docker exec -it vm2 /bin/bash

apt-get update
apt-get install -y openssh-server
apt-get install -y vim

 

 

설치후 vim 설정

vim /etc/ssh/sshd_config


==========================
Port 22  ##설정
#AddressFamily any 
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
PermitRootLogin yes  ##설정

======

 

 

 

ssh 상태확인

root@71894c5be163:/# service ssh status
 * sshd is not running
root@71894c5be163:/# service ssh restart
 * Restarting OpenBSD Secure Shell server sshd                                                                                                                                                      [ OK ]
root@71894c5be163:/# service ssh status
 * sshd is running
root@71894c5be163:/#

vm 1 vm2 모두 실행

 

ssh 자동실행하기

systemctl enable ssh

 

➜  ~ git:(master) ✗ docker run -it -d --name ansible-server ubuntu
76681f4cd3d234c48a8b149a3c2615646e00925745476cb6470596429b00de16

 

 

 

ansible-server 도커에 들어가서 실행하기

docker exec -it ansible-server /bin/bash

 

apt-get update
apt-get install ansible
apt-get install -y python3-pip
pip3 install ansible

 

docker 컨테이너상에서 모두 통신할수 있도록 네트워크를 추가해준다.

docker network create ansible-network


docker network connect ansible-network vm1
docker network connect ansible-network vm2
docker network connect ansible-network ansible-server

 

 

이제 네트워크상 연결이 완료되었습니다.

 

docker inspect -f "{{ .NetworkSettings.IPAddress }}" vm2
docker inspect -f "{{ .NetworkSettings.IPAddress }}" vm1
docker inspect -f "{{ .NetworkSettings.IPAddress }}" ansible-server

 

 

 

docker exec -it ansible-server bash

nano /etc/ansible/hosts

 

nano /etc/ansible/hosts 명령어 수행시 아무것도 나타나지않는다.

아래와같이 실행해야하는데...

 

그래서 명령어로 기본디렉토리를 다시 확인해봤다.

 

root@76681f4cd3d2:/# ansible --version
ansible [core 2.16.3]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.12.3 (main, Nov  6 2024, 18:32:19) [GCC 13.2.0] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True

 

3번째 줄에 config file = None로 되어있어서 아무것도 설정되어있지않다.

 

이럴때 새로 만들어줘서 해결한다고한다.

vim /etc/ansible/ansible.cfg


##내용입력
[defaults]
inventory = /etc/ansible/hosts

 

 

ansible.cfg가 추가되었다.

 

이제 vm1 vm2를 호스트를 ansible 서버에 알려주는 명령어를 입력한다.

mkdir -p /etc/ansible 
vim /etc/ansible/hosts

 

 

/etc/ansible/hosts 파일을 편집하는 이유는 Ansible이 관리할 대상 서버들을 지정하기 위함입니다. Ansible은 기본적으로 /etc/ansible/hosts 파일에 정의된 호스트 목록을 사용하여 원격 서버에 명령어를 실행합니다.

nano /etc/ansible/hosts 명령어를 사용하는 이유:

  1. Ansible 관리 대상 서버 정의: Ansible이 자동으로 원격 서버와 통신하려면, 어떤 서버들을 관리할 것인지 지정해야 합니다. 이 파일에 관리할 서버들의 IP 주소, 호스트명 또는 그룹 이름을 정의합니다.
  2. 호스트 그룹화: Ansible에서는 여러 서버를 그룹으로 묶어서 관리할 수 있습니다. 예를 들어, 여러 대의 ubuntu_servers 그룹을 만들어 하나의 그룹으로 명령을 실행할 수 있습니다.
  3. 자동화: Ansible을 통해 자동화 작업을 수행하려면, 먼저 관리할 서버들의 목록을 이 파일에 추가하고, 그룹화할 수 있어야 합니다. 이를 통해 쉽게 여러 서버에 동시에 작업을 실행할 수 있습니다

 

 

통신이 안되는 문제 발생 

 

우선 vm1 vm2 ssh 실행여부 확인(안되어있었다)

root@908d970a3bee:/# service ssh status
 * sshd is not running

root@908d970a3bee:/# service ssh start 
 * Starting OpenBSD Secure Shell server sshd                                               [ OK ] 

root@908d970a3bee:/# service ssh status
 * sshd is running

 

 

 

 

 

위와 발생하는 로그가 조금달라졌다 ssh key gen 확인하면될것같다.

 

hosts 파일을 아래 처럼 수정해준다. 실행권한과 암호입력

 

vim /etc/ansible/hosts

 

vm2번에서 문제가 발생한다.

[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to
see details
vm2 | FAILED! => {
    "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
}

 

ai에게 물어본다

 

ansible all -m ping 명령을 실행했을 때, vm2에 대해 SSH 비밀번호 인증 관련 오류가 발생한 것으로 보입니다. 오류 메시지는 SSH 비밀번호 인증을 사용하려고 시도했으나, Ansible에서 Host Key 검증이 활성화되어 있고, sshpass는 이를 처리할 수 없다는 내용을 담고 있습니다. 이를 해결하기 위한 방법을 설명드리겠습니다.

문제 분석

Ansible은 기본적으로 SSH 키 인증을 사용합니다. 하지만 vm2에 대해 비밀번호 인증을 사용하려고 할 때, 호스트 키 검증이 활성화되어 있으면 sshpass가 이를 처리할 수 없습니다. sshpass는 비밀번호 인증을 위해 사용하는 도구이지만, 호스트의 SSH 키 지문을 검증하려면 known_hosts 파일에 호스트 키가 추가되어야 합니다.

해결 방법

  1. 호스트 키 지문을 known_hosts에 추가하기 vm2에 대한 호스트 키가 known_hosts 파일에 없으면, ansible은 이 호스트와 연결을 시도할 때 키 검증을 요구합니다. 이를 해결하기 위해 vm2의 SSH 키를 known_hosts에 수동으로 추가해야 합니다.

 

vm2에 직접연결해본다

정상적으로 접속이된다.

 

이것은 호스트를 신뢰할수있는지 확인하는단계입니다.

 

ssh 명령어를 사용하여 172.17.0.3 서버에 접속하는 과정에서 호스트의 신뢰성을 묻는 메시지가 나타났습니다. 이 메시지는 172.17.0.3 서버의 SSH 키가 처음 연결되기 때문에 시스템에서 해당 호스트를 신뢰할 수 있는지 확인하려는 과정입니다.

현재 상태:

  • 172.17.0.3 서버의 SSH 키가 known_hosts 파일에 없어서 시스템에서 호스트의 ED25519 키 지문을 확인하려고 한 것입니다.
  • "yes"를 입력하여 해당 호스트를 known_hosts 파일에 추가했기 때문에, 이제 172.17.0.3에 대한 신뢰가 설정되었습니다.

이제 할 수 있는 일:

  1. 비밀번호 인증 완료:
    • 비밀번호를 입력한 후 root@172.17.0.3에 성공적으로 로그인된 것으로 보입니다. 현재는 SSH를 통해 서버에 접속 중입니다.
  2. Ansible로 연결 시도:
    • 이제 ansible 명령을 실행할 때 **172.17.0.3**에 대한 SSH 연결이 정상적으로 이루어질 것입니다.
    • known_hosts 파일에 호스트 키가 추가되었기 때문에, Ansible에서 SSH 연결 시 호스트 키 검증이 더 이상 문제가 되지 않습니다.

 

 

 

키생성하기

ssh-keygen -t rsa -b 4096

 

키생성완료

 

 

ssh 접속을 위해 공개키는 vm1 , vm2에 각각 복제한다.

 

root@76681f4cd3d2:/# ssh-copy-id root@172.17.0.2 
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.17.0.2's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@172.17.0.2'"
and check to make sure that only the key(s) you wanted were added.

 

root@76681f4cd3d2:/# ssh-copy-id root@172.17.0.3
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.17.0.3's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@172.17.0.3'"
and check to make sure that only the key(s) you wanted were added.

 

 

폴더를만들고 명령어를 수행합니다

mkdir playbooks

vim inventory

 

드디어 최종확인...

 ansible web-server  -m ping
ansible all -m ping -u root

 

VM1  / VM2 모두 SSH가 정상적으로 연결된다.

 

 

vm1 vm2 ssh 인증이 헷갈려서 시간을 꽤쓴거같다.

 

이제 세팅이 완료되었으니 테스트를 시작해본다.

 

먼저 기본적인 시스템 확인 명령어를 실행한다.

ansible all -m command -a "uptime"
ansible all -m command -a "lscpu"
ansible all -m command -a "free -h"
ansible all -m command -a "systemctl status sshd"
ansible all -m command -a "ls /etc"
ansible all -m command -a "netstat -tuln"
ansible all -m command -a "env"
ansible all -m command -a "hostname"
ansible web-servers -m command -a "uptime"

 

root@76681f4cd3d2:/# ansible all -m command -a "lscpu"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to
see details
vm2 | CHANGED | rc=0 >>
Architecture:                         x86_64
CPU op-mode(s):                       32-bit, 64-bit
Address sizes:                        39 bits physical, 48 bits virtual
Byte Order:                           Little Endian
CPU(s):                               4
On-line CPU(s) list:                  0-3
Vendor ID:                            GenuineIntel
Model name:                           Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
CPU family:                           6
Model:                                142
Thread(s) per core:                   1
Core(s) per socket:                   4
Socket(s):                            1
Stepping:                             9
BogoMIPS:                             4608.05
Flags:                                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch pti intel_ppin fsgsbase bmi1 hle avx2 smep bmi2 erms rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat
L1d cache:                            128 KiB (4 instances)
L1i cache:                            128 KiB (4 instances)
L2 cache:                             1 MiB (4 instances)
L3 cache:                             4 MiB (1 instance)
Vulnerability Gather data sampling:   Unknown: Dependent on hypervisor status
Vulnerability Itlb multihit:          Processor vulnerable
Vulnerability L1tf:                   Mitigation; PTE Inversion
Vulnerability Mds:                    Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
Vulnerability Meltdown:               Mitigation; PTI
Vulnerability Mmio stale data:        Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed:               Vulnerable
Vulnerability Spec rstack overflow:   Not affected
Vulnerability Spec store bypass:      Vulnerable
Vulnerability Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:             Mitigation; Retpolines; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Retpoline
Vulnerability Srbds:                  Unknown: Dependent on hypervisor status
Vulnerability Tsx async abort:        Not affected
vm1 | CHANGED | rc=0 >>
Architecture:                         x86_64
CPU op-mode(s):                       32-bit, 64-bit
Address sizes:                        39 bits physical, 48 bits virtual
Byte Order:                           Little Endian
CPU(s):                               4
On-line CPU(s) list:                  0-3
Vendor ID:                            GenuineIntel
Model name:                           Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
CPU family:                           6
Model:                                142
Thread(s) per core:                   1
Core(s) per socket:                   4
Socket(s):                            1
Stepping:                             9
BogoMIPS:                             4608.05
Flags:                                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch pti intel_ppin fsgsbase bmi1 hle avx2 smep bmi2 erms rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat
L1d cache:                            128 KiB (4 instances)
L1i cache:                            128 KiB (4 instances)
L2 cache:                             1 MiB (4 instances)
L3 cache:                             4 MiB (1 instance)
Vulnerability Gather data sampling:   Unknown: Dependent on hypervisor status
Vulnerability Itlb multihit:          Processor vulnerable
Vulnerability L1tf:                   Mitigation; PTE Inversion
Vulnerability Mds:                    Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
Vulnerability Meltdown:               Mitigation; PTI
Vulnerability Mmio stale data:        Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed:               Vulnerable
Vulnerability Spec rstack overflow:   Not affected
Vulnerability Spec store bypass:      Vulnerable
Vulnerability Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:             Mitigation; Retpolines; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Retpoline
Vulnerability Srbds:                  Unknown: Dependent on hypervisor status
Vulnerability Tsx async abort:        Not affected

 

 

 

아래처럼 설치가안된경우 netstat를 실행할수 없다 이럴경우 ansible이 있기때문에 동시 설치가 가능하다

 

#실행하지않아도됩니다 
ansible web-server -m command -a "apt-get install net-tools"

 

그런데 이미 설치된파일이 있는거같다

아래처럼  메세지가 나오면서 새로 설치가 불가하다

 

ansible로 설치하는 방법이 있어서 수행해 보았다.

ansible web-server -m apt -a "name=net-tools state=present" --become

 

ansible에서도 apt명령어가 실행 가능하다

 

net-tools 설치후  netstat 결과확인

tat

 

 

hostname확인

 

 

playbook [nginx 설치]

 

root@76681f4cd3d2: mkdir playbooks
root@76681f4cd3d2: cd playbooks/
root@76681f4cd3d2:/playbooks# vim inventory

[web-server]
172.17.0.2
172.17.0.3
root@76681f4cd3d2:/playbooks# vim ansible.cfg

[defaults]
inventory = /playbooks/inventory
remote_user = root 
ask_pass = false 

[privilege_escalation]
become = true 
become_method = sudo 
become_user = root 
become_ask_pass = false

 

root@76681f4cd3d2:/playbooks# vi playbook-test.yaml 

- hosts: web-server

  tasks:
  - name: Install nginx latest version
    apt:
     name: nginx
     state: latest

 

 

모두 작성후 구문 오류가 있는지 우선 실행해본다

ansible-playbook playbook-test.yaml --syntax-check

 

뭔가 메세지가 나왔다.

 

자세히 살펴보자  - 문자때문에 실행중 구문오류가 있다고 판단했다 (gpt 찾아보니 그냥실행해도 된다고 함..)

root@76681f4cd3d2:/playbooks# ansible-playbook playbook-test.yaml --syntax-check -vvvv
ansible-playbook [core 2.16.3]
  config file = /playbooks/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible-playbook
  python version = 3.12.3 (main, Nov  6 2024, 18:32:19) [GCC 13.2.0] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True
Using /playbooks/ansible.cfg as config file
setting up inventory plugins
Loading collection ansible.builtin from 
host_list declined parsing /playbooks/inventory as it did not pass its verify_file() method
script declined parsing /playbooks/inventory as it did not pass its verify_file() method
auto declined parsing /playbooks/inventory as it did not pass its verify_file() method
Not replacing invalid character(s) "{'-'}" in group name (web-server)
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv
to see details
Not replacing invalid character(s) "{'-'}" in group name (web-server)
Parsed /playbooks/inventory inventory source with ini plugin
1 plays in playbook-test.yaml

 

결론:

  • 현재 발생한 경고Ansible 버전의 설정에 따른 것이며, 실행 자체에는 문제가 없을 가능성이 높습니다.
  • web-server 그룹 이름은 정상적으로 사용될 수 있으며, 실제로 작업을 실행하는 데 문제가 없다면 경고를 무시하고 진행해도 됩니다.
  • 경고가 신경 쓰인다면, 그룹 이름을 web_server와 같이 밑줄(_)을 사용하는 방법도 고려할 수 있습니다.

현재 상태에서 실행이 정상적으로 진행되면, 경고는 무시해도 됩니다.

 

 

믿고 진행해본다.

ansible-playbook playbook-test.yaml

실행은 정상적으로 된거 같다.

 

nginx 확인하기

root@76681f4cd3d2:/# ansible web-server -m command -a "service nginx status"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
vm1 | FAILED | rc=3 >>
 * nginx is not runningnon-zero return code
vm2 | FAILED | rc=3 >>
 * nginx is not runningnon-zero return code

 

실행중이지 않은모습  이유는 yaml파일에서 설치 시 상태를 started로 지정하지않았기때문이다.

 

아래와 같이 수정하기

name: Install and start Nginx
  hosts: web-server
  become: yes  # root 권한을 사용하여 실행
  tasks:
    - name: Install nginx latest version
      apt:
        name: nginx
        state: latest
        update_cache: yes  # 패키지 캐시 업데이트
    
    - name: Ensure nginx is started and enabled
      service:
        name: nginx
        state: started
        enabled: yes  # 부팅 시 자동 시작

 Playbook 설명:

  1. Nginx 최신 버전 설치:
    • apt 모듈을 사용하여 nginx를 설치합니다.
    • state: latest 옵션을 사용하면 최신 버전으로 설치됩니다.
    • update_cache: yes 옵션을 추가하여, 패키지 캐시를 최신 상태로 유지합니다.
  2. Nginx 서비스 시작 및 부팅 시 자동 시작:
    • service 모듈을 사용하여 nginx 서비스를 시작하고, 부팅 시 자동으로 시작되도록 설정합니다.
    • state: started는 서비스가 실행 중인지 확인하고, 실행되지 않으면 시작합니다.
    • enabled: yes는 부팅 시 자동으로 서비스가 시작되도록 설정합니다.

 

위에 yaml파일로 다시 설치해 되지만 이번엔 

 

ansible 명령어로 nginx를  start 실행 해준다.

 

url 확인 명령어 실행

ansible web-server -m uri -a "url=http://localhost:80"

 

 

curl 을 설치해서 정확히 확인해봅니다

ansible web-server -m apt -a "name=curl state=present update_cache=yes"
root@76681f4cd3d2:/# ansible web-server -m apt -a "name=curl state=present update_cache=yes"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details



vm1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "cache_update_time": 1733311333,
    "cache_updated": true,
    "changed": true,
    "stderr": "debconf: delaying package configuration, since apt-utils is not installed\n",
    "stderr_lines": [
        "debconf: delaying package configuration, since apt-utils is not installed"
    ],
    "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nThe following additional packages will be installed:\n  libbrotli1 libcurl4t64 libldap-common libldap2 libnghttp2-14 librtmp1\n  libsasl2-2 libsasl2-modules libsasl2-modules-db libssh-4\nSuggested packages:\n  libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal\n  libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql\nThe following NEW packages will be installed:\n  curl libbrotli1 libcurl4t64 libldap-common libldap2 libnghttp2-14 librtmp1\n  libsasl2-2 libsasl2-modules libsasl2-modules-db libssh-4\n0 upgraded, 11 newly installed, 0 to remove and 3 not upgraded.\nNeed to get 1587 kB of archives.\nAfter this operation, 4371 kB of additional disk space will be used.\nGet:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnghttp2-14 amd64 1.59.0-1ubuntu0.1 [74.3 kB]\nGet:2 http://archive.ubuntu.com/ubuntu noble/main amd64 libbrotli1 amd64 1.1.0-2build2 [331 kB]\nGet:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsasl2-modules-db amd64 2.1.28+dfsg1-5ubuntu3.1 [20.4 kB]\nGet:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsasl2-2 amd64 2.1.28+dfsg1-5ubuntu3.1 [53.2 kB]\nGet:5 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libldap2 amd64 2.6.7+dfsg-1~exp1ubuntu8.1 [195 kB]\nGet:6 http://archive.ubuntu.com/ubuntu noble/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2build7 [56.3 kB]\nGet:7 http://archive.ubuntu.com/ubuntu noble/main amd64 libssh-4 amd64 0.10.6-2build2 [188 kB]\nGet:8 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcurl4t64 amd64 8.5.0-2ubuntu10.5 [341 kB]\nGet:9 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 curl amd64 8.5.0-2ubuntu10.5 [227 kB]\nGet:10 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libldap-common all 2.6.7+dfsg-1~exp1ubuntu8.1 [31.5 kB]\nGet:11 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsasl2-modules amd64 2.1.28+dfsg1-5ubuntu3.1 [69.9 kB]\nFetched 1587 kB in 6s (261 kB/s)\nSelecting previously unselected package libnghttp2-14:amd64.\r\n(Reading database ... \r(Reading database ... 5%\r(Reading database ... 10%\r(Reading database ... 15%\r(Reading database ... 20%\r(Reading database ... 25%\r(Reading database ... 30%\r(Reading database ... 35%\r(Reading database ... 40%\r(Reading database ... 45%\r(Reading database ... 50%\r(Reading database ... 55%\r(Reading database ... 60%\r(Reading database ... 65%\r(Reading database ... 70%\r(Reading database ... 75%\r(Reading database ... 80%\r(Reading database ... 85%\r(Reading database ... 90%\r(Reading database ... 95%\r(Reading database ... 100%\r(Reading database ... 13831 files and directories currently installed.)\r\nPreparing to unpack .../00-libnghttp2-14_1.59.0-1ubuntu0.1_amd64.deb ...\r\nUnpacking libnghttp2-14:amd64 (1.59.0-1ubuntu0.1) ...\r\nSelecting previously unselected package libbrotli1:amd64.\r\nPreparing to unpack .../01-libbrotli1_1.1.0-2build2_amd64.deb ...\r\nUnpacking libbrotli1:amd64 (1.1.0-2build2) ...\r\nSelecting previously unselected package libsasl2-modules-db:amd64.\r\nPreparing to unpack .../02-libsasl2-modules-db_2.1.28+dfsg1-5ubuntu3.1_amd64.deb ...\r\nUnpacking libsasl2-modules-db:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...\r\nSelecting previously unselected package libsasl2-2:amd64.\r\nPreparing to unpack .../03-libsasl2-2_2.1.28+dfsg1-5ubuntu3.1_amd64.deb ...\r\nUnpacking libsasl2-2:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...\r\nSelecting previously unselected package libldap2:amd64.\r\nPreparing to unpack .../04-libldap2_2.6.7+dfsg-1~exp1ubuntu8.1_amd64.deb ...\r\nUnpacking libldap2:amd64 (2.6.7+dfsg-1~exp1ubuntu8.1) ...\r\nSelecting previously unselected package librtmp1:amd64.\r\nPreparing to unpack .../05-librtmp1_2.4+20151223.gitfa8646d.1-2build7_amd64.deb ...\r\nUnpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2build7) ...\r\nSelecting previously unselected package libssh-4:amd64.\r\nPreparing to unpack .../06-libssh-4_0.10.6-2build2_amd64.deb ...\r\nUnpacking libssh-4:amd64 (0.10.6-2build2) ...\r\nSelecting previously unselected package libcurl4t64:amd64.\r\nPreparing to unpack .../07-libcurl4t64_8.5.0-2ubuntu10.5_amd64.deb ...\r\nUnpacking libcurl4t64:amd64 (8.5.0-2ubuntu10.5) ...\r\nSelecting previously unselected package curl.\r\nPreparing to unpack .../08-curl_8.5.0-2ubuntu10.5_amd64.deb ...\r\nUnpacking curl (8.5.0-2ubuntu10.5) ...\r\nSelecting previously unselected package libldap-common.\r\nPreparing to unpack .../09-libldap-common_2.6.7+dfsg-1~exp1ubuntu8.1_all.deb ...\r\nUnpacking libldap-common (2.6.7+dfsg-1~exp1ubuntu8.1) ...\r\nSelecting previously unselected package libsasl2-modules:amd64.\r\nPreparing to unpack .../10-libsasl2-modules_2.1.28+dfsg1-5ubuntu3.1_amd64.deb ...\r\nUnpacking libsasl2-modules:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...\r\nSetting up libbrotli1:amd64 (1.1.0-2build2) ...\r\nSetting up libsasl2-modules:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...\r\nSetting up libnghttp2-14:amd64 (1.59.0-1ubuntu0.1) ...\r\nSetting up libldap-common (2.6.7+dfsg-1~exp1ubuntu8.1) ...\r\nSetting up libsasl2-modules-db:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...\r\nSetting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2build7) ...\r\nSetting up libsasl2-2:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...\r\nSetting up libssh-4:amd64 (0.10.6-2build2) ...\r\nSetting up libldap2:amd64 (2.6.7+dfsg-1~exp1ubuntu8.1) ...\r\nSetting up libcurl4t64:amd64 (8.5.0-2ubuntu10.5) ...\r\nSetting up curl (8.5.0-2ubuntu10.5) ...\r\nProcessing triggers for libc-bin (2.39-0ubuntu8.3) ...\r\n",
    "stdout_lines": [
        "Reading package lists...",
        "Building dependency tree...",
        "Reading state information...",
        "The following additional packages will be installed:",
        "  libbrotli1 libcurl4t64 libldap-common libldap2 libnghttp2-14 librtmp1",
        "  libsasl2-2 libsasl2-modules libsasl2-modules-db libssh-4",
        "Suggested packages:",
        "  libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal",
        "  libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql",
        "The following NEW packages will be installed:",
        "  curl libbrotli1 libcurl4t64 libldap-common libldap2 libnghttp2-14 librtmp1",
        "  libsasl2-2 libsasl2-modules libsasl2-modules-db libssh-4",
        "0 upgraded, 11 newly installed, 0 to remove and 3 not upgraded.",
        "Need to get 1587 kB of archives.",
        "After this operation, 4371 kB of additional disk space will be used.",
        "Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnghttp2-14 amd64 1.59.0-1ubuntu0.1 [74.3 kB]",
        "Get:2 http://archive.ubuntu.com/ubuntu noble/main amd64 libbrotli1 amd64 1.1.0-2build2 [331 kB]",
        "Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsasl2-modules-db amd64 2.1.28+dfsg1-5ubuntu3.1 [20.4 kB]",
        "Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsasl2-2 amd64 2.1.28+dfsg1-5ubuntu3.1 [53.2 kB]",
        "Get:5 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libldap2 amd64 2.6.7+dfsg-1~exp1ubuntu8.1 [195 kB]",
        "Get:6 http://archive.ubuntu.com/ubuntu noble/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2build7 [56.3 kB]",
        "Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 libssh-4 amd64 0.10.6-2build2 [188 kB]",
        "Get:8 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcurl4t64 amd64 8.5.0-2ubuntu10.5 [341 kB]",
        "Get:9 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 curl amd64 8.5.0-2ubuntu10.5 [227 kB]",
        "Get:10 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libldap-common all 2.6.7+dfsg-1~exp1ubuntu8.1 [31.5 kB]",
        "Get:11 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsasl2-modules amd64 2.1.28+dfsg1-5ubuntu3.1 [69.9 kB]",
        "Fetched 1587 kB in 6s (261 kB/s)",
        "Selecting previously unselected package libnghttp2-14:amd64.",
        "(Reading database ... ",
        "(Reading database ... 5%",
        "(Reading database ... 10%",
        "(Reading database ... 15%",
        "(Reading database ... 20%",
        "(Reading database ... 25%",
        "(Reading database ... 30%",
        "(Reading database ... 35%",
        "(Reading database ... 40%",
        "(Reading database ... 45%",
        "(Reading database ... 50%",
        "(Reading database ... 55%",
        "(Reading database ... 60%",
        "(Reading database ... 65%",
        "(Reading database ... 70%",
        "(Reading database ... 75%",
        "(Reading database ... 80%",
        "(Reading database ... 85%",
        "(Reading database ... 90%",
        "(Reading database ... 95%",
        "(Reading database ... 100%",
        "(Reading database ... 13831 files and directories currently installed.)",
        "Preparing to unpack .../00-libnghttp2-14_1.59.0-1ubuntu0.1_amd64.deb ...",
        "Unpacking libnghttp2-14:amd64 (1.59.0-1ubuntu0.1) ...",
        "Selecting previously unselected package libbrotli1:amd64.",
        "Preparing to unpack .../01-libbrotli1_1.1.0-2build2_amd64.deb ...",
        "Unpacking libbrotli1:amd64 (1.1.0-2build2) ...",
        "Selecting previously unselected package libsasl2-modules-db:amd64.",
        "Preparing to unpack .../02-libsasl2-modules-db_2.1.28+dfsg1-5ubuntu3.1_amd64.deb ...",
        "Unpacking libsasl2-modules-db:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...",
        "Selecting previously unselected package libsasl2-2:amd64.",
        "Preparing to unpack .../03-libsasl2-2_2.1.28+dfsg1-5ubuntu3.1_amd64.deb ...",
        "Unpacking libsasl2-2:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...",
        "Selecting previously unselected package libldap2:amd64.",
        "Preparing to unpack .../04-libldap2_2.6.7+dfsg-1~exp1ubuntu8.1_amd64.deb ...",
        "Unpacking libldap2:amd64 (2.6.7+dfsg-1~exp1ubuntu8.1) ...",
        "Selecting previously unselected package librtmp1:amd64.",
        "Preparing to unpack .../05-librtmp1_2.4+20151223.gitfa8646d.1-2build7_amd64.deb ...",
        "Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2build7) ...",
        "Selecting previously unselected package libssh-4:amd64.",
        "Preparing to unpack .../06-libssh-4_0.10.6-2build2_amd64.deb ...",
        "Unpacking libssh-4:amd64 (0.10.6-2build2) ...",
        "Selecting previously unselected package libcurl4t64:amd64.",
        "Preparing to unpack .../07-libcurl4t64_8.5.0-2ubuntu10.5_amd64.deb ...",
        "Unpacking libcurl4t64:amd64 (8.5.0-2ubuntu10.5) ...",
        "Selecting previously unselected package curl.",
        "Preparing to unpack .../08-curl_8.5.0-2ubuntu10.5_amd64.deb ...",
        "Unpacking curl (8.5.0-2ubuntu10.5) ...",
        "Selecting previously unselected package libldap-common.",
        "Preparing to unpack .../09-libldap-common_2.6.7+dfsg-1~exp1ubuntu8.1_all.deb ...",
        "Unpacking libldap-common (2.6.7+dfsg-1~exp1ubuntu8.1) ...",
        "Selecting previously unselected package libsasl2-modules:amd64.",
        "Preparing to unpack .../10-libsasl2-modules_2.1.28+dfsg1-5ubuntu3.1_amd64.deb ...",
        "Unpacking libsasl2-modules:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...",
        "Setting up libbrotli1:amd64 (1.1.0-2build2) ...",
        "Setting up libsasl2-modules:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...",
        "Setting up libnghttp2-14:amd64 (1.59.0-1ubuntu0.1) ...",
        "Setting up libldap-common (2.6.7+dfsg-1~exp1ubuntu8.1) ...",
        "Setting up libsasl2-modules-db:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...",
        "Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2build7) ...",
        "Setting up libsasl2-2:amd64 (2.1.28+dfsg1-5ubuntu3.1) ...",
        "Setting up libssh-4:amd64 (0.10.6-2build2) ...",
        "Setting up libldap2:amd64 (2.6.7+dfsg-1~exp1ubuntu8.1) ...",
        "Setting up libcurl4t64:amd64 (8.5.0-2ubuntu10.5) ...",
        "Setting up curl (8.5.0-2ubuntu10.5) ...",
        "Processing triggers for libc-bin (2.39-0ubuntu8.3) ..."
    ]
}

 

 

우여곡절끝에 curl 명령어를 실행해본다.

 ansible web-server -m command -a "curl http://localhost:80

 nginx가 정상적으로 실행중인 모습이다

 

 

본인은 Macos에서 docker를 띄운상태로 테스트하였기에 아래와같이 127.0.0.1:8080  , 127.0.0.1:8081

에 연결되어있다.

 

 

 

http://127.0.0.1:8080/와 http://127.0.0.1:8081/에서 Nginx가 실행되는 이유는 각 Docker 컨테이너에 Nginx 서버가 실행되고 있고, 각각의 포트가 호스트 시스템의 포트 8080과 8081로 바인딩되어 있기 때문입니다.

당신이 출력한 docker ps 결과를 보면, 두 개의 컨테이너에서 포트 80이 호스트 시스템의 8080과 8081 포트로 매핑된 것을 확인할 수 있습니다:

  • 컨테이너 ID: 71894c5be163: 이 컨테이너는 0.0.0.0:8080->80/tcp 로 포트 80이 호스트의 8080 포트와 매핑되고 있습니다.
  • 컨테이너 ID: 908d970a3bee: 이 컨테이너는 0.0.0.0:8081->80/tcp 로 포트 80이 호스트의 8081 포트와 매핑되고 있습니다.

왜 Nginx가 실행되는가?

  1. 컨테이너의 기본 이미지: 두 컨테이너는 ubuntu 이미지로 실행되고 있습니다. 기본적으로 ubuntu 이미지는 Nginx나 다른 웹 서버를 실행하지 않습니다. 그러나, 컨테이너 내에서 Nginx를 설치하고 실행했을 가능성이 있습니다. 예를 들어, Dockerfile에서 Nginx를 설치하고 설정한 경우일 수 있습니다.
  2. Nginx 설정: 컨테이너 내부에서 Nginx가 설치되고 실행 중이라면, 각 컨테이너의 포트 80에서 Nginx가 HTTP 요청을 처리하고 응답할 수 있습니다. 그러므로 http://127.0.0.1:8080/와 http://127.0.0.1:8081/로 접속할 때, 각 컨테이너에서 Nginx가 응답하게 됩니다.
  3. 포트 매핑: Docker에서 0.0.0.0:8080->80/tcp와 0.0.0.0:8081->80/tcp는 호스트 시스템의 8080과 8081 포트가 각각 컨테이너 내 80 포트로 매핑된 것을 의미합니다. 즉, 호스트의 8080 포트로 들어오는 HTTP 요청은 컨테이너의 80 포트로 전달되고, 그곳에서 실행 중인 웹 서버(여기서는 Nginx)가 요청을 처리하여 응답을 보냅니다.

따라서, http://127.0.0.1:8080/와 http://127.0.0.1:8081/에서 Nginx가 실행되는 이유는 각 컨테이너가 해당 포트로 요청을 처리하는 웹 서버(Nginx)를 실행하고 있기 때문입니다.

 

 ~ git:(master) ✗ docker network inspect bridge

[
    {
        "Name": "bridge",
        "Id": "4a42619a9667e38c0e553883b80dadf6bd35ecae8ae90d71d84da71d392b5883",
        "Created": "2024-12-04T09:29:31.141316031Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "71894c5be163e821f49ac83aa3f1f485470d5a2ea91e6ad447dc0d5fc1f39685": {
                "Name": "vm1",
                "EndpointID": "babf5d49ee8fcf2d5fe77a1bdbe0628bb7e5be91e1479068cb954c4b568068cb",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "76681f4cd3d234c48a8b149a3c2615646e00925745476cb6470596429b00de16": {
                "Name": "ansible-server",
                "EndpointID": "b7b3d112f74d101d378b3e5a6a787ff2066de14a059d95ffd5db539c94f15ef6",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "908d970a3beec6d94687a03361dd43d776f493870ba664cd61fb861d48d01256": {
                "Name": "vm2",
                "EndpointID": "3596a71327b8f7d9c51dc2c0e5b8ae4a5b2b23f4c87a4e5b46e96e386f5131e7",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "65535"
        },
        "Labels": {}
    }
]

 

아니요, 이 정보는 Docker 컨테이너들이 연결된 bridge 네트워크에 대한 것입니다. 127.0.0.1은 호스트 머신의 로컬 루프백 주소입니다. 이 주소는 호스트 시스템 내에서만 유효하며, Docker 컨테이너 내부의 네트워크와는 다릅니다.

설명:

  1. Docker의 네트워크 bridge:
    • bridge는 Docker의 기본 네트워크 드라이버입니다. 컨테이너들이 이 네트워크를 통해 서로 통신할 수 있습니다.
    • 172.17.0.0/16 서브넷에 IP 주소가 할당되어 있고, 각 컨테이너는 bridge 네트워크 내에서 고유한 IP 주소(172.17.0.2, 172.17.0.3, 172.17.0.4)를 가집니다.
  2. 컨테이너의 IP:
    • 예를 들어, vm1 컨테이너는 172.17.0.2/16의 IP를 가지고 있고, ansible-server는 172.17.0.4/16을 가지고 있습니다.
    • 이들은 모두 호스트 머신의 bridge 네트워크에 연결된 컨테이너들이며, 서로 같은 네트워크 범위 내에서만 통신할 수 있습니다.
  3. 127.0.0.1 (루프백 주소):
    • 127.0.0.1은 호스트 시스템의 로컬 주소입니다. 즉, 호스트 머신에서만 유효하며, 외부 네트워크나 다른 시스템에서는 접근할 수 없습니다.
    • Docker에서 127.0.0.1로 접근하는 것은 호스트 머신에서만 가능한 요청입니다. 컨테이너 외부에서 127.0.0.1에 접근하려면 해당 컨테이너와 관련된 포트 포워딩을 설정해야 합니다.
  4. 포트 포워딩:
    • 예를 들어, vm1 컨테이너의 포트 80이 호스트 시스템의 8080 포트로 포워딩된다면, **127.0.0.1:8080**에서 vm1 컨테이너로 요청을 보내는 것이 가능합니다.
    • 즉, **컨테이너 내부 IP (예: 172.17.0.2)**와 **호스트의 포트 (예: 8080)**가 연결되어 외부에서 127.0.0.1로 접근할 수 있게 되는 것입니다.

요약:

  • 127.0.0.1은 호스트 시스템의 로컬 주소이고, 컨테이너들이 사용하는 172.17.0.x IP 주소는 Docker의 bridge 네트워크 내에서만 유효합니다.
  • docker ps에서 8080이나 8081 포트를 설정한 컨테이너에 접근하면, 호스트에서 해당 포트를 통해 컨테이너와 통신할 수 있습니다.

 

 

포트 매핑의 개념:

  • Docker 컨테이너는 각자 독립적인 네트워크 환경을 가지고 있으며, 내부 IP 주소를 가지고 있지만, 호스트 시스템에서 컨테이너에 접근하려면 포트를 외부에 노출해야 합니다.
  • 예를 들어, vm1 컨테이너가 내부에서 80 포트에서 실행되고 있다면, 이를 호스트 시스템의 8080 포트와 매핑할 수 있습니다.

컨테이너 실행 시 -p 옵션을 사용하여 포트를 매핑합니다. 예를 들어:

bash
코드 복사
docker run -d -p 8080:80 nginx
  • 위 명령어는 nginx 컨테이너를 실행하면서:
    • 컨테이너 내부의 80 포트
    • 호스트 시스템의 8080 포트에 매핑합니다.

이렇게 하면, 호스트 시스템의 127.0.0.1:8080에서 요청을 받으면, Docker 컨테이너의 80 포트로 전달되어 nginx 서버가 응답하게 됩니다.

중요한 점:

  • docker ps에서 확인할 수 있는 포트 매핑:
    • 예시: 0.0.0.0:8080->80/tcp는 호스트의 8080 포트컨테이너의 80 포트와 연결된다는 의미입니다.
    • 이 경우 **컨테이너의 IP 주소(예: 172.17.0.2)**는 중요한 요소가 아니며, 호스트의 포트를 통해 접근하게 됩니다.

즉, 호스트의 포트 8080으로 요청을 보내면, 그 요청은 컨테이너의 포트 80으로 전달되어, 그 안에서 실행되는 웹 서버(예: nginx)가 응답을 하게 됩니다. 컨테이너 내부 IP는 실제로 외부에서 접근하는 데 사용되지 않습니다.

요약:

  • 컨테이너의 IP는 외부에서 접근할 때 필요하지 않으며, 포트 매핑만이 중요합니다.
  • Docker에서는 컨테이너 내부의 포트를 호스트의 포트로 매핑하여, 외부에서 해당 포트로 접근할 수 있게 만듭니다.

 




 

출처: https://try-it.tistory.com/49 [삽질기록:티스토리]

 

 

https://junyharang.tistory.com/441

반응형

'클라우드 > Ansible' 카테고리의 다른 글

[mac os] Ansible 설치하는법  (0) 2024.12.02