1. ansible 簡(jiǎn)介
1.1 ansible 是什么?
ansible 基于python開(kāi)發(fā),集合了眾多的運(yùn)維工具(puppet, chef, func, fabric)的優(yōu)點(diǎn),實(shí)現(xiàn)批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。
ansible 是基于paramiko開(kāi)發(fā)的,基于模塊化工作,本身沒(méi)有批量部署的能力,真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只提供了一種框架。ansbile不需要在遠(yuǎn)程主機(jī)上安裝client/agents。
1.2 ansible 特點(diǎn)
默認(rèn)使用ssh協(xié)議對(duì)設(shè)置進(jìn)行管理;有大量常規(guī)運(yùn)維操作的模塊,可實(shí)現(xiàn)日常絕大部分的操作;支持API及自定義模塊,可通過(guò)python輕松擴(kuò)展;通過(guò)playbooks來(lái)定制強(qiáng)大的配置和狀態(tài)管理;輕量級(jí),無(wú)需在被控機(jī)上操作,更新時(shí),只需在操作機(jī)上進(jìn)行一次更新即可;提供了一個(gè)功能強(qiáng)大,操作性強(qiáng)的web管理界面和RESE API接口平臺(tái) —— AWX平臺(tái)。
1.ansible 架構(gòu)圖
Ansible:Ansible核心程序。HostInventory:記錄由Ansible管理的主機(jī)信息,包括端口、密碼、ip等。Playbooks:“劇本”YAML格式文件,多個(gè)任務(wù)定義在一個(gè)文件中,定義主機(jī)需要調(diào)用哪些模塊來(lái)完成的功能。CoreModules:核心模塊,主要操作是通過(guò)調(diào)用核心模塊來(lái)完成管理任務(wù)。CustomModules:自定義模塊,完成核心模塊無(wú)法完成的功能,支持多種語(yǔ)言。ConnectionPlugins:連接插件,Ansible和Host通信使用
2.ansible 任務(wù)執(zhí)行
2.1 ansible 任務(wù)執(zhí)行模式
ad-hoc 模式
使用單個(gè)模塊,支持批量執(zhí)行單條命令。ad-hoc命令是一種可以快速輸入的命令,而且不需要保存起來(lái)的命令。就相當(dāng)于bash中的一句話shell
playbook模式(劇本模式)
playbook通過(guò)多個(gè)task集合完成一類功能,如Web服務(wù)的安裝部署、數(shù)據(jù)庫(kù)服務(wù)器的批量備份等??梢院?jiǎn)單地把playbook理解為通過(guò)組合多條ad-hoc操作的配置文件。
2.2 ansible 任務(wù)執(zhí)行流程
簡(jiǎn)單理解就是Ansible在運(yùn)行時(shí),首先讀取ansible.cfg中的配置,根據(jù)規(guī)則獲取Inventory中的管理主機(jī)列表, 并行的在這些主機(jī)中執(zhí)行配置的任務(wù), 最后等待執(zhí)行返回的結(jié)果。
2.3 ansible 命令執(zhí)行過(guò)程
加載自己的配置文件,默認(rèn)/etc/ansible/ansible.cfg;查找對(duì)應(yīng)的主機(jī)配置文件,找到要執(zhí)行的主機(jī)或者組;加載自己對(duì)應(yīng)的模塊文件,如 command;通過(guò)ansible將模塊或命令生成對(duì)應(yīng)的臨時(shí)py文件(python腳本),并將該文件傳輸至遠(yuǎn)程服務(wù)器;對(duì)應(yīng)執(zhí)行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件;給文件 +x 執(zhí)行權(quán)限;執(zhí)行并返回結(jié)果;刪除臨時(shí)py文件,sleep 0退出;
3.ansible 配置
3.1 ansible 安裝方式
pip 安裝pip install ansible
yum 安裝yum
install epel-
release -y
yum
install ansible -y
3.2 ansible 程序結(jié)構(gòu)
安裝目錄如下(yum安裝):
配置文件目錄:/etc/ansible/
執(zhí)行文件目錄:/usr/bin/
Lib庫(kù)依賴目錄:
/usr/lib/pythonX.X/site-packages/ansible/
Help文檔目錄:
/usr/share/doc/ansible-X.X.X/
Man文檔目錄:/usr/share/man/man1/
3.3 ansible 配置文件查找順序
檢查環(huán)境變量ANSIBLE_CONFIG指向的路徑文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);~/.ansible.cfg 檢查當(dāng)前目錄下的ansible.cfg配置文件;/etc/ansible.cfg 檢查etc目錄的配置文件。
3.4 ansible 配置文件常用參數(shù)
inventory = /etc/ansible/hosts
#這個(gè)參數(shù)表示資源清單inventory文件的位置
library = /usr/share/ansible
#指向存放Ansible模塊的目錄,支持多個(gè)目錄方式,只要用冒號(hào)(:)隔開(kāi)就可以
forks =
5 #并發(fā)連接數(shù),默認(rèn)為5
sudo_user = root
#設(shè)置默認(rèn)執(zhí)行命令的用戶
remote_port =
22 #指定連接被管節(jié)點(diǎn)的管理端口,默認(rèn)為22端口,建議修改,能夠更加安全
host_key_checking =
False #設(shè)置是否檢查SSH主機(jī)的密鑰,值為True/False。關(guān)閉后第一次連接不會(huì)提示配置實(shí)例
timeout =
60 #設(shè)置SSH連接的超時(shí)時(shí)間,單位為秒
log_path = /var/log/ansible.log
#指定一個(gè)存儲(chǔ)ansible日志的文件(默認(rèn)不記錄日志)
3.5 ansible 命令集
/usr/bin/ansible Ansibe AD-Hoc 臨時(shí)命令執(zhí)行工具,常用于臨時(shí)命令的執(zhí)行
/usr/bin/ansible-doc Ansible 模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優(yōu)秀代碼或Roles模塊 的官網(wǎng)平臺(tái),基于網(wǎng)絡(luò)的
/usr/bin/ansible-playbook Ansible 定制自動(dòng)化的任務(wù)集編排工具
/usr/bin/ansible-pull Ansible遠(yuǎn)程執(zhí)行命令的工具,拉取配置而非推送配置(使用較少,海量機(jī)器時(shí)使用,對(duì)運(yùn)維的架構(gòu)能力要求較高)
/usr/bin/ansible-vault Ansible 文件加密工具
/usr/bin/ansible-
console Ansible基于Linux Consoble界面可與用戶交互的命令執(zhí)行工具
3.6 ansible 常用模塊
ansible web -m ping 主機(jī)連通性測(cè)試
command 模塊
直接在遠(yuǎn)程主機(jī)上執(zhí)行命令,并將結(jié)果返回本主機(jī)
eg: ansible web -m command -a ss -ntl
該模塊常用命令
chdir # 在執(zhí)行命令之前,先切換到該目錄
executable
# 切換shell來(lái)執(zhí)行命令,需要使用命令的絕對(duì)路徑
free_form
# 要執(zhí)行的Linux指令,一般使用Ansible的-a參數(shù)代替。
creates
# 一個(gè)文件名,當(dāng)這個(gè)文件存在,則該命令不執(zhí)行,可以用來(lái)做判斷
removes
# 一個(gè)文件名,這個(gè)文件不存在,則該命令不執(zhí)行
shell 模塊
shell模塊可以在遠(yuǎn)程主機(jī)上調(diào)用shell解釋器運(yùn)行命令,支持shell的各種功能,例如管道等
copy 模塊
這個(gè)模塊用于將文件復(fù)制到遠(yuǎn)程主機(jī),同時(shí)支持給定內(nèi)容生成文件和修改權(quán)限等
file 模塊
該模塊主要用于設(shè)置文件的屬性,比如創(chuàng)建文件、創(chuàng)建鏈接文件、刪除文件等
fetch 模塊
該模塊用于從遠(yuǎn)程某主機(jī)獲取(復(fù)制)文件到本地。
cron 模塊
該模塊適用于管理cron計(jì)劃任務(wù)的。其使用的語(yǔ)法跟我們的crontab文件中的語(yǔ)法一致
yum 模塊
主要用于軟件的安裝
service 模塊
該模塊用于服務(wù)程序的管理
user 模塊
該模塊主要是用來(lái)管理用戶賬號(hào)
group 模塊
該模塊主要用于添加或刪除組
script 模塊
該模塊用于將本機(jī)的腳本在被管理端的機(jī)器上運(yùn)行
setup 模塊
該模塊主要用于收集信息,是通過(guò)調(diào)用facts組件來(lái)實(shí)現(xiàn)的。
facts組件是Ansible用于采集被管機(jī)器設(shè)備信息的一個(gè)功能,我們可以使用setup模塊查機(jī)器的所有facts信息,可以使用filter來(lái)查看指定信息。整個(gè)facts信息被包裝在一個(gè)JSON格式的數(shù)據(jù)結(jié)構(gòu)中,ansible_facts是最上層的值。
facts就是變量,內(nèi)建變量。每個(gè)主機(jī)的各種信息,cpu顆數(shù)、內(nèi)存大小等。會(huì)存在facts中的某個(gè)變量中。調(diào)用后返回很多對(duì)應(yīng)主機(jī)的信息,在后面的操作中可以根據(jù)不同的信息來(lái)做不同的操作。如redhat系列用yum安裝,而debian系列用apt來(lái)安裝軟件。
4.ansible playbook
4.1 playbook簡(jiǎn)介
用戶通過(guò)ansible命令直接調(diào)用yml語(yǔ)言寫(xiě)好的playbook,playbook由多條play組成,每條play都有一個(gè)任務(wù)(task)相對(duì)應(yīng)的操作,然后調(diào)用模塊modules,應(yīng)用在主機(jī)清單上,通過(guò)ssh遠(yuǎn)程連接,從而控制遠(yuǎn)程主機(jī)或者網(wǎng)絡(luò)設(shè)備
4.2 playbook核心元素
Hosts 執(zhí)行的遠(yuǎn)程主機(jī)列表(應(yīng)用在哪些主機(jī)上)
Tasks 任務(wù)集
Variables 內(nèi)置變量或自定義變量在playbook中調(diào)用
Templates模板 可替換模板文件中的變量并實(shí)現(xiàn)一些簡(jiǎn)單邏輯的文件
Handlers和notify結(jié)合使用,由特定條件觸發(fā)的操作,滿足條件方才執(zhí)行,否則不執(zhí)行
tags標(biāo)簽 指定某條任務(wù)執(zhí)行,用于選擇運(yùn)行playbook中的部分代碼。
ansible具有冪等性,因此會(huì)自動(dòng)跳過(guò)沒(méi)有變化的部分,
即便如此,有些代碼為測(cè)試其確實(shí)沒(méi)有發(fā)生變化的時(shí)間依然會(huì)非常地長(zhǎng)。
此時(shí),如果確信其沒(méi)有變化,就可以通過(guò)tags跳過(guò)此些代碼片斷
ansible-playbook -t tagsname useradd.yml
4.3 playbook
變量定義vars:
key1=
value1
key2=
value2
條件測(cè)試- hosts: mysql
remote_user: root
tasks:
- name: "shut down Centos 7 systems"
command: /sbin/shutdown -r now
when:
- ansible_distribution == "Centos”
- ansible_distribution_major_version =="7"
迭代- hosts: webserver
remote_user: root
tasks:
- name:
"Add users"
user: name={{ item.name }}
state=present groups={{ item.groups }}
with_items:
- { name:
test1, groups:
wheel}
{ name:
test2, groups:
root}
Templates 模塊
模板,即使用模板語(yǔ)法的文件
tags 模塊
在一個(gè)playbook中,我們一般會(huì)定義很多個(gè)task,如果我們只想執(zhí)行其中的某一個(gè)task或多個(gè)task時(shí)就可以使用tags標(biāo)簽功能了
- hosts: webserver
remote_user: root
tasks:
- name: copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- only
- name: touch file
file: path=/opt/hosts01 state=touch
執(zhí)行命令:ansible-plavbook hosts.vml --tags="only"
4.4 roles
roles能夠根瓶層次型結(jié)構(gòu)自動(dòng)裝載變量文件、task以及handlers等。簡(jiǎn)單來(lái)講,roles就是通過(guò)分別將變量、文件、任務(wù)、模塊等置于單獨(dú)的目錄中,并可以快速地include它們,roles一直用于基于主機(jī)構(gòu)建
4.5 roles 目錄結(jié)構(gòu)及說(shuō)明
files:用來(lái)存放由copy模塊或script模塊調(diào)用的文件。
templates:用來(lái)存放jinjia2模板,template模塊會(huì)自動(dòng)在此目錄中尋找jinjia2模板文件。
tasks:此目錄應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色的任務(wù)列表,此文件可以使用include包含其它的位于此目錄的task文件。
handlers:此目錄應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色中觸發(fā)條件時(shí)執(zhí)行的動(dòng)作。
vars:此目錄應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色用到的變量。
defaults:此目錄應(yīng)當(dāng)包含一個(gè)main.yml文件,用于為當(dāng)前角色設(shè)定默認(rèn)變量。
meta:此目錄應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色的特殊設(shè)定及其依賴關(guān)系。
5.ansible UI管理工具awx安裝實(shí)踐
5.1 簡(jiǎn)介
AWX提供了一個(gè)基于web的用戶界面、REST API和構(gòu)建在Ansible之上的任務(wù)引擎。圖形化的AWX能夠更方便的編排和部署 Ansible Playbook,并提供集中的日志記錄、審計(jì)和系統(tǒng)跟蹤。
AWX是商業(yè)版Ansible Tower 的開(kāi)源版本。
5.2 安裝awx項(xiàng)目(前提是ansible及docker安裝配置完成)
下載awx包并解壓[root@client ~]
# wget https://github.com/ansible/awx/archive/14.1.0.tar.gz
[root@client ~]
# cd awx-14.1.0/installer/
[root@client installer]
# ls
build.yml install.yml inventory role
查看python3的工作路徑并修改inventory文件[root@client installer]# which python3
/usr/bin/python3
[root@client installer]# sed -i.bak s/env python/python/g inventory
[root@client installer]# ll
總用量 24
-rw-rw-r--. 1 root root 166 8月 25 12:12 build.yml
-rw-rw-r--. 1 root root 437 8月 25 12:12 install.yml
-rw-rw-r--. 1 root root 7340 9月 21 02:03 inventory
-rw-rw-r--. 1 root root 7344 8月 25 12:12 inventory.bak
drwxrwxr-x. 7 root root 99 8月 25 12:12 roles
下載鏡像[root@client installer]
# docker pull redis:latest
[root@client installer]
# docker pull postgres:10
[root@client installer]
# docker pull ansible/awx:14.1.0
[root@client ~]
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres
10 7849072676e1 3 days ago
200MB
redis latest
84c5f6e03bf0
10 days ago
104MB
ansible/awx
14.1.0 8a29b4e35f5f
3 weeks ago
1.3GB
[root@client installer]
# ansible-playbook -i inventory install.yml
容器查看[root@client installer]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3ccad7afb02 ansible/awx:14.1.0 "/usr/bin/tini -- /u…" 52 minutes ago Up 19 minutes 8052/tcp awx_task
64989076d24a ansible/awx:14.1.0 "/usr/bin/tini -- /b…" 52 minutes ago Up 19 minutes 0.0.0.0:80->8052/tcp awx_web
c4a3e5c4b507 postgres:10 "docker-entrypoint.s…" 52 minutes ago Up 19 minutes 5432/tcp awx_postgres
0dec66f07a43 redis "docker-entrypoint.s…" 52 minutes ago Up 19 minutes 6379/tcp awx_redis
登錄awx登陸地址: http:
//192.168.0.200
賬號(hào):admin
密碼:password
awx 圖形界面展示