Ansible 用 Jupyter 操控 Ansible (Managed node)
在前一章「Ansible 用 Jupyter 操控 Ansible (localhost)」冻仁用了 Jupyter 来练习 Ansible,那时冻仁只介绍 Ansible 对 Control Machine 对本机进行操控的部份,这次冻仁将透过 Jupyter 和 Ansible 来操控 2 个 Managed node。
怎么用 Jupyter 上的 Ansible 操控 Managed node?
建立 Managed node
使用 chusiang/ansible-managed-node
的 Docker image 来建立 2 个 Managed node,我们在「怎么用 Docker 练习 Ansible?」的章节有说明过,在此就不多加叙述。
启动 server1 的 Managed node,其 OS 版本为 Ubuntu 14.04。
$ docker run --name server1 -d -P chusiang/ansible-managed-node:ubuntu-14.04
启动 server2 的 Managed node,其 OS 版本为 CentOS 7。
$ docker run --name server2 -d -P chusiang/ansible-managed-node:centos-7
建立 Control Machine
请参考前一章「怎么用 Jupyter 操控 Ansible?(localhost)」,使用 chusiang/ansible-jupyter
的 Docker image 建立 Control Machine 容器,已建立该容器者请略过此步骤。
启动 Control Machine,其 OS 版本为 Ubuntu 14.04。
$ docker run -p 8888:8888 -d chusiang/ansible-jupyter:ubuntu-14.04
设定 Ansible 环境
建好 Control Machine 和 Managed node 的环境后,我们还需通过 ansible.cfg
和 inventory
档案将两者串接起来 (可参考「怎么部署 Ansible 环境? 」一章)。
取得本机的 IP:冻仁取得的 IP 为
192.168.1.104
,请自行修改。# GNU/Linux $ ifconfig eth0 # macOS $ ifconfig en7
取得 Managed node 容器所绑定的 OpenSSH port,请特别留意
0.0.0.0:*->22/tcp
的部份。$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 309616808a9e chusiang/ansible-jupyter:ubuntu-14.04 "docker-entrypoint.sh" 2 days ago Up 1 seconds 0.0.0.0:8888->8888/tcp admiring_mccarthy 89fc4e7cca15 chusiang/ansible-managed-node:centos-7 "/usr/sbin/sshd -D" 2 days ago Up 51 minutes 0.0.0.0:32806->22/tcp server2 ecdf39055ba2 chusiang/ansible-managed-node:ubuntu-14.04 "/usr/sbin/sshd -D" 3 days ago Up 39 hours 0.0.0.0:32805->22/tcp server1
进入 Jupyter notebook 网站 (http://localhost:8888/)。
修改
ansible.cfg
档案。[defaults] hostfile = inventory remote_user = docker private_key_file = ~/.ssh/id_rsa host_key_checking = False retry_files_save_path = ./ansible-retry
修改
inventory
档案,并填入步骤 1 取得的 IP 和步骤 2 取得的 OpenSSH port。server1 ansible_ssh_host=192.168.1.104 ansible_ssh_port=32805 server2 ansible_ssh_host=192.168.1.104 ansible_ssh_port=32806
请勿在这个 Lab 使用 localhost 和 127.0.0.1 的位址,这会让 Control Machine 一直对自己找 Managed node。在这里我们是把 Managed node 的 OpenSSH port 绑在 Host OS 1 上,而不是 Control Machine 的容器里。
这时 Jupyter 网站底下会有
ansible_on_jupyter.ipynb
,ansible.cfg
,hosts
,setup_jupyter.yml
四个档案。
Play Ansible
现在我们可以在 Jupyter 上透过 Ansible 操控 2 个 Managed node 了,记得把 inventory 的部份从 localhost
改成 all
喔!
由于 Control Machine 是借由
docker
这个 sudo user 来管理 Managed node,故我们需借由--become
参数来取得 Managed node 上的sudo
权限。!ansible all -m command -a 'sudo cat /etc/sudoers' --become
后话
终于帮先前辛辛苦苦建置的 chusiang/ansible-jupyter
和 chusiang/ansible-managed-node
两个 Docker image 写了一篇完整的介绍文了!一开始建置时没想那么多,没想到这样的组合会这么有威力!现在冻仁不管是要 debug 还是测试不同的 GNU/Linux 都会先拿这两个 image 来用呢。:P
相关连结
chusiang/ansible-jupyter
| Docker Hubchusiang/ansible-managed-node
| Docker Hub- 前端工程师一定要知道的 Docker 虚拟化容器技巧 | 冻仁的笔记
1. 在区分实体机器和虚拟机器时,我们常用 Host OS 来称呼前者,而后者则会用 Guest OS 或 VM 来形容之。 ↩