Post

Ansible - deploy the ansible

[toc]

ref:


Ansible - deploy the ansible


deploy the env

Screen Shot 2021-01-25 at 22.05.38

Ansible 的運作

  • 透過 inventory 檔案 來定義有哪些 Managed node (被控端)
  • 並藉由 SSHPython 進行溝通。
  • 當 Control Machine (主控端) 可以用 SSH 連上 Managed node,且被連上的機器裡有預載 Python 時,Ansible 就可以運作了
    • Control Machine 主控端
      • 主要會在上面操作 Ansible 的機器
      • 可以是我們平時用的電腦、手機 或機房裡的某一台機器
    • Managed node 被控端
      • 則是被 Ansible 操縱的機器
      • 在很多的 Lab 練習裡會用 Server 來稱呼它。

安裝 Ansible?

  1. 在 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
  1. 在 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 金鑰路徑 等相關設定。
  1. 安裝好 Ansible
  2. Ansible 的設定檔 /etc/ansible/ansible.cfg
  3. 通常我們較偏愛把 ansible.cfghosts 這兩個檔案與其它的 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
  1. 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
# 远程服务器地址,指定主机用户名
  1. 若有對 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 開好的機器?

Screen Shot 2021-01-25 at 22.55.22

用 Ansible 來控制 Vagrant 在本機上建立的虛擬機,其作業系統版本為 Ubuntu 14.04 64-bit (AMD64)

  1. 取得虛擬機的 OpenSSH 設定:
    • 留意 HostNameUserPort 還有 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
    
  2. 設定 ansible.cfg
    • remote_userprivate_key_file 的設定分別對應 ssh-config 的 UserIdentityFile
    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
    
  3. 設定 hosts
    • ansible_ssh_hostansible_ssh_port 的設定分別對應 ssh-config 的 HostNamePort
    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 開好的容器

Screen Shot 2021-01-25 at 23.01.56

用 Ansible 來控制 Docker 在本機上建立的容器,其作業系統版本為 Ubuntu 14.04 64-bit (AMD64)

  1. 取得容器的 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
    
  2. 設定 ansible.cfg
    • remote_user 設為 docker
    1
    2
    3
    4
    5
    6
    
    $ vi ansible.cfg
    [defaults]
    
    inventory = hosts
    remote_user = docker
    host_key_checking = False
    
  3. 設定 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
    
    1. ansible_ssh_host:為本機的 IP。
    2. ansible_ssh_port:為 docker ps 時取得的 SSH port。
    3. 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

Screen Shot 2021-01-26 at 13.37.41

作為 Control MachineJupyter Docker image - [chusiang/ansible-jupyter][ansible_jupyter]

目前支援的 Linux 發行版本有:

  • alpine-3.4 (End-of-life, EOL)
  • alpine-3.6, latest
  • archlinux
  • 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. 在終端機 (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
    
  2. 查看容器狀態,並確認剛剛啟動的 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
    
  3. 於瀏覽器輸入 https://localhost:8888/ 進入 Jupyter 網站。
  4. 開啟 ansible_on_jupyter.ipynb 檔案。
  5. 試著在 Jupyter 上操控 Ansible

    1
    2
    3
    4
    5
    
    !ansible localhost -m ping
    # localhost | SUCCESS => {
    #     "changed": false,
    #     "ping": "pong"
    # }
    
  6. 在 Jupyter 上要執行 Shell 指令時,記得要在開頭加上 ! 的前綴字元。
  7. 練習完,記得下載這本 notebook (透過左上角的 File 選單裡有 Download as 的項目進行下載),不然一旦等容器被移除該筆記就沒了!
  8. 現在的環境其實只有 Control Machine 一台,所以 inventory 的設定只有 localhost 有作用!

.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.