用 Docker 來自動建立 Ansible 練習環境

此文章為利用 docker 來建立一個練習於 Ansible 的 Container,使用到 docker exec 作為傳遞指令的方式,並於文末附上我所寫的 Shell Script。

盤點要求

我們要的 Ansible VM 環境其實不複雜,但是手動設定真的太麻煩了:

  1. 要有 openssl-server 安裝好
  2. 修改一下 sshd_config 讓 ansible 能透過 ssh 來控制機器
  3. 要記得重啟 sshd
  4. 修改機器的密碼,這樣才能夠 ssh 登入
  5. 拿到 docker container 的 IP address
  6. 把 docker IP 寫到 /etc/ansible/hosts 設定檔裡面

docker create

1
docker create --name="sdn$1" --privileged -it ubuntu:14.04

會使用到 --privileged Flag 只是習慣,因為我常常會修改網路設定,如果沒有這個 Flag 會沒辦法修改網路(IP, route, … etc)

docker exec

1
docker exec [container_id or name] [command]

原本我是寫 docker exec name 'ls -al' 之類的,把整個指令包在一個字串裡,沒想到這樣子它會想要跑去找到一個叫做 ls -al 的指令。

原本擔心的會把 flag 餵到 docker exec 而不是帶進 ls 的,不過幾經嘗試之後,發現參數是跟隨 ls 的,這樣撰寫的話就不會碰到問題:

1
docker exec name command arg1 arg2 arg3

replace text by sed

在這邊我使用 sed 來把 sources.list 修改成臺灣交通大學的主機,以及把 sshd_config 當中的允許 Root 登入修改成允許。

1
2
sed -i 's/archive.ubuntu.com/ubuntu.cs.nctu.edu.tw/g' /etc/apt/sources.list
sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/g' /etc/ssh/sshd_config

Get docker IP address

這個是從 StackOverflow 查到的答案:

1
ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id or name])

Shell Script

綜合以上便能寫出這個 Shell Script,這個腳本需要使用 sudo 執行,因為需要修改到 /etc/ansible/hosts,請再根據自身需求做修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker stop sdn$1; docker rm sdn$1
docker create --name="sdn$1" --privileged -it ubuntu:14.04
docker start sdn$1
(docker exec sdn$1 sed -i 's/archive.ubuntu.com/ubuntu.cs.nctu.edu.tw/g' /etc/apt/sources.list)
(docker exec sdn$1 apt-get update)
(docker exec sdn$1 apt-get install openssh-server vim -y)
(docker exec sdn$1 sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/g' /etc/ssh/sshd_config)
(docker exec sdn$1 service ssh restart)
docker exec sdn$1 sh -c 'echo "root:sdn" | chpasswd'
ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' sdn$1)
s="[sdn$1]\n$ip ansible_ssh_user=root ansible_ssh_pass=sdn\n"
echo "$s" >> /etc/ansible/hosts
su -c "ssh-keygen -f '/home/aweimeow/.ssh/known_hosts' -R $ip" -m aweimeow
su -c "ssh-keyscan $ip >> /home/aweimeow/.ssh/known_hosts" -m aweimeow

附註:我非常不熟 Shell Script,如果有更好的寫法歡迎提交 PR QQ