Ansible-自動化運維工具 ansible簡介 ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量運行命令等功能。 ansible是基於模塊工作的,本身沒有批量部署能力, ...
Ansible-自動化運維工具
ansible簡介
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量運行命令等功能。
ansible是基於模塊工作的,本身沒有批量部署能力,真正具有批量部署的是ansible所運行的模塊。
ansible的特性
部署簡單,只需在主控端部署ansible環境,被控端無需做任何操作;
預設使用SSH協議對設備進行管理;
有大量常規運維操作模塊,可實現日常絕大部分操作;
配置簡單、功能強大、擴展性強;
有Paramiko,PyYAML,Jinja2三個關鍵模塊;
支持API及自定義模塊,可通過Python輕鬆擴展;
通過Playbooks來定製強大的配置、狀態管理;
可使用任何編程語言寫模塊;
輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
提供一個功能強大、操作性強的web管理界面和REST API介面--AWX平臺
ansible架構圖
Ansible:ansible核心程式
Host Inventory:記錄由ansible管理的主機信息,包括埠、密碼、ip等
Play books:“劇本”YAML格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能
Core Modules:核心模塊,主要操作是通過調用核心模塊來完成管理任務
Custom Modules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言
Plugins:插件,實現記錄日誌,發送郵件等功能
Connection Plugins:連接插件,ansible和host通信使用,預設ssh連接
ansible工作原理
ansible任務執行模式
ansible系統由控制主機對被控節點的操作可分為兩類,即adhoc和playbook
ad-hoc模式(點對點模式)
使用單個模塊,支持批量執行單條命令。ad-hoc命令是一種可以快速輸入的命令,而且不需要保存起來的命令
playbook模式(劇本模式)
是ansible主要管理方式,也是ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如web服務的安裝部署、資料庫伺服器的批量備份等
ansible執行流程
ansible命令執行過程
1、載入自己的配置文件,預設 /etc/ansible/ansible.cfg
2、查找對應的主機配置文件,找到要執行的主機或者組
3、載入自己對應的模塊文件
4、通過ansible將模塊或命令生成對應的臨時python文件,並將該文件傳輸至遠程伺服器
5、對應執行用戶的家目錄的文件
6、給文件+x執行許可權
7、執行並返回結果
8、刪除臨時python文件,sleep 0 退出
ansible常用命令
ansible命令集
/usr/bin/ansible 臨時命令執行工具
/usr/bin/ansible-doc 模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定製自動化的任務集編排工具
/usr/bin/ansible-pull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 可與用戶交互的命令執行工具
ansible命令使用
命令格式
# ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-a 模塊的參數
-k 登陸密碼
-c 連接類型使用
-m 執行模塊的名字
-o 壓縮輸出
-R 指定用戶
ansible配置
準備至少兩台機器,一臺主控機器,其餘的為被控機器
ansible安裝
在主控機器上安裝ansible
# yum install -y ansible
生成密鑰對
# ssh-keygen
設置密鑰認證
# ssh-copy-id root@ip
配置主機清單
# vi /etc/ansible/hosts
[web] ##主機組名
192.168.37.16
192.168.37.17
ansible常用模塊
主機連通性測試
# ansible web -m ping
確認主機是連通狀態
command模塊
該模塊可以直接在遠程主機上執行命令,並將結果返回本主機
模塊常用選項
chdir 在執行命令之前,先切換到該目錄
executable 切換shell來執行命令,需要使用命令的絕對路徑
free_form 要執行的Linux指令
creates 一個文件名,當這個文件存在,則該命令不執行
removes 一個文件名,當這個文件不存在,則該命令不執行
copy模塊
該模塊用於將文件複製到遠程主機,同時支持給定內容生成文件和修改許可權等
常用選項
src 被覆制到遠程主機的本地文件
content 用於替換“src”,可以直接指定文件的值
dest 將源文件複製到的遠程主機的絕對路徑
backup 當文件內容發生改變後,再覆蓋之前把源文件備份
directory_mode 遞歸設定目錄的許可權
file模塊
該模塊主要用於設置文件的屬性,如創建文件、創建鏈接文件、刪除文件等
常用選項
group 定義文件目錄的屬組,後面可以加上mode:定義文件目錄的許可權
owner 定義文件目錄的屬主,後面必須加上path:定義文件目錄的路徑
recurse 遞歸設置文件的屬性,只對目錄有效
dest 被鏈接到的路徑
state 狀態,有以下選項
directory 如果目錄不存在,就創建目錄
file 即使文件不存在,也不會被創建
link 創建軟鏈接
hard 創建硬鏈接
touch 如果文件不存在,則創建一個新文件,如果文件存在,則更新最後修改時間
absent 刪除目錄、文件或者取消鏈接文件
fetch模塊
該模塊用於從遠程某主機獲取文件到本地
選項
dest 用來存放文件的目錄
src 在遠程拉取的文件
yum模塊
該模塊主要用於軟體的安裝
常用選項
name= 所安裝的包的名字
update_cache 強制更新yum的緩存
conf_file 指定遠程yum安裝時所依賴的配置文件
state= 狀態,有以下選項
present 安裝
latest 安裝最新的
absent 卸載軟體
service模塊
該模塊用於服務程式的管理
常用選項
arguments 命令行提供額外的參數
enabled 設置開機啟動
name= 服務名稱
runlevel 開機啟動的級別
sleep 在重啟服務的過程中,是否等待
state 狀態,有以下選項
started 啟動服務
stopped 停止服務
restarted 重啟服務
reloaded 重載配置
user模塊
該模塊主要用來管理用戶賬號
常用選項
comment 用戶的描述信息
createhome 是否創建家目錄
force 在使用state=absent時,行為與userdel-force一致
group 指定基本組
groups 指定附加組
home 指定用戶家目錄
name 指定用戶名
non_unique 允許改變非唯一的用戶ID值
password 指定用戶密碼
state 設置賬號狀態
system 當創建一個用戶,設置這個用戶時系統用戶
uid 指定用戶的uid
group模塊
該模塊主要用於添加或刪除組
常用選項
gid= 設置組的gid號
name= 指定組的名稱
state= 指定組的狀態
system= 設置值為yes,表示創建為系統組
Ansible playbook
簡介
playbook是ansible用於配置、部署和管理被控節點的劇本。通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀態
使用場景
使用playbook可以方便的重用這些代碼,可以移植到不同的機器上面,最大化的利用代碼
格式
playbook由YMAL語言編寫
1、文件的第一行應該以“---”(三個連字元)開始,表明YAML文件的開始
2、在同一行中,#之後的內容表示註釋
3、YAML中的列表元素以“-”開頭然後緊跟著一個空格,後面為元素內容
4、同一個列表中的元素應該保持相同的縮進,否則會被當做錯誤處理
5、playbook中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以“:”分隔表示,“:”後面還要增加一個空格
文件名稱應該以 .yml 結尾,由三個部分組成
host部分:使用hosts指示使用哪個主機或主機組來運行下麵的tasks,每個playbook都必須指定hosts,hosts也可以使用通配符格式
remote_user:指定遠端主機中的哪個用戶來登錄遠端系統,在遠端系統執行tasks的用戶,可以任意指定,也可以使用sudo,但是用戶必須要有執行相應task的許可權
tasks:指定遠端主機將要執行的一系列動作。tasks的核心為ansible的模塊,tasks包含name和要執行的模塊
核心元素
playbook的核心元素
Hosts:主機組
Tasks:任務列表
Variables:變數,設置方法有四種
Templates:包含了模板語法的文本文件
Handlers:由特定條件觸發的任務
playbook實戰-nginx安裝
先在主控機器上安裝並編譯好nginx
進入ansible配置文件目錄
# cd /etc/ansible
創建目錄
# mkdir nginx.install
# cd nginx.install
# mkdir -p roles/{common.install}/{handlers,files,meta,tasks,templates,vars}
## roles目錄下由兩個角色,common為一些準備操作,install為安裝nginx的操作。每個角色下又有幾個目錄,handlers下麵是當發生改變時要執行的操作,通常用在配置文件發生改變,重啟服務。files為安裝時用到的一些文件,meta為說明信息,說明角色依賴等信息,tasks裡面是核心的配置文件,templates通常存一些配置文件,啟動腳本等模板文件,vars下為定義的變數
將nginx目錄打包,放到/etc/ansible/nginx_install/roles/install/files/下麵並重命名
# mv /etc/local/sbin/nginx /etc/ansible/nginx_install/roles/install/files/nginx.tar.gz
啟動腳本和配置文件也移動到/etc/ansible/nginx_install/roles/install/templates/下麵
定義依賴包
# cd /ect/ansible/nginx.install/roles
# vi common/tasks/main.yml
- name: Install initializtion require software
yum: name={{ item }} state=installed
with_items:
- zlib-devel
- pcre-devel
定義變數
# vi install/vars/main.yml
nginx_user: www
nginx_port: 80
nginx_basedir: /usr/local/nginx
拷貝文件
# vi install/tasks/copy.yml
- name: Copy Nginx Software
copy: src=nginx dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompression Nginx Software
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Start Script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: Copy Nginx Config
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644
建立用戶,啟動服務,刪除壓縮包
# vi install/tasks/install.yml
- name: Create Nginx User
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Create Nginx Service
shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service
shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files
shell: rm -rf /tmp/nginx.tar.gz
調用文件
# vi install/tasks/main.yml
- include: copy.yml
- include: install.yml
定義入口文件
# vi /etc/ansible/nginx_install/install.yml
---
- hosts: testhost
remote_user: root
gather_facts: Ture
roles:
- common
- install
執行
# ansible-playbook /etc/ansible/nginx_install/install.yml