Post

Ansible - Ansible setup

[toc]

ref:


Ansible - Ansible setup


操作 Ansible

用 Ad-Hoc command 和 Playbook 兩種方式來操作 Ansible。

  • 前者是透過一次次簡短的指令來操作 Ansible,
  • 而後者則是先把任務寫好,然後再一次執行。
  • 兩者的關係就好比我們在 Linux Shell 裡打指令和先寫個 Shell Script 再執行一樣。

Ad-Hoc Commands

Ad hoc 拉丁文,通常用來形容為一個特定的問題或任務而專門設定的解決方案

Ad-Hoc Commands

  • 可以翻譯為 簡短地指令 / 指令操作模式
  • 以常見的 pingecho 操作為例。
  • Ad-Hoc commands 一次只能處理一件事情,這即是它與 Playbooks 最大的差異。
1
2
3
4
5
6
7
8
9
10
11
12
13
# - ping.
$ ansible all -m ping
server1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}


# - echo.
$ ansible all -m command -a "echo Hello World"
server1 | SUCCESS | rc=0 >>
Hello World

Playbooks

Playbook

  • 透過事先寫好的劇本 (Playbooks) 來讓各個 Managed Node 進行指定的 動作 (Plays)任務 (Tasks)
  • Playbooks 是 Ansible 的腳本 (Script),而且還是個比傳統 Shell Script 還強大數百倍的腳本

Screen Shot 2021-01-25 at 23.08.12

在一份 Playbook 中,可以有多個 Play、多個 Task 和多個 Module。

  • Play
    • 通常為某個特定的目的,
    • 例如:
      • Setup a official website with Drupal (藉由 Drupal 建置官網)
      • Restart the API service (重開 API 服務)
  • Task
    • 要實行 Play 這個目地所需做的每個步驟,
    • 例如:
      • Install the Nginx (安裝 Nginx)
      • Kill the djnago process (強制停止 django 的行程)
  • Module
    • Ansible 所提供的各種操作方法,
    • 例如:
      • apt: name=vim state=present (使用 apt 套件安裝 vim)
      • command: /sbin/shutdown -r now (使用 shutdown 的指令重新開機)

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#创建yml执行文件
vim copytest.yml

---
- hosts: hostname  # hosts中指定
  remote_user: root  # 如果和当前用户一样,则无需指定
  tasks:
      - name: copyfile   #建议每个任务指定一个name,方便出错时检查
        copy: src=/root/test.txt dest=root/test.txt  #  本地拷贝到远端
      - name: copyfile
        copy: src=~  dest=~
      - name: testshell
        shell: 'touch test.txt'
      - name: testshell2
        shell: 'touch test2.txt'      #遵循这样的格式

# playbook执行方法:
sudo ansible-playbook copytest.yml
#主机名、执行命令都已在yml中指定了。

Example

通过连接git仓库的方法,远端服务器将本机的bash配置文件分发给其他指定的服务器,并执行生效。

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
# 1.创建yml文件编写task,并上传到git仓库
vim Change_Profile.yml

- hosts: host
  remote_user: root
  tasks:
    - name: copyprofile
      copy: src=/root/.bash_profile dest=/root/.bash_profile owner=root mode=0600
    - name: runprofile
      shell: source /root/.bash_profile


# 2.编写shell脚本,交给远端服务器执行

# !bin/bash
mypath="User/root/itservercontrol"
if [ ! -d "$mypath"]; then
    git clone git@example.git #填写git仓库地址
    sudo ansible-playbook Change_Profile.yml
else
    cd itservercontrol
    git pull
    sudo ansible-playbook Change_Profile.yml
fi


# 3.向远端服务器发送本地编写的脚本,并执行
ansible hostname -m script -a "/root/itservertest.sh"

Example: Hello World Playbook

  • 建立一個 hello_world.yml 的檔案,並將 --- 開始的內容都寫進去。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    $ vi hello_world.yml
    ---
    
    - name: say 'hello world'
      hosts: all
      tasks:
    
        - name: echo 'hello world'
          command: echo 'hello world'
          register: result
    
        - name: print stdout
          debug:
            msg: ""
    
  • 執行 playbook:執行了 1 個 Play、3 個 Tasks 和 2 個 Modules。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    $ ansible-playbook hello_world.yml
    
    PLAY [say 'hello world'] *******************************************************
    
    TASK [setup] *******************************************************************
    ok: [server1]
    
    TASK [echo 'hello world'] ******************************************************
    changed: [server1]
    
    TASK [print stdout] ************************************************************
    ok: [server1] => {
        "msg": "hello world"
    }
    
    PLAY RECAP *********************************************************************
    server1                    : ok=3    changed=1    unreachable=0    failed=0
    

註:我們明明只在 hello_world.yml 裡寫了 2 個 tasks,可為什麼會出現 3 個 tasks 呢?這是因為 Ansible 預設會使用 setup task 來取得 managed node 的 facts。

沒有 Ansible 時,怎麼操作

  1. Shell (command line, cli, console)
1
2
3
4
5
6
7
8
9
10
11
# - ping.
$ ping -c 1 8.8.8.8
  # PING 8.8.8.8 (8.8.8.8): 56 data bytes
  # 64 bytes from 8.8.8.8: icmp_seq=0 ttl=44 time=10.022 ms
  # --- 8.8.8.8 ping statistics ---
  # 1 packets transmitted, 1 packets received, 0.0% packet loss
  # round-trip min/avg/max/stddev = 10.022/10.022/10.022/0.000 ms

# - echo.
$ echo Hello World
  # Hello World
  1. Shell Script
1
2
3
4
5
6
7
8
# - create script
vim hello_world.sh
#!/bin/bash
echo 'Hello World'

# - 執行。
$ bash hello_world.sh
  # Hello World

為什麼要寫 playbook

  1. 若有現成的 script,我們可以用 shell module 來執行它,這部份雖不衝突,但使用 shell module 會造成每次跑 playbook 都會重複執行,不像其它 module 執行過就不會再執行了。
  2. 用 Ansible 的 module 可以把很多雜亂的指令給標準化,
    • 例如不同的 Linux 發行版本在安裝套件時需代各種不同的參數。
  3. 在現有的 cloud native 的架構下,傳統的 Shell Script 已不符使用,
    • 一般而言 Shell Script 只能對一台機器 (instance) 進行操作。

.

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

Comments powered by Disqus.