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"