1. Chạy LAB
Copy 6 lệnh dưới → dán trên PowerShell bằng cách click chuột phải
→ không phải gõ gõ từng lệnh mất thời gian
Chạy 6 lệnh sau trên Powershell quyền Administrator → dấu # là giải thích (comment)
# Giả sử có ổ đĩa D:
# Tạo thư mục D:ansible-lab08 + chuyển vào thư mục
mkdir D:ansible-lab08 > $null ; cd D:ansible-lab08
# Khai báo biến là link tới file cần download
$URL="https://devsecops.edu.vn/wp-content/uploads/2023/11/ansible-lab08-6SPD0ksGvXJuUmDtYq2rY4wJzuDZZ8.zip"
# Download file zìa
Invoke-WebRequest -URI $URL -OutFile ansible-lab08.zip
# Giải nén file + đổi tên
Expand-Archive ansible-lab08.zip -DestinationPath .
# Coi trong thư mục đang đứng có gì
dir
# Tạo máy ảo + chạy LAB từ A tới Á
vagrant up
2. Các file nội dung mới nhất ở đây
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.define "ansible4node" do |ansible4node|
ansible4node.vm.box = "ubuntu/jammy64"
ansible4node.vm.hostname = 'ubuntu2204'
ansible4node.vm.provider :virtualbox do |v|
v.gui = true
v.cpus = 2
v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
v.customize ["modifyvm", :id, "--memory", 2048]
v.customize ["modifyvm", :id, "--name", "Ansible-1VM-4Container-docker-compose-Key-Authen"]
end
ansible4node.vm.provision "shell", path: "install.sh"
ansible4node.vm.provision "shell", path: "by-keyauthen-compose.sh"
ansible4node.vm.provision "shell", path: "run-ansible.sh"
ansible4node.vm.provision "shell", path: "get-ip-4container.sh"
end
end
install.sh
#!/bin/bash
echo -e "n1. Cài Docker, docker-composen"
apt update && apt install docker.io docker-compose -y
systemctl status docker
# END
by-keyauthen-compose.sh
#!/bin/bash
echo -e "n2. Build 4 Docker Container imagen"
# Phải vào thư mục chứa docker-compose.yml
cd /vagrant/normal
docker-compose up -d
echo -e "n3. 4 Container image đã build (READ ONLY)n"
docker image ls
echo -e "n4. 4 Container đang chạy (READ WRITE)n"
docker container ls
echo -e "n5. Chép public key vào containern"
# Tạo public/private key
cd
ssh-keygen -q -t rsa -b 2048 -N '' -C 'DevSecOps.Edu.VN' -f /root/.ssh/id_rsa
# Chép private key vào Ansible Control Node
docker cp /root/.ssh/id_rsa ubuntu2204-control:/root/.ssh/
# Chép public key vào Ansible Control Node để từ Host SSH vào được lun
docker cp /root/.ssh/id_rsa.pub ubuntu2204-control:/root/.ssh/authorized_keys
# Chép public key vào 3 Ansible Managed Nodes
docker cp /root/.ssh/id_rsa.pub alma92-compose:/root/.ssh/authorized_keys
docker cp /root/.ssh/id_rsa.pub ubuntu2204-compose:/root/.ssh/authorized_keys
docker cp /root/.ssh/id_rsa.pub alpine318-compose:/root/.ssh/authorized_keys
# Chép file inventory + playbook vào Ansible Control Node
docker cp /vagrant/ansible ubuntu2204-control:/etc
docker exec ubuntu2204-control ls /etc/ansible
# END
run-ansible.sh
#!/bin/bash
echo -e "n6. Chạy Ansible Control Node trên container ubuntu2204-controln"
echo -e "n6.1 Xem Ansible Inventoryn"
docker exec ubuntu2204-control ansible-inventory --graph
echo -e "n6.2 Ping 3 node là 3 containern"
docker exec ubuntu2204-control ansible ssh_4node -m ping
echo -e "n6.3 Chạy lịnh tới 3 node là 3 containern"
docker exec ubuntu2204-control ansible ssh_4node -a "cat /etc/os-release"
echo -e "n6.4 Chạy playbook tới 3 node là 3 containern"
docker exec ubuntu2204-control ansible-playbook /etc/ansible/web-server.yml
# END
get-ip-4container.sh
#!/bin/bash
echo -e "n7. Lấy 4 IP của 4 Container để SSH chơin"
# Lấy 3 IP của 3 Container đang chạy
export Alma92_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' alma92-compose)
export Ubuntu2204_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ubuntu2204-compose)
export Alpine318_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' alpine318-compose)
export Ubuntu2204_Control_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ubuntu2204-control)
echo "IP của Ansible control node: $Ubuntu2204_Control_IP"
echo "IP của Alma92 node: $Alma92_IP"
echo "IP của Ubuntu2204 node: $Ubuntu2204_IP"
echo -e "IP của Alpine318 node: $Alpine318_IPn"
# Chép file config ssh client để ssh k cần check host key
cp /vagrant/config ~/.ssh/config
chmod 400 ~/.ssh/config
# END
config
Host *
StrictHostKeyChecking no
[ssh_4node]
alma92-compose
ubuntu2204-compose
alpine318-compose
[all:vars]
ansible_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa
---
- hosts: ssh_4node
tasks:
- name: Cài Apache Web Server mới nhứt trên Ubuntu 22.04
apt:
name: apache2
when: ansible_distribution == "Ubuntu"
- name: Cài Apache Web Server mới nhứt trên AlmaLinux 9
yum:
name: httpd
when: ansible_distribution == "AlmaLinux"
- name: Cài Apache Web Server mới nhứt trên Alpine Linux 3.18
apk:
name: apache2
state: present
when: ansible_distribution == "Alpine"
# Lấy cục image container zìa
FROM almalinux:9.2
# Cài openssh server + client + các tool mần lab
RUN dnf -y install openssh-server openssh-clients passwd iproute
# Trên dòng EL, start ssh k tự tạo ra host keys --> lỗi
# --> thêm host keys vào
RUN ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -C 'DevSecOps.Edu.VN' -t rsa
RUN ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -N '' -C 'DevSecOps.Edu.VN' -t ecdsa
# Tạo thư mục để bỏ public key vào
RUN mkdir /root/.ssh
# K cho SSH = password
RUN sed -i '/^#PasswordAuthentication.*/a PasswordAuthentication no' /etc/ssh/sshd_config
# Đổi password cho root
RUN echo "1" | passwd root --stdin
EXPOSE 22
# Do hổng có systemd start dịch vụ sshd
# Chạy sshd trực tiếp bằng lịnh dưới
CMD ["/usr/sbin/sshd", "-D"]
FROM alpine:3.18.2
# Cài python3 để Ansible control node móc vào được
RUN apk add openssh-server openssh-client iproute2 python3
# K cho SSH = password, SSH cho root login
RUN echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config
RUN echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
# Tạo các host key
RUN ssh-keygen -A
# Tạo thư mục này để bỏ public key vào
RUN mkdir /root/.ssh
# Set password root là 1
RUN echo 'root:1' | chpasswd
# Tạo file thư mục cần thiết để start SSH
RUN mkdir -p /run/openrc
RUN touch /run/openrc/softlevel
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
# Lấy cục image container zìa, nó là read only nhen
FROM ubuntu:22.04
# Cài các gói cần thiết
RUN apt update
RUN apt -y install openssh-server openssh-client iproute2 init-system-helpers
# Đổi password root là 1
RUN echo "root:1" | chpasswd
# K cho SSH = password + cho root SSH vào
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
# Tạo thư mục này để bỏ public key vào
RUN mkdir /root/.ssh
# Start dịch vụ SSH
RUN service ssh start
EXPOSE 22
# Do hổng có systemd start dịch vụ sshd
# Chạy sshd trực tiếp bằng lịnh dưới
CMD ["/usr/sbin/sshd", "-D"]
# Lấy cục image container zìa, nó là read only nhen
FROM ubuntu:22.04
# Cài các gói cần thiết
RUN apt update
RUN export DEBIAN_FRONTEND=noninteractive ; apt -y install openssh-server openssh-client iproute2 init-system-helpers ansible-core pip sshpass
# Đổi password root là 1
RUN echo "root:1" | chpasswd
# K cho SSH = password + root được SSH vào
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
# Copy file ansible.cfg vào /etc/ansible để pip cài thư viện resolvelib ở dưới
RUN mkdir /etc/ansible
ADD . /etc/ansible
# Sửa lỗi https://devsecops.edu.vn/ansible-control-node-tren-ubuntu-server-2204-loi-ansible-galaxy/
RUN pip install -Iv 'resolvelib<0.6.0'
# Cài collection community.general để chạy được lệnh apk
# https://docs.ansible.com/ansible/latest/collections/community/general/apk_module.html
RUN ansible-galaxy collection install community.general
# Tạo thư mục để bỏ private key vào
RUN mkdir /root/.ssh
# Start dịch vụ SSH
RUN service ssh start
EXPOSE 22
# Do hổng có systemd start dịch vụ sshd
# Chạy sshd trực tiếp bằng lịnh dưới
CMD ["/usr/sbin/sshd", "-D"]
[defaults]
host_key_checking=False
# Sửa lỗi
# https://devsecops.edu.vn/ansible-galaxy-bi-loi-gi-vay-khi-cai-ansible-collections/
[galaxy]
server = https://old-galaxy.ansible.com/
docker-compose.yml
version: '3'
services:
alma92-compose:
image: devsecops.edu.vn/alma92-ssh:1.0
container_name: alma92-compose
# Chỉ ra thư mục có file Dockerfile
build: ./alma92
# Để container vẫn chạy sau khi chạy xong lịnh docker-compose
tty: true
ubuntu2204-compose:
image: devsecops.edu.vn/ubuntu2204-ssh:1.0
container_name: ubuntu2204-compose
build: ./ubuntu2204
tty: true
alpine318-compose:
image: devsecops.edu.vn/alpine318-ssh:1.0
container_name: alpine318-compose
build: ./alpine318
tty: true
ubuntu2204-control:
image: devsecops.edu.vn/ubuntu2204-control:1.0
container_name: ubuntu2204-control
build: ./ubuntu2204-control
tty: true