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/
docker 설치확인
* 오늘은 git bash 터미널에서 진행해봅니다.
**주의: 관리자권한이 없으면 아래같은 에러가 발생합니다. 관리자권한으로 실행하기
**주의2 docker login도 해줍니다
우분투 이미지 다운로드
➜ 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 명령어를 사용하는 이유:
- Ansible 관리 대상 서버 정의: Ansible이 자동으로 원격 서버와 통신하려면, 어떤 서버들을 관리할 것인지 지정해야 합니다. 이 파일에 관리할 서버들의 IP 주소, 호스트명 또는 그룹 이름을 정의합니다.
- 호스트 그룹화: Ansible에서는 여러 서버를 그룹으로 묶어서 관리할 수 있습니다. 예를 들어, 여러 대의 ubuntu_servers 그룹을 만들어 하나의 그룹으로 명령을 실행할 수 있습니다.
- 자동화: 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 파일에 호스트 키가 추가되어야 합니다.
해결 방법
- 호스트 키 지문을 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에 대한 신뢰가 설정되었습니다.
이제 할 수 있는 일:
- 비밀번호 인증 완료:
- 비밀번호를 입력한 후 root@172.17.0.3에 성공적으로 로그인된 것으로 보입니다. 현재는 SSH를 통해 서버에 접속 중입니다.
- 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 결과확인
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 설명:
- Nginx 최신 버전 설치:
- apt 모듈을 사용하여 nginx를 설치합니다.
- state: latest 옵션을 사용하면 최신 버전으로 설치됩니다.
- update_cache: yes 옵션을 추가하여, 패키지 캐시를 최신 상태로 유지합니다.
- 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가 실행되는가?
- 컨테이너의 기본 이미지: 두 컨테이너는 ubuntu 이미지로 실행되고 있습니다. 기본적으로 ubuntu 이미지는 Nginx나 다른 웹 서버를 실행하지 않습니다. 그러나, 컨테이너 내에서 Nginx를 설치하고 실행했을 가능성이 있습니다. 예를 들어, Dockerfile에서 Nginx를 설치하고 설정한 경우일 수 있습니다.
- Nginx 설정: 컨테이너 내부에서 Nginx가 설치되고 실행 중이라면, 각 컨테이너의 포트 80에서 Nginx가 HTTP 요청을 처리하고 응답할 수 있습니다. 그러므로 http://127.0.0.1:8080/와 http://127.0.0.1:8081/로 접속할 때, 각 컨테이너에서 Nginx가 응답하게 됩니다.
- 포트 매핑: 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 컨테이너 내부의 네트워크와는 다릅니다.
설명:
- Docker의 네트워크 bridge:
- bridge는 Docker의 기본 네트워크 드라이버입니다. 컨테이너들이 이 네트워크를 통해 서로 통신할 수 있습니다.
- 172.17.0.0/16 서브넷에 IP 주소가 할당되어 있고, 각 컨테이너는 bridge 네트워크 내에서 고유한 IP 주소(172.17.0.2, 172.17.0.3, 172.17.0.4)를 가집니다.
- 컨테이너의 IP:
- 예를 들어, vm1 컨테이너는 172.17.0.2/16의 IP를 가지고 있고, ansible-server는 172.17.0.4/16을 가지고 있습니다.
- 이들은 모두 호스트 머신의 bridge 네트워크에 연결된 컨테이너들이며, 서로 같은 네트워크 범위 내에서만 통신할 수 있습니다.
- 127.0.0.1 (루프백 주소):
- 127.0.0.1은 호스트 시스템의 로컬 주소입니다. 즉, 호스트 머신에서만 유효하며, 외부 네트워크나 다른 시스템에서는 접근할 수 없습니다.
- Docker에서 127.0.0.1로 접근하는 것은 호스트 머신에서만 가능한 요청입니다. 컨테이너 외부에서 127.0.0.1에 접근하려면 해당 컨테이너와 관련된 포트 포워딩을 설정해야 합니다.
- 포트 포워딩:
- 예를 들어, 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 옵션을 사용하여 포트를 매핑합니다. 예를 들어:
- 위 명령어는 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 [삽질기록:티스토리]
'클라우드 > Ansible' 카테고리의 다른 글
[mac os] Ansible 설치하는법 (0) | 2024.12.02 |
---|