Ansible 快速入門

又拍雲發表於2021-07-06

Ansible 是什麼?

Ansible是一個配置管理和配置工具,它使用SSH連線到伺服器並執行配置好的任務,伺服器上只需要開啟ssh,所有工作都交給client端的ansible負責。

當我們有批量部署的需求時,我們可以自己寫指令碼,但是更推薦使用 Ansible。使用 Ansible 無需編碼只需要配置 yaml 檔案即可,並且 Ansible 已經內建了冪等性、併發度控制等功能,大大減少了批量部署時的工作量。

Ansible 原理示意圖如上,我們需要關注以下 3 點就能掌握 Ansible 的大致原理。第一,hosts 配置檔案的作用是告訴 Ansible 你的程式要部署到哪些機器;第二,yaml 檔案的作用是告訴 Ansible 在目標機器上執行哪些操作。第三,Ansible 不需要在目標機器上安裝客戶端,它通過 SSH 把指令和要部署的程式傳送到目標機器上。

安裝 Ansile

安裝命令:

python3 -m pip install --user ansible==2.5.4

驗證安裝是否正確:

ansible --version

配置 Ansible

  • 配置 .ansible.cfg 檔案

.ansible.cfg 的路徑:~/.ansible.cfg

將以下內容寫入 .ansible.cfg 檔案:

[defaults]
# inventory 是宣告 hosts 配置檔案
inventory=~/.ansible/hosts
  • SSH 使用金鑰登入伺服器

設定 SSH 通過金鑰登入。使用 ssh-keygen 命令生成金鑰對,把 id_rsa.pub 寫入目標伺服器的 authorized_keys 檔案中。

  • 編輯 hosts 檔案

hosts 配置檔案的格式是 ini。示例如下

# serviceA 是叢集名稱
[serviceA]
# 列舉 serviceA 叢集的 ip 地址
192.168.33.10

編輯 YAML 檔案

告訴 Ansible 在目標機器上執行哪些操作的 YAML 檔案,Ansible 把這類檔案稱為 “playbook”。

下面我們一起編寫一個為名 hello.yml 的 playbook。這個 playbook 的作用是把 helloworld 檔案傳送到 serviceA 叢集。

# hosts 是要部署服務的叢集
- hosts: serviceA
# remote_user 是以 root 使用者登入遠端機器
  remote_user: root
# vars 是定義一些變數。這些變數可以在接下來的 tasks 中使用。
  vars:
     src: /Users/yutou/mywork/ansible-playbook
# tasks 是在遠端機器上具體的執行動作。
  tasks:
      # name 是該動作的名稱
      - name: upload helloworld
        # copy 是要具體執行的動作。copy 是 Ansible 模組,它的作用是把本地檔案上傳到目標機器上去。
        # {{ src }} 是 Jinja2 模板語法,Jinja2 模板語法不懂的話可自行百度。
        copy: src={{ src }}/helloworld dest=/home

釋出


ansible-playbook hello.yml

Ansible playbook 常用模組

ansible 很多模組都可以做到 “見其名,知其意”,很多模組都是對 Linux 命令的模仿或者封裝,更多模組可參見官方文件。下面我們先挑幾個模組簡單介紹一下:

  • synchronize,copy,unarchive 都可以上傳檔案。

  • ping:檢查指定節點機器是否還能連通。主機如果線上,則回覆pong。

  • yum, apt:這兩個模組都是在遠端系統上安裝包的。

  • pip:遠端機器上 python 安裝包。

  • user,group:使用者管理的。

  • service:管理服務的,類似於 centos7 上的 service。

template 模組和在遠端機器上執行 Linux 命令的模組是非常重點的模組,所以接下來重點介紹一下。

Ansible playbook 常用模組

配置檔案的一個特點是每個機器上的檔案都不一樣,都需要一些個性化配置,比如 A 機器配置 “hello world”,B 機器配置 “hello Liming”。這種需求就需要 template 模組實現。

template 模組使用 Jinja2 語法對模板檔案進行渲染,然後把渲染後的檔案上傳到目標機器。渲染時用到的變數可以從 3 個地方讀取到:

  • ansible 內建變數;

  • hosts 檔案中定義的變數,如上所示;

  • 在 playbook 中 vars 定義的變數。

舉例,模板檔案 hello_x,內容如下:

hello {{ name }}

hosts 檔案配置如下:


[serviceA]
192.168.33.10 name=world
192.168.33.11 name=Liming

在 playbook hello_x.yml 中配置如下:


  tasks:
      - name: upload helloworld
        template: src={{ src }}/hello_x dest=/home

執行 ansible-playbook hello_x.yml 後,192.168.33.10 上 /home/hello_x 檔案的內容就是 hello world, 192.168.33.11 上則是 hello Liming

在遠端機器上執行 Linux 命令

raw, command,shell 這三個模組都以用來在遠端機器上執行 Linux 命令。三種區別大致區別如下:

  • 一般情況下使用 command

  • 命令中有特殊字元使用 shell

  • raw 是直接執行原始命令,沒有經過模組封裝,不建議用。

注意命令的內容一般使用 "" 引起來,否則模板渲染的時候可能報錯:


    - name: start datanode
      command: "/hadoop-2.7.5/sbin/hadoop-daemon.sh start datanode"