Ansible 系列:html
- (一):快速上手 Ansible
- (二):Ansible 命令
- (三):Ansible 主機清單配置文件
- (四):Ansible Playbook 劇本語法
Ansible 是 Paramiko 開發的一種自動化運維工具,基於模塊化工做,集合了衆多運維工具的優勢,實現了批量系統配置,批量程序部署、批量運行命令等功能。python
Ansible 它自己沒有批量部署的能力,真正執行這些操做的是 Ansible 的模塊,它只是提供了一種框架。直到目前爲止,Ansible 已有 800 多個模塊可使用。ios
Ansible 的另外一個優點在於,它不須要在遠程主機上安裝任何東西,由於它是基於 SSH 來和遠程主機進行通訊的。git
在 Ansible 裏,有兩種角色 Control Machine 與 Managed Node,它們經過 SSH 和 Python 進行溝通:github
在通常狀況下,咱們只需在 Control Machine 裏安裝 Ansible 便可,由於 Linux 和 macOS 系統早已預載了 Python 2.5 以上的版本,且支持 SSH 鏈接。shell
而使用 Ansible 來管理 Window 的話,則須要較多的設置(此處不介紹,可自尋谷歌/百度)。vim
# 請先安裝 homebrew,已安裝者請略過
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 安裝 Ansible
brew install ansible
複製代碼
CentOS(Yum)ruby
# 新增 epel-release 第三方套件來源。
sudo yum install -y epel-release
# 安裝 Ansible
sudo yum install -y ansible
複製代碼
Ubuntu(Apt)bash
# 安裝 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
複製代碼
# 一、首先安裝 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
複製代碼
在安裝 Ansible 以後,你能夠訪問如下 Ansible 文件:框架
第一種方式是經過向 Ansible 發送 Ad-Hoc Commands(指令)來操做 Managed Node。
以常見的 ping
和 echo
操做爲例:
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
複製代碼
另一種方式即經過 Playbook (劇本)讓各個 Managed Node 進行指定的動做(Plays)和任務(Tasks),你能夠理解爲 Shell Script。
Playbook 支持兩種寫法 :
在一份 Playbook 中,能夠有多個 Play、Task 與 Module:
下面是一個 Hello World 的 Playbook 劇本,劇本後綴名應爲 .yml:
- name: say 'hello world'
hosts: all
tasks:
- name: echo 'hello world'
command: echo 'hello world'
register: result
- name: print stdout
debug:
msg: ""
複製代碼
執行劇本
ansible-playbook hello_world.yml
複製代碼
模塊是 Ansible 的核心,也是操做真正的執行者,只要掌握瞭如何使用模塊就能夠快速上手 Ansible,其他都只是延伸使用罷了。
例如咱們常常使用的 Command Modules 模塊,你能夠進入 Ansible 的 Module 幫助文檔中找到它的使用文檔。
文檔中 Options 選項表會列出模塊參數,參數的預設值等信息。
在使用 Playbook 時,Ansible 會自動執行 Setup Modules 以收集各個 Managed Node 的 facts(系統信息),如 IP、做業系統、CPU 信息等。
咱們也能夠經過 Ad-Hoc Commands 指令模式使用 setup,例如:
ansible all -m setup | less
--- 結果以下
server1 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.19.0.2"
],
"ansible_all_ipv6_addresses": [
"fe80::42:acff:fe13:2"
],
"ansible_architecture": "x86_64",
"ansible_bios_date": "03/14/2014",
:
複製代碼
經過 filter
參數還能夠過濾結果
ansible all -m setup -a "filter=ansible_distribution*"
--- 結果以下
server1 | SUCCESS => {
"ansible_facts": {
"ansible_distribution": "Ubuntu",
"ansible_distribution_major_version": "14",
"ansible_distribution_release": "trusty",
"ansible_distribution_version": "14.04"
},
"changed": false
}
複製代碼
一般在 Playbook 中咱們會將主機信息結合條件判斷 when
使用,例以下面針對 Debian, Ubuntu, CentOS 安裝 Vim 的 playbook:
- name: Setup the vim
hosts: all
become: true
tasks:
# Debian, Ubuntu.
- name: install apt packages
apt: name=vim state=present
when: ansible_pkg_mgr == "apt"
# CentOS.
- name: install yum packages
yum: name=vim-minimal state=present
when: ansible_pkg_mgr == "yum"
複製代碼