Ansible - deploy the ansible
[toc]
ref:
Ansible - deploy the ansible
deploy the env
Ansible 的運作
- 透過 inventory 檔案 來定義有哪些 Managed node (被控端)
- 並藉由 SSH 和 Python 進行溝通。
- 當 Control Machine (主控端) 可以用 SSH 連上 Managed node,且被連上的機器裡有預載 Python 時,Ansible 就可以運作了
Control Machine 主控端
:- 主要會在上面操作 Ansible 的機器
- 可以是我們平時用的電腦、手機 或機房裡的某一台機器
Managed node 被控端
- 則是被 Ansible 操縱的機器
- 在很多的 Lab 練習裡會用
Server
來稱呼它。
安裝 Ansible?
- 在 Control Machine 裡安裝 Ansible
- 一般的情況下,只需在 Control Machine 裡安裝 Ansible 即可
- 因為 GNU/Linux 和 macOS 的 Managed node 都早已預載了 Python 2.5 以上的版本,且開通了 SSH 連線的條件。
- 若想拿 Ansible 來管 Windows 則需進行較多的設置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# --------------------- Ubuntu (Apt) ---------------------
# 安裝 `add-apt-repository` 必要套件。
sudo apt-get install -y python-software-properties software-properties-common
# 使用 Ansible 官方的 PPA 套件來源。
sudo add-apt-repository -y ppa:ansible/ansible;
sudo apt-get update
# 安裝 Ansible
sudo apt-get install -y ansible
# --------------------- CentOS (Yum) ---------------------
# 新增 `epel-release` 第三方套件來源。
sudo yum install -y epel-release
# 安裝 Ansible。
sudo yum install -y ansible
# --------------------- macOS (Homebrew) ---------------------
# 安裝 [homebrew]
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 安裝 Ansible
brew install ansible
# --------------------- Python (Pip) ---------------------
# Ansible 近來的釋出速度很快,若想追求較新的版本可改用 **Pip** 的方式進行安裝,較不建議初學者使用。
# 先安裝 [pip][pip],已安裝者請略過。
# Debian, Ubuntu
$ sudo apt-get install -y python-pip
# CentOS
$ sudo yum install -y python-pip
# macOS
$ sudo easy_install pip
# 升級 pip。
sudo pip install -U pip
# 安裝 Ansible
sudo pip install ansible
- 在 Managed Node 安裝 OpenSSH server 和 Python
1
2
3
4
5
6
7
8
# Ubuntu.
sudo apt-get install -y openssh-server python2.7
# CentOS.
sudo yum install -y openssh-server python
# macOS:
# 在 macOS 10.11 裡,我們只需使用內建的 OpenSSH server 和 Python 即可
主机免秘钥连接
1
2
3
4
5
6
7
8
9
# 生成本地ssh秘钥
ssh-keygen
# 将本地秘钥发给远端服务器
# (例:用户名为root ip地址为192.168.1.1)
ssh-copy-id root@192.168.1.1
# 出现Are you sure you want to continue connecting (yes/no)? 时,输入yes,之后输入目标服务器的密码,大功告成。
# 再次测试连接远端服务器,不需要密码连接上就表明成功
設定 Ansible
藉由 ansible.cfg
- 設定預設的 inventory 檔案的路徑 、遠端使用者名稱 和 SSH 金鑰路徑 等相關設定。
- 安裝好 Ansible
- Ansible 的設定檔
/etc/ansible/ansible.cfg
- 通常我們較偏愛把
ansible.cfg
和hosts
這兩個檔案與其它的Playbooks
放在同個專案目錄底下,然後透過版本控制系統 (例如 Git) 把它們一起儲存起來,以實現 Ansible 的 Infrastructure as Code d
1
2
3
4
5
6
7
8
vim ansible.cfg
[default]
# inventory path
inventory = hosts
remote_user = vagrant
# private_key_file = ~/.ssh/id_rsa
host_key_checking = False
- inventory
- 一份主機列表,
- 定義每個 Managed Node 的代號、IP 位址、連線相關資訊和群組。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /etc/ansible/hosts
[dev]
ansible-demo.local ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
[test] # test分组
ansible-demo.local ansible_ssh_host=10.10.1.1 ansible_ssh_port=adeliae
[dev]
ansible-demo.local ansible_ssh_host=demo.drx.tw ansible_ssh_port=22
[test] # test分组
192.168.0.1 ansible_user=xxx
# 远程服务器地址,指定主机用户名
- 若有對 Control Machine 本機操作的需求,建議於
/etc/ansible/hosts
補上 local 的設定。
1
2
3
4
5
# For root user.
$ /bin/echo -e "[local]\nlocalhost ansible_connection=local" >> /etc/ansible/hosts
# For sudo user.
$ sudo su -c '/bin/echo -e "[local]\nlocalhost ansible_connection=local" >> /etc/ansible/hosts'
Hello World
當已上的設置都完成了,您可以試著在終端機裡用 Ansible 呼叫本機印出 Hello World
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ansible localhost -m command -a 'echo Hello World.'
# localhost | SUCCESS | rc=0 >>
# Hello World.
# 通过指定用户名灵活登录:
$ ansible all -m ping -u xxx
# 登录成功后,显示如下:
# 192.168.0.1 | SUCCESS => {
# "changed": false,
# "ping": "pong"
# }
$ ansible all -a "echo hello"
# 输出:
# 192.168.0.1 | SUCCESS | rc=0 >>
# hello
用 Vagrant 練習 Ansible
Vagrant
- 純文字工具
- 管理本機的虛擬機器,透過它可以很快速的建立開發和測試的虛擬環境。
光是可以省下在虛擬機安裝作業系統 (Operation System) 和 OpenSSH server 的時間,就足夠我們使用它了!更別說還可以用它來設定虛擬機的記憶體 (RAM) 大小、網路配置等等。
安裝 Vagrant
請先安裝最新版的 [Virtualbox][download_virtualbox] 和 Extension Pack,之後再安裝 [Vagrant][download_vagrant] 即可。
用 Vagrant 管理虛擬機器?
這裡凍仁只簡單地列出本次主題相關指令,練習時只需執行步驟 1, 2 即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 建立 Ubuntu 14.04 的 `Vagrantfile` 設定檔。
vagrant init ubuntu/trusty64
# 2. 建立虛擬機器並開啟機器。
vagrant up
# 3. 關閉機器。
vagrant halt
# 4. 重新開機。
vagrant reload
# 5. SSH 遠端連線。
vagrant ssh
# 6. 移除虛擬機器。
vagrant destroy
讓 Ansible 操控用 Vagrant 開好的機器?
用 Ansible 來控制 Vagrant 在本機上建立的虛擬機,其作業系統版本為 Ubuntu 14.04 64-bit (AMD64)
- 取得虛擬機的 OpenSSH 設定:
- 留意
HostName
、User
、Port
還有IdentityFile
的值。
1 2 3 4 5 6 7 8 9 10 11
$ vagrant ssh-config Host default HostName 127.0.0.1 User vagrant Port 2222 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /home/jonny/vcs/4.docs/automate-with-ansible/.vagrant/machines/default/virtualbox/private_key IdentitiesOnly yes LogLevel FATAL
- 留意
- 設定 ansible.cfg:
remote_user
和private_key_file
的設定分別對應 ssh-config 的User
和IdentityFile
。
1 2 3 4 5 6 7
$ vi ansible.cfg [defaults] inventory = hosts remote_user = vagrant private_key_file = .vagrant/machines/default/virtualbox/private_key host_key_checking = False
- 設定 hosts:
ansible_ssh_host
和ansible_ssh_port
的設定分別對應 ssh-config 的HostName
和Port
。
1 2 3 4 5
$ vi hosts server1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222 [local] server1
Hello World on Vagrant
當已上的設置都完成了,我們就可以在終端機裡用 Vagrant 建立好的虛擬機來練習 Ansible 了!
1
2
3
$ ansible all -m command -a 'echo Hello World on Vagrant.'
server1 | SUCCESS | rc=0 >>
Hello World on Vagrant.
用 Docker 練習 Ansible
用 Docker 管理容器 (Container)
在 Docker Hub 上建好了 Managed Node 的 Docker image - [chusiang/ansible-managed-node
][ansible_managed_node] 以利大家練習 Ansible,該專案目前支援的 Linux 發行版本有:
alpine-3.4
(End-of-life, EOL)alpine-3.6
,latest
archlinux
centos-6
centos-7
debian-7
debian-8
gentoo
(EOL)opensuse-42.1
(EOL)opensuse-42.2
opensuse-42.3
ubuntu-14.04
ubuntu-16.04
底下將列出本次主題所會用到的相關指令,練習時只需執行步驟 1, 2, 3 即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 1. 取得 Docker image。
$ docker pull chusiang/ansible-managed-node:ubuntu-14.04
#### 使用者帳戶 #####################
#
# | | username | password |
# |-----------|----------|----------|
# | root user | root | root |
# | sudo user | docker | docker |
# 2. 建立並執行容器。
$ docker run --name server1 -d -P chusiang/ansible-managed-node:ubuntu-14.04
# ecdf39055ba2a932fa8c76a75afdec1cd8f516285bee6f4e07c16c67f4009211
# 3. 觀看容器狀態和 SSH 綁定的埠口 (Port)。
$ docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# ecdf39055ba2 chusiang/ansible-managed-node:ubuntu-14.04 "/usr/sbin/sshd -D" 20 hours ago Up 17 seconds 0.0.0.0:32805->22/tcp server1
# 4. 進入容器。
$ docker exec -it server1 bash
# 5. 關閉容器。
$ docker stop server1
# 6. 啟用容器。
$ docker start server1
# 7. 移除容器。
$ docker rm server1
# -f, --force: 強制移除,包含正在執行的容器。
讓 Ansible 操控用 Docker 開好的容器
用 Ansible 來控制 Docker 在本機上建立的容器,其作業系統版本為 Ubuntu 14.04 64-bit (AMD64)
- 取得容器的 OpenSSH 設定:
- 請特別留意
0.0.0.0:32805->22/tcp
的值。
1 2 3
$ docker ps # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # ecdf39055ba2 chusiang/ansible-managed-node:ubuntu-14.04 "/usr/sbin/sshd -D" 20 hours ago Up 17 seconds 0.0.0.0:32805->22/tcp server1
- 請特別留意
- 設定 ansible.cfg:
- 將
remote_user
設為docker
。
1 2 3 4 5 6
$ vi ansible.cfg [defaults] inventory = hosts remote_user = docker host_key_checking = False
- 將
設定 hosts。
1 2 3 4 5
$ vi hosts server1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=32805 ansible_ssh_pass=docker [local] server1
ansible_ssh_host
:為本機的 IP。ansible_ssh_port
:為docker ps
時取得的 SSH port。ansible_ssh_pass
:因沒有連線用的 SSH 金鑰,故直接使用密碼的方式進行連線,建議只於練習環境使用 該參數。
Hello World on Docker
當已上的設置都完成了,我們就可以在終端機裡用 Docker 建立好的容器來練習 Ansible 了!
1
2
3
$ ansible all -m command -a 'echo Hello World on Docker.'
server1 | SUCCESS | rc=0 >>
Hello World on Docker.
用 Jupyter 操控 Ansible
作為 Control Machine 的 Jupyter Docker image - [chusiang/ansible-jupyter
][ansible_jupyter]
目前支援的 Linux 發行版本有:
alpine-3.4
(End-of-life, EOL)alpine-3.6
, latestarchlinux
centos-7
debian-7
debian-8
gentoo
(EOL)opensuse-42.1
(EOL)opensuse-42.2
opensuse-42.3
ubuntu-14.04
ubuntu-16.04
- 在終端機 (Terminal) 裡啟動 Jupyter 的容器
- 依個人喜好選擇 image,
- 其
latest
標籤 (tag) 是對應到alpine-3.4
。
1 2 3 4 5
# alpine-3.4 $ docker run -p 8888:8888 -d chusiang/ansible-jupyter:alpine-3.4 # ubuntu-14.04 $ docker run -p 8888:8888 -d chusiang/ansible-jupyter:ubuntu-14.04
查看容器狀態,並確認剛剛啟動的 Jupyter 容器是有否綁定 Port 到 8888 上。
1 2 3
$ docker ps # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 4c5e92f73db8 chusiang/ansible-jupyter:ubuntu-14.04 "docker-entrypoint.sh" 44 hours ago Up 3 seconds 0.0.0.0:8888->8888/tcp naughty_elion
- 於瀏覽器輸入
https://localhost:8888/
進入 Jupyter 網站。 - 開啟
ansible_on_jupyter.ipynb
檔案。 試著在 Jupyter 上操控 Ansible
1 2 3 4 5
!ansible localhost -m ping # localhost | SUCCESS => { # "changed": false, # "ping": "pong" # }
- 在 Jupyter 上要執行 Shell 指令時,記得要在開頭加上
!
的前綴字元。 - 練習完,記得下載這本 notebook (透過左上角的
File
選單裡有Download as
的項目進行下載),不然一旦等容器被移除該筆記就沒了! - 現在的環境其實只有 Control Machine 一台,所以 inventory 的設定只有
localhost
有作用!
.
Comments powered by Disqus.