想要學習ansible,只有一個節點肯定是不行的,而搭建虛擬機器又是一件非常費時費力費資源的事情,所以通過docker 快速搭建一個容器學習環境是一個不錯的選擇
1. 瞭解ansible部署
1.1 需要安裝些什麼
Ansible預設通過 SSH 協議管理機器。
安裝Ansible之後,不需要啟動或執行一個後臺程式,或是新增一個資料庫。只要在一個節點上安裝好,就可以通過這臺電腦管理一組遠端的機器。在遠端被管理的機器上,不需要安裝執行任何軟體,因此升級Ansible版本不會有太多問題.
1.2 對管理主機的要求
- 目前,只要機器上安裝了 Python 2.6 或 Python 2.7 (windows系統不可以做控制主機),都可以執行Ansible.
- 主機的系統可以是 Red Hat, Debian, CentOS, OS X, BSD的各種版本,等等.
- 自2.0版本開始,ansible使用了更多控制程式碼來管理它的子程式,對於OS X系統,你需要增加ulimit值才能使用15個以上子程式,方法 sudo launchctl limit maxfiles 1024 2048,否則你可能會看見”Too many open file”的錯誤提示.
1.3 對託管節點的要求
通常我們使用 ssh 與託管節點通訊,預設使用 sftp.如果 sftp 不可用,可在 ansible.cfg 配置檔案中配置成 scp 的方式. 在託管節點上也需要安裝 Python 2.4 或以上的版本.如果版本低於 Python 2.5 ,還需要額外安裝一個模組:
- python-simplejson
2. ansible環境部署
所以通過第一部分介紹,我們的學習環境準備4個節點,所有節點安裝相同的python版本,然後在一個節點安裝ansible即可。
ansible
host1
host2
host3
2.1 構建映象
Dockerfile.host
# Latest version of centos7
FROM centos:centos7
RUN yum clean all && \
yum -y install epel-release && \
yum -y install PyYAML python-jinja2 python-httplib2 python-keyczar python-paramiko python-setuptools git python-pip vim net-tools openssh-server
# sshd
RUN sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config && \
ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key && \
ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key && \
ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key
EXPOSE 22
RUN echo "root:123456" | chpasswd
CMD ["/usr/sbin/sshd", "-D"]
Dockerfile.ansible
# Latest version of centos7
FROM centos:centos7
RUN yum clean all && \
yum -y install epel-release && \
yum -y install PyYAML python-jinja2 python-httplib2 python-keyczar python-paramiko python-setuptools git python-pip vim net-tools openssh-server ansible
# sshd
RUN sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config && \
ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key && \
ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key && \
ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key
EXPOSE 22
RUN echo "root:123456" | chpasswd
CMD ["/usr/sbin/sshd", "-D"]
構建命令
# 構建ansible映象
docker build -t myansible/asible:1.0 -f Dockerfile.ansible .
docker build -t myansible/host:1.0 -f Dockerfile.host .
2.2 執行容器
# 執行容器
## host
for ((i=1;i<=3;i++));do echo "start host$i";docker run -td --name host${i} --hostname host${i} myansible/host:1.0 ;done
## ansible
docker run -itd --name myansible --hostname myansible myansible/asible:1.0 /bin/bash
2.3 ansible容器配置ssh免密
#獲取容器ip
for ((i=1;i<=3;i++));do docker inspect --format '{{.NetworkSettings.IPAddress}}' host${i};done
# 進入ansible容器
docker exec -it myansible /bin/bash
cat >> /etc/hosts <<EOF
172.17.0.2 host1
172.17.0.3 host2
172.17.0.4 host3
EOF
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id root@host1
ssh-copy-id root@host2
ssh-copy-id root@host3
2.4 測試ansible是否可用
# 配置hosts
vim /etc/ansible/hosts
[group1]
host1
host2
[group2]
host3
3. 清除容器及映象
使用完了清除命令
# 清除容器
docker stop myansible && docker rm myansible
for ((i=1;i<=3;i++));do echo "clean host$i";docker stop host${i} && docker rm host${i} ;done
# 清除映象
docker rmi myansible/asible:1.0 myansible/host:1.0