codecamp

Ansible 用 Jupyter 操控 Ansible (Managed node)

在前一章「Ansible 用 Jupyter 操控 Ansible (localhost)」冻仁用了 Jupyter 来练习 Ansible,那时冻仁只介绍 Ansible 对 Control Machine 对本机进行操控的部份,这次冻仁将透过 Jupyter 和 Ansible 来操控 2 个 Managed node。

automate_with_ansible_practice-05.jpg

怎么用 Jupyter 上的 Ansible 操控 Managed node?

建立 Managed node

使用 chusiang/ansible-managed-node 的 Docker image 来建立 2 个 Managed node,我们在「怎么用 Docker 练习 Ansible?」的章节有说明过,在此就不多加叙述。

automate_with_ansible_practice-08.jpg

  1. 启动 server1 的 Managed node,其 OS 版本为 Ubuntu 14.04。

    $ docker run --name server1 -d -P chusiang/ansible-managed-node:ubuntu-14.04
    
  2. 启动 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 容器,已建立该容器者请略过此步骤。

automate_with_ansible_practice-09.jpg

  • 启动 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 环境? 」一章)。

automate_with_ansible_practice-10.jpg

  1. 取得本机的 IP:冻仁取得的 IP 为 192.168.1.104,请自行修改。

    # GNU/Linux
    $ ifconfig eth0
    
    # macOS
    $ ifconfig en7
    
  2. 取得 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
    
  3. 进入 Jupyter notebook 网站 (http://localhost:8888/)。

  1. 修改 ansible.cfg 档案。

    [defaults]
    
    hostfile = inventory
    remote_user = docker
    private_key_file = ~/.ssh/id_rsa
    host_key_checking = False
    retry_files_save_path = ./ansible-retry
    
  2. 修改 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 的容器里。

  3. 这时 Jupyter 网站底下会有 ansible_on_jupyter.ipynbansible.cfghostssetup_jupyter.yml四个档案。

    2016-12-08-ansible-jupyter-file-list.png

Play Ansible

现在我们可以在 Jupyter 上透过 Ansible 操控 2 个 Managed node 了,记得把 inventory 的部份从 localhost 改成 all 喔!

2016-12-08-ansible-jupyter-ping.gif

  • 由于 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

相关连结

1. 在区分实体机器和虚拟机器时,我们常用 Host OS 来称呼前者,而后者则会用 Guest OS 或 VM 来形容之。 ↩


Ansible 用 Jupyter 操控 Ansible (localhost)
Ansible 用 Docker Compose 练习 Ansible
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }