企业级自动化运维工具应用实战-ansible
背景
公司計(jì)劃在年底做一次大型市場(chǎng)促銷活動(dòng),全面沖刺下交易額,為明年的上市做準(zhǔn)備。公司要求各業(yè)務(wù)組對(duì)年底大促做準(zhǔn)備,運(yùn)維部要求所有業(yè)務(wù)容量進(jìn)行三倍的擴(kuò)容,并搭建出多套環(huán)境可以共開發(fā)和測(cè)試人員做測(cè)試,運(yùn)維老大為了在年底有所表現(xiàn),要求運(yùn)維部門同學(xué)盡快實(shí)現(xiàn),當(dāng)你接到這個(gè)任務(wù)時(shí),有沒有更快的解決方式?
技術(shù)說明
隨著信息時(shí)代的持續(xù)發(fā)展,IT運(yùn)維已經(jīng)成為IT服務(wù)內(nèi)涵中重要的組成部分。面對(duì)越來越復(fù)雜的業(yè)務(wù),面對(duì)越來越多樣化的用戶需求,不斷擴(kuò)展的IT應(yīng)用需要越來越合理的模式來保障IT服務(wù)能靈活便捷、安全穩(wěn)定地持續(xù)保障,這種模式中的保障因素就是IT運(yùn)維(其他因素是更加優(yōu)越的IT架構(gòu)等)。從初期的幾臺(tái)服務(wù)器發(fā)展到龐大的數(shù)據(jù)中心,單靠人工已經(jīng)無法滿足在技術(shù)、業(yè)務(wù)、管理等方面的要求,那么標(biāo)準(zhǔn)化、自動(dòng)化、架構(gòu)優(yōu)化、過程優(yōu)化等降低IT服務(wù)成本的因素越來越被人們所重視。其中,自動(dòng)化最開始作為代替人工操作為出發(fā)點(diǎn)的訴求被廣泛研究和應(yīng)用。IT運(yùn)維從誕生發(fā)展至今,自動(dòng)化作為其重要屬性之一已經(jīng)不僅僅只是代替人工操作,更重要的是深層探知和全局分析,關(guān)注的是在當(dāng)前條件下如何實(shí)現(xiàn)性能與服務(wù)最優(yōu)化,同時(shí)保障投資收益最大化。自動(dòng)化對(duì)IT運(yùn)維的影響,已經(jīng)不僅僅是人與設(shè)備之間的關(guān)系,已經(jīng)發(fā)展到了面向客戶服務(wù)驅(qū)動(dòng)IT運(yùn)維決策的層面,IT運(yùn)維團(tuán)隊(duì)的構(gòu)成,也從各級(jí)技術(shù)人員占大多數(shù)發(fā)展到業(yè)務(wù)人員甚至用戶占大多數(shù)的局面。
因此,IT運(yùn)維自動(dòng)化是一組將靜態(tài)的設(shè)備結(jié)構(gòu)轉(zhuǎn)化為根據(jù)IT服務(wù)需求動(dòng)態(tài)彈性響應(yīng)的策略,目的就是實(shí)現(xiàn)IT運(yùn)維的質(zhì)量,降低成本??梢哉f自動(dòng)化運(yùn)維一定是IT運(yùn)維高層面的重要屬性之一。
項(xiàng)目上線過程
場(chǎng)景說明
目前多數(shù)公司遇到的運(yùn)維問題現(xiàn)狀:
1、硬件選型多樣化
2、系統(tǒng)多版本并存
3、目錄結(jié)構(gòu)混亂
4、運(yùn)維人員水平參差不齊
5、歷史遺留問題多
6、同一軟件出現(xiàn)多個(gè)版本
7、無法批量化操作
8、工作效率低,故障率高
9、項(xiàng)目上線操作繁瑣
理想狀態(tài)下的運(yùn)維部門:
1、只有少數(shù)類型的硬件,便于管理
2、系統(tǒng)版本統(tǒng)一
3、目錄結(jié)構(gòu)規(guī)范
4、運(yùn)維工程師水平層次高
5、無歷史包袱
6、同一軟件只有單一版本
7、同一類操作可自動(dòng)化批量執(zhí)行
8、工作效率高,無大量重復(fù)機(jī)械化操作
9、開發(fā)自己上線,運(yùn)維比較輕松
日常運(yùn)維工作中的重要事件:
1、添加監(jiān)控,收集系統(tǒng)指標(biāo)
2、對(duì)日志進(jìn)行歸檔以及管理
3、數(shù)據(jù)備份于恢復(fù)
4、對(duì)計(jì)劃任務(wù)進(jìn)行管理
5、對(duì)軟件包進(jìn)行部署和管理
6、對(duì)腳本進(jìn)行批量執(zhí)行
7、對(duì)文件進(jìn)行批量復(fù)制和移動(dòng)
8、設(shè)置文件或者目錄對(duì)應(yīng)的權(quán)限
9、關(guān)閉和啟動(dòng)服務(wù)
10、對(duì)代碼程序進(jìn)行上下線
技術(shù)說明
所謂的運(yùn)維自動(dòng)化實(shí)際上就是某些運(yùn)維過程的自動(dòng)化,比如初始化自動(dòng)化、測(cè)試/部署自動(dòng)化,加監(jiān)控自動(dòng)化,簡(jiǎn)單報(bào)警處理自動(dòng)化,業(yè)務(wù)降級(jí)/恢復(fù)自動(dòng)化....集腋成裘,慢慢的讓系統(tǒng)可以承擔(dān)更多的重復(fù)勞動(dòng),減少人力投入和學(xué)習(xí)成本。
自動(dòng)化運(yùn)維常用工具
|
工具 |
用途 |
|
|
安裝系統(tǒng) |
pxe/cobber |
安裝系統(tǒng) |
|
虛擬化系統(tǒng) |
kvm/xen/vmware |
虛擬機(jī) |
|
應(yīng)用部署 |
puppet/ansible/saltstack |
中大型規(guī)模 |
|
命令執(zhí)行 |
ansible/fabric/func |
中小型規(guī)模 |
ansible聚集以上部署和命令執(zhí)行于一身,能夠完整輕易的實(shí)現(xiàn)應(yīng)用部署和批量命令功能,適用于主機(jī)數(shù)量中型規(guī)模,再大的用puppet。
作為運(yùn)維工程師,對(duì)于命令執(zhí)行的工具要掌握ansible,fabric,func或者shell其中的一種
ansible是什么
ansible是新出現(xiàn)的自動(dòng)化運(yùn)維工具,基于Python開發(fā),集合了眾多運(yùn)維工具(puppet、chef、func、fabric)的優(yōu)點(diǎn),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。
ansible是基于 paramiko 開發(fā)的,并且基于模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架。ansible不需要在遠(yuǎn)程主機(jī)上安裝client/agents,因?yàn)樗鼈兪?strong>基于ssh來和遠(yuǎn)程主機(jī)通訊的。ansible目前已經(jīng)已經(jīng)被紅帽官方收購(gòu),是自動(dòng)化運(yùn)維工具中大家認(rèn)可度最高的,并且上手容易,學(xué)習(xí)簡(jiǎn)單。是每位運(yùn)維工程師必須掌握的技能之一。
ansible特點(diǎn)
1、部署簡(jiǎn)單,只需在主控端部署Ansible環(huán)境,被控端無需做任何操作;
2、默認(rèn)使用SSH協(xié)議對(duì)設(shè)備進(jìn)行管理;
3、有大量常規(guī)運(yùn)維操作模塊,可實(shí)現(xiàn)日常絕大部分操作。
4、配置簡(jiǎn)單、功能強(qiáng)大、擴(kuò)展性強(qiáng);
5、支持API及自定義模塊,可通過Python輕松擴(kuò)展;
6、通過Playbooks來定制強(qiáng)大的配置、狀態(tài)管理;
7、輕量級(jí),無需在客戶端安裝agent,更新時(shí),只需在操作機(jī)上進(jìn)行一次更新即可;
8、提供一個(gè)功能強(qiáng)大、操作性強(qiáng)的Web管理界面和REST API接口——AWX平臺(tái)。
ansible架構(gòu)圖
Ansible:Ansible核心程序。
HostInventory:記錄由Ansible管理的主機(jī)信息,包括端口、密碼、ip等。
Playbooks:"劇本"YAML格式文件,多個(gè)任務(wù)定義在一個(gè)文件中,定義主機(jī)需要調(diào)用哪些模塊來完成的功能。
CoreModules:核心模塊,主要操作是通過調(diào)用核心模塊來完成管理任務(wù)。
CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語(yǔ)言。
ConnectionPlugins:連接插件,Ansible和Host通信使用
ansible任務(wù)執(zhí)行
ansible任務(wù)執(zhí)行模式
Ansible系統(tǒng)由控制主機(jī)對(duì)被管節(jié)點(diǎn)的操作方式可分為兩類,即adhoc和playbook:
ad-hoc模式使用單個(gè)模塊,支持批量執(zhí)行單條命令。 ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當(dāng)于bash中的一句話shell。
playbook模式是Ansible主要管理方式,也是Ansible功能強(qiáng)大的關(guān)鍵所在。playbook通過多個(gè)task集合完成一類功能,如Web服務(wù)的安裝部署、數(shù)據(jù)庫(kù)服務(wù)器的批量備份等。可以簡(jiǎn)單地把playbook理解為通過組合多條ad-hoc操作作的配置文件。
ansible執(zhí)行流程
簡(jiǎn)單理解就是Ansible在運(yùn)行時(shí),首先讀取ansible.cfg中的配置,根據(jù)規(guī)則獲取Inventory中的管理主機(jī)列表,并行的在這些主機(jī)中執(zhí)行配置的任務(wù),最后等待執(zhí)行返回的結(jié)果。
Ansible命令執(zhí)行過程
1、加載自己的配置文件 默認(rèn)/etc/ansible/ansible.cfg
2、查找對(duì)應(yīng)的主機(jī)配置文件,找到要執(zhí)行的主機(jī)或者組
3、加載自己對(duì)應(yīng)的模塊文件,如command
4、通過ansible將模塊或命令生成對(duì)應(yīng)的臨時(shí)py文件,并將該文件傳輸至遠(yuǎn)程服務(wù)器的
5、對(duì)應(yīng)執(zhí)行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件
6、給文件+x執(zhí)行
7、執(zhí)行并返回結(jié)果
8、刪除臨時(shí)py文件,sleep 0退出
ansible安裝方式
ansible安裝常用兩種方式,yum安裝和pip程序安裝
1使用yum安裝
yum install epel-release -y
yum install ansible –y
2 使用pip(python的包管理模塊)安裝
pip install ansible
如果沒pip,需先安裝pip.yum可直接安裝:
yum install python-pip
pip install ansible
ansible程序結(jié)構(gòu)
安裝目錄
配置文件目錄:/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/
ansible配置文件的查找順序
(1).檢查環(huán)境變量ANSIBLE_CONFIG指向的路徑文件(export ANSIBLE_CONFIG=/etc/ansible.cfg)
(2).~/.ansible.cfg,檢查當(dāng)前目錄下的ansible.cfg配置文件
(3)./etc/ansible.cfg 檢查etc目錄的配置文件
Ansible配置文件
vim /etc/ansible/ansible.cfg
設(shè)置ansible.cfg配置參數(shù),ansible有許多參數(shù),下面列出常用的參數(shù):
inventory: #這個(gè)參數(shù)表示資源清單inventory文件的位置,資源清單就是一些Ansible需要連接管理的主 機(jī)列表。這個(gè)參數(shù)的配置實(shí)例如下:
inventory = /etc/ansible/hosts
library:Ansible的操作動(dòng)作,無論是本地或遠(yuǎn)程,都使用一小段代碼來執(zhí)行,這小段代碼稱為模塊,這個(gè)library參數(shù)就是指向存放Ansible模塊的目錄。配置實(shí)例如下:
library = /usr/share/ansible
Ansible支持多個(gè)目錄方式,只要用冒號(hào)(:)隔開就可以,同時(shí)也會(huì)檢查當(dāng)前執(zhí)行playbook位置下的./library目錄。
forks: 設(shè)置默認(rèn)情況下Ansible最多能有多少個(gè)進(jìn)程同時(shí)工作, 從Ansible 1.3開始,fork數(shù)量默認(rèn)自動(dòng)設(shè)置為主機(jī)數(shù)量或者潛在的主機(jī)數(shù)量,默認(rèn)設(shè)置最多5個(gè)進(jìn)程并行處理。具體需要設(shè)置多少個(gè),可以根據(jù)控制主機(jī)的性能和被管節(jié)點(diǎn)的數(shù)量來確定,可能是 50或100。默認(rèn)值5是非常保守的值,配置實(shí)例如下:
forks = 5
sudo_user:
這是設(shè)置默認(rèn)執(zhí)行命令的用戶,也可以在playbook中重新設(shè)置這個(gè)參數(shù)。配置實(shí)例如下:
sudo_user = root
remote_port:
這是指定連接被管節(jié)點(diǎn)的管理端口,默認(rèn)是22。除非設(shè)置了特殊的SSH端口,不然這個(gè)參數(shù)一般是不需要修改的(如果需要修改,則還需修改ssh的配置文件,更改端口)。
配置實(shí)例如下:
remote_port = 22
host_key_checking:
這是設(shè)置是否檢查SSH主機(jī)的密鑰??梢栽O(shè)置為True或False,關(guān)閉后第一次連接沒有提示(就是第一次連接不在提示yes或者no)
配置實(shí)例:
host_key_checking = False
timeout:
這是設(shè)置SSH連接的超時(shí)間隔,單位是秒。配置實(shí)例如下:
timeout = 60
log_path:Ansible系統(tǒng)默認(rèn)是不記錄日志的,如果想把Ansible系統(tǒng)的輸出記錄到日志文件中,需要置log_path
來指定一個(gè)存儲(chǔ)Ansible日志的文件。配置實(shí)例如下:
log_path = /var/log/ansible.log
另外需要注意,執(zhí)行Ansible的用戶需要有寫入日志的權(quán)限,模塊將會(huì)調(diào)用被管節(jié)點(diǎn)的syslog來記錄
Ansible主機(jī)清單
編輯/etc/ansible/hosts:
#vim /etc/ansible/hosts定義方式:
1、直接指明主機(jī)地址或主機(jī)名:
## green.example.com#
# blue.example.com#
# 192.168.100.1
# 192.168.100.10
2、定義一個(gè)主機(jī)組[組名]把地址或主機(jī)名加進(jìn)去
[mysql_test]
192.168.253.159
192.168.253.160
192.168.253.153
#組成員可以使用通配符來匹配,如下 192.168.2.[1:6] #表示匹配從192.168.2.1——192.168.2.6的主機(jī)
Ansible常用命令
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í)行工具
Ansible-doc命令
查看 ansible-doc 的使用說明:
一般用法:
ansible-doc -l 獲取模塊信息
ansible-doc -s MOD_NAME 獲取指定模塊的使用幫助
ansible-doc 選項(xiàng):
-h --help 顯示命令參數(shù)API文檔
-l --list 列出可用的模塊
-M MODULE_PATH, --module-path=MODULE_PATH 指定模塊的路徑
-s, --snippet 顯示playbook制定模塊的用法
--version 顯示ansible-doc的版本號(hào)查看模塊列表
Ansible命令詳解
命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
host-pattern 主機(jī)組
-f forks 并發(fā)連接數(shù)
-m module_name 指定模塊 執(zhí)行模塊的名字,默認(rèn)使用 command 模塊,所以如果是只執(zhí)行單一命令可以不用 -m參數(shù)module name to execute (default=command)
-a args 指定模塊參數(shù)
-k, --ask-pass登錄密碼,提示輸入SSH密碼而不是假設(shè)基于密鑰的驗(yàn)證
--ask-su-pass su切換密碼
-K, --ask-sudo-pass ask for sudo password 提示密碼使用sudo,sudo表示提權(quán)操作
--ask-vault-pass ask for vault password
-B SECONDS, --background=SECONDS 后臺(tái)運(yùn)行超時(shí)時(shí)間
-C, --check don't make any changes; instead, try to predict some of the changes that may occur
只是測(cè)試一下會(huì)改變什么內(nèi)容,不會(huì)真正去執(zhí)行;相反,試圖預(yù)測(cè)一些可能發(fā)生的變化
-c CONNECTION, --connection=CONNECTION 連接類型使用。
-i INVENTORY, --inventory-file=INVENTORY 指定庫(kù)存主機(jī)文件的路徑,默認(rèn)為/etc/ansible/hosts
-M MODULE_PATH, --module-path=MODULE_PATH 要執(zhí)行的模塊的路徑,默認(rèn)為/usr/share/ansible/
specify path(s) to module library (default=/usr/share/ansible/)
-o, --one-line condense output 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。
-P POLL_INTERVAL, --poll=POLL_INTERVAL 調(diào)查背景工作每隔數(shù)秒。需要- b
set the poll interval if using -B (default=15)
-S, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER 指定SU的用戶,默認(rèn)是root用戶
run operations with su as this user (default=root)
-s, --sudo run operations with sudo (nopasswd)(使用sudo需要配置sudo的配置文件)
-U SUDO_USER, --sudo-user=SUDO_USER sudo到哪個(gè)用戶,默認(rèn)為 root
desired sudo user (default=root)
-T TIMEOUT, --timeout=TIMEOUT 指定SSH默認(rèn)超時(shí)時(shí)間, 默認(rèn)是10S
-t TREE, --tree=TREE log output to this directory 將日志內(nèi)容保存在該輸出目錄,結(jié)果保存在一個(gè)文件中在每臺(tái)主機(jī)上。
-u REMOTE_USER, --user=REMOTE_USER 遠(yuǎn)程用戶, 默認(rèn)是root用戶 connect as this user (default=root)
--vault-password-file=VAULT_PASSWORD_FILE vault password file
-v, --verbose verbose mode (-vvv for more, -vvvv to enable 詳細(xì)信息
--version show program's version number and exit 輸出ansible的版本
ansible all --lists-hosts 列出所有主機(jī)組里面主機(jī)
ansible web --lists-hosts 列出指定主機(jī)組里面的主機(jī)
Ansible配置公私鑰
配置ansible使用公鑰驗(yàn)證
雖然ansible支持其他主機(jī)認(rèn)證方式,但是我們最常用的的還是基于秘鑰的認(rèn)證
1、首先生成秘鑰
ssh-keygen -t rsa -P ''
2、然后向主機(jī)分發(fā)秘鑰:
ssh-copy-id root@ #@后面跟主機(jī)名或者IP地址
例如:ssh-copy-id root@192.168.10.190
3.然后測(cè)試,使用ssh連接,不用密碼就可登陸
4、如果出現(xiàn)以下情況:
# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72
-bash: ssh-copy-id: command not found請(qǐng)嘗試:
yum -y install openssh-clientsansible
Ansible常用模塊
我在/etc/ansible/hosts中配置了主機(jī)組,如圖:
1、主機(jī)連通性測(cè)試:
#ansible all -m ping執(zhí)行效果如下:
也可以ansible web -m ping
2、command:在遠(yuǎn)程主機(jī)執(zhí)行命令;不支持|管道命令
ansible all|web -m command -a 'ifconfig'
命令模塊接受命令名稱,后面是空格分隔的列表參數(shù)。給定的命令將在所有選定的節(jié)點(diǎn)上執(zhí)行。它不會(huì)通過shell進(jìn)行處理,比如$HOME和操作如"小于"<",">", "|", ";","&"' 工作(需要使用(shell)模塊實(shí)現(xiàn)這些功能)。
action: command
chdir # 在執(zhí)行命令之前,先切換到該目錄
ansible web -a "chdir=/app ls"
creates # 一個(gè)文件名,當(dāng)這個(gè)文件存在,則該命令不執(zhí)行,可以用來做判斷
ansible web -a "creates=/app/111 chdir=/app ls" 因?yàn)?92.168.10.187主機(jī)上存在/app/111所以跳過,不列出
executable # 切換shell來執(zhí)行命令,需要使用命令的絕對(duì)路徑
free_form # 要執(zhí)行的Linux指令,一般使用Ansible的-a參數(shù)代替。
removes # 一個(gè)文件名,這個(gè)文件不存在,則該命令不執(zhí)行,與creates相反的判斷
因?yàn)?92.168.10.190主機(jī)上沒有/app/111,所以跳過,不列出
3、shell模塊在遠(yuǎn)程主機(jī)上調(diào)用shell解釋器運(yùn)行命令,支持shell的各種功能,例如管道等
例如:ansible web -m shell -a 'cat /etc/passwd|grep root'
4、copy:復(fù)制文件到遠(yuǎn)程主機(jī),可以改權(quán)限等用法:
(1) 復(fù)制文件
-a "src= dest= "
例如:ansible web -m copy -a "src=/app/111 dest=/app/test.sh"
然后在主機(jī)組中看看拷貝的文件
主機(jī)192.168.10.187
主機(jī)192.168.10.190
(2) 給定內(nèi)容生成文件
-a "content= dest= "
例如:ansible web -m copy -a "content='hello word' dest=/app/test.ansible mode=666"源是給定的內(nèi)容hello word,目標(biāo)是/app/test.ansible,拷貝過去的文件權(quán)限為666
然后在主機(jī)組中看看拷貝的文件
另一個(gè)也是如此
相關(guān)選項(xiàng)如下:
backup:在覆蓋之前,將源文件備份,備份文件包含時(shí)間信息。有兩個(gè)選項(xiàng):yes|no backup=yes備份
content:用于替代"src",可以直接設(shè)定指定文件的值
dest:必選項(xiàng)。要將源文件復(fù)制到的遠(yuǎn)程主機(jī)的絕對(duì)路徑,如果源文件是一個(gè)目錄,那么該路徑也必須是個(gè)目錄
directory_mode:遞歸設(shè)定目錄的權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限
force:如果目標(biāo)主機(jī)包含該文件,但內(nèi)容不同,如果設(shè)置為yes,則強(qiáng)制覆蓋,如果為no,則只有當(dāng)目標(biāo)主機(jī)的目標(biāo)位置不存在該文件時(shí),才復(fù)制。默認(rèn)為yes
others:所有的file模塊里的選項(xiàng)都可以在這里使用
src:被復(fù)制到遠(yuǎn)程主機(jī)的本地文件,可以是絕對(duì)路徑,也可以是相對(duì)路徑。如果路徑是一個(gè)目錄,它將遞歸復(fù)制。在這種情況下,如果路徑使用"/"來結(jié)尾,則只復(fù)制目錄里的內(nèi)容,如果沒有使用"/"來結(jié)尾,則包含目錄在內(nèi)的整個(gè)內(nèi)容全部復(fù)制,類似于rsync。
5、file 設(shè)置文件屬性:
創(chuàng)建目錄:-a "path= state=directory"
創(chuàng)建鏈接文件:-a "path= src= state=link"
刪除文件:-a "path= state=absent"
其他選項(xiàng):
force:需要在兩種情況下強(qiáng)制創(chuàng)建軟鏈接,一種是源文件不存在,但之后會(huì)建立的情況下;另一種是目標(biāo)軟鏈接已存在,需要先取消之前的軟鏈,然后創(chuàng)建新的軟鏈,有兩個(gè)選項(xiàng):yes|no
group:定義文件/目錄的屬組 mode:定義文件/目錄的權(quán)限
owner:定義文件/目錄的屬主 path:必選項(xiàng),定義文件/目錄的路徑
recurse:遞歸設(shè)置文件的屬性,只對(duì)目錄有效 src:被鏈接的源文件路徑,只應(yīng)用于state=link的情況
dest:被鏈接到的路徑,只應(yīng)用于state=link的情況
state:
directory:如果目錄不存在,就創(chuàng)建目錄
file:即使文件不存在,也不會(huì)被創(chuàng)建
link:創(chuàng)建軟鏈接
hard:創(chuàng)建硬鏈接
touch:如果文件不存在,則會(huì)創(chuàng)建一個(gè)新的文件,如果文件或目錄已存在,則更新其最后修改時(shí)間
absent:刪除目錄、文件或者取消鏈接文件
例如:
ansible web -m file -a "path=/data/webapps state=directory" 創(chuàng)建目錄
ansible web -m file -a "path=/data/webapps/111 state=touch"創(chuàng)建文件
ansible web -m file -a "path=/data/webapps/111.link src=/data/webapps/111 state=link" 創(chuàng)建軟鏈接
或者ansible web -m file -a "dest=/data/webapps/111.link src=/data/webapps/111 state=link"
ansible web -m file -a "path=/data/webapps state=absent"刪除目錄
6、fetch從遠(yuǎn)程某主機(jī)獲取文件到本地:
dest:用來存放文件的目錄,例如存放目錄為backup,源文件名稱為/etc/profile在主機(jī)pythonserver中,那么保存為/backup/pythonserver/etc/profile
Src:在遠(yuǎn)程拉取的文件,并且必須是一個(gè)file,不能是目錄
例如:ansible web -m fetch -a "src=/app/111 dest=/root/test"
然后在本機(jī)查看從遠(yuǎn)程主機(jī)獲取的文件
已經(jīng)用遠(yuǎn)程主機(jī)IP給你建好了目錄結(jié)構(gòu),讓你知道是從哪臺(tái)主機(jī)拷過來的文件,非常貼心
7、cron 管理cron計(jì)劃任務(wù):
-a "": 設(shè)置管理節(jié)點(diǎn)生成定時(shí)任務(wù)
action: cron backup= # 如果設(shè)置,創(chuàng)建一個(gè)crontab備份 【yes|no】
cron_file= #如果指定, 使用這個(gè)文件cron.d,而不是單個(gè)用戶
crontab
day= #日應(yīng)該運(yùn)行的工作( 1-31, *, */2, )
hour= # 小時(shí) ( 0-23, *, */2, )
minute= #分鐘( 0-59, *, */2, )
month= # 月( 1-12, *, /2, )
weekday # 周 ( 0-6 for Sunday-Saturday,, )
job= #指明運(yùn)行的命令是什么
name= #定時(shí)任務(wù)描述
reboot # 任務(wù)在重啟時(shí)運(yùn)行,不建議使用,建議使用special_time
special_time #特殊的時(shí)間范圍,參數(shù):reboot(重啟時(shí)),annually(每年),monthly(每月),weekly
(每周),daily(每天),hourly(每小時(shí))
state #指定狀態(tài),present表示添加定時(shí)任務(wù),也是默認(rèn)設(shè)置,absent表示刪除定時(shí)任務(wù)
user # 以哪個(gè)用戶的身份執(zhí)行
例如:ansible web -m cron -a "name='ntp update every 5' minute=*/5 job='/sbin/ntpdate 172.17.0.1 &> /dev/null'"
然后再去查看一下,計(jì)劃任務(wù)已經(jīng)添加進(jìn)去了
再添加計(jì)劃任務(wù),但是name注釋不能和之前設(shè)置的name注釋一樣,否則將會(huì)覆蓋之前的計(jì)劃任務(wù)
刪除已經(jīng)設(shè)置的計(jì)劃任務(wù),指定狀態(tài)state=absent
ansible web -m cron -a "name='ntp update every 5' minute=*/5 job='/sbin/ntpdate 172.17.0.1 &> /dev/null' state=absent"
也可以用special_time來設(shè)置計(jì)劃任務(wù),例如:
ansible web -m cron -a "name='ntp update every 5' special_time=hourly job='/sbin/ntpdate 172.17.0.1 &> /dev/null'"
8、yum安裝軟件
conf_file #設(shè)定遠(yuǎn)程yum安裝時(shí)所依賴的配置文件。如配置文件沒有在默認(rèn)的位置。
disable_gpg_check #是否禁止GPG checking,只用于`present' or `latest'。
disablerepo #臨時(shí)禁止使用yum庫(kù)。 只用于安裝或更新時(shí)。
enablerepo #臨時(shí)使用的yum庫(kù)。只用于安裝或更新時(shí)。
name=#所安裝的包的名稱
state= #present安裝, latest安裝最新的, absent 卸載軟件。
update_cache#強(qiáng)制更新yum的緩存。
例如:ansible web -m yum -a "name=vsftpd state=present disable_gpg_check=yes" 安裝包
ansible web -m yum -a "name=vsftpd state=absent"卸載包
安裝yum倉(cāng)庫(kù)里面沒有的包
1.將一個(gè)rpm包從本機(jī)拷貝到遠(yuǎn)程主機(jī)的家目錄中
ansible web -m copy -a "src=/root/mha4mysql-node-0.56-0.el6.noarch.rpm dest=/root"
2.安裝包,需要指定路徑
ansible web -m yum -a "name=/root/mha4mysql-node-0.56-0.el6.noarch.rpm state=present disable_gpg_check=yes"
3,卸載包,此時(shí)就不需要指定路徑了,而且名字也改變了
ansible web -m yum -a "name=mha4mysql-node state=absent"
9、service: 服務(wù)程序管理
arguments #命令行提供額外的參數(shù)
enabled #設(shè)置開機(jī)啟動(dòng)。
name=#服務(wù)名稱
runlevel #開機(jī)啟動(dòng)的級(jí)別,一般不用指定。
sleep #在重啟服務(wù)的過程中,是否等待。如在服務(wù)關(guān)閉以后等待2秒再啟動(dòng)。
state#started啟動(dòng)服務(wù), stopped停止服務(wù), restarted重啟服務(wù), reloaded重載配置啟動(dòng)nginx服務(wù)并設(shè)置范圍自啟動(dòng):
例如:nginx服務(wù)
1.先安裝個(gè)nginx
ansible web -m yum -a "name=nginx state=present disable_gpg_check=yes"
2.開啟nginx服務(wù),并設(shè)置為開機(jī)自啟
ansible web -m service -a "name=nginx state=started enabled=yes"
3.關(guān)閉nginx服務(wù)
ansible web -m service -a "name=nginx state=stopped"
10、user模塊管理
用戶模塊,管理用戶帳號(hào)action: user
comment # 用戶的描述信息
createhome # 是否創(chuàng)建家目錄
force # 在使用state=absent是, 行為與userdel –force一致.
group # 指定基本組
groups # 指定附加組,如果指定為(groups=)表示刪除所有組
home # 指定用戶家目錄
move_home # 如果設(shè)置為home=時(shí), 試圖將用戶主目錄移動(dòng)到指定的目錄
name # 指定用戶名
non_unique # 該選項(xiàng)允許改變非唯一的用戶ID值(可以多個(gè) 用戶共用一個(gè)ID)
password # 指定用戶密碼
remove # 在使用state=absent時(shí), 行為是與userdel –remove一致
shell # 指定默認(rèn)shell(例如:不讓用戶登錄的shell是/sbin/nologin)
state # 設(shè)置帳號(hào)狀態(tài),不指定為創(chuàng)建,指定值為absent表示刪除
system # 當(dāng)創(chuàng)建一個(gè)用戶,設(shè)置這個(gè)用戶是系統(tǒng)用戶。這個(gè)設(shè)置不能更改現(xiàn)有用戶(centos6是0-500是系統(tǒng)用戶,centos7 0-1000是系統(tǒng)用戶)
uid # 指定用戶的uid
update_password # 更新用戶密碼
例如:創(chuàng)建一個(gè)用戶ansible web -m user -a "name=magedu01 password=magedu uid=10001 shell=/bin/sh" (注意:這里指定的密碼在/etc/shadow里面是明文的,所以密碼還需要通過openssl去加密一下)
查看一下,創(chuàng)建成功
刪除用戶ansible web -m user -a "name=magedu01 state=absent"
11、group
用戶組模塊,添加或刪除組
action: group
gid # 設(shè)置組的GID號(hào)
name= # 管理組的名稱
state # 指定組狀態(tài),默認(rèn)為創(chuàng)建,設(shè)置值為absent為刪除
system # 設(shè)置值為yes,表示為創(chuàng)建系統(tǒng)組
創(chuàng)建名為tom的組
ansible web -m group -a 'name=tom state=present'
12、script在指定節(jié)點(diǎn)運(yùn)行服務(wù)端的腳本
在本機(jī)家目錄下寫一個(gè)腳本,然后在兩臺(tái)遠(yuǎn)程主機(jī)上運(yùn)行
vim /root/test.sh
#!/bin/bash
date >> /app/disk_total.log
df -lh >> /app/disk_total.log
ansible web -m script -a '/root/test.sh'
然后去查看
13、setup模塊
facts組件是Ansible用于采集被管機(jī)器設(shè)備信息的一個(gè)功能,我們可以使用setup模塊查機(jī)器的所有facts信息,可以使用filter來查看指定信息。整個(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ù)不同的信息來做不同的操作。如redhat系列用yum安裝,而debian系列用apt來安裝軟件。
setup模塊,主要用于獲取主機(jī)信息,在playbooks里經(jīng)常會(huì)用到的一個(gè)參數(shù)gather_facts就與該模塊相關(guān)。setup模塊下經(jīng)常使用的一個(gè)參數(shù)是filter參數(shù),具體使用示例如下(由于輸出結(jié)果較多,這里只列命令不寫結(jié)果):
absible web -m setup 獲取所有的主機(jī)信息
ansible web -m setup -a 'filter=ansible_*_mb' //查看主機(jī)內(nèi)存信息
ansible web -m setup -a 'filter=ansible_eth[0-2]' //查看地接口為eth0-2的網(wǎng)卡信息
ansible all -m setup --tree /tmp/facts //將所有主機(jī)的信息輸入到/tmp/facts目錄下,每臺(tái)主機(jī)的信息輸入到主機(jī)名文件中(/etc/ansible/hosts里的主機(jī)名)
在本機(jī)中查看
Ansible playbook簡(jiǎn)介
playbook是ansible用于配置,部署,和管理被控節(jié)點(diǎn)的劇本。
通過playbook的詳細(xì)描述,執(zhí)行其中的一系列tasks,可以讓遠(yuǎn)端主機(jī)達(dá)到預(yù)期的狀態(tài)。playbook就像Ansible控制器給被控節(jié)點(diǎn)列出的的一系列to-do-list,而被控節(jié)點(diǎn)必須要完成。
也可以這么理解,playbook 字面意思,即劇本,現(xiàn)實(shí)中由演員按照劇本表演,在Ansible中,這次由計(jì)算機(jī)進(jìn)行表演,由計(jì)算機(jī)安裝,部署應(yīng)用,提供對(duì)外服務(wù),以及組織計(jì)算機(jī)處理各種各樣的事情。
Ansible playbook使用場(chǎng)景
(1)執(zhí)行一些簡(jiǎn)單的任務(wù),使用ad-hoc命令可以方便的解決問題,但是有時(shí)一個(gè)設(shè)施過于復(fù)雜,需要大量的操作時(shí)候,執(zhí)行的ad-hoc命令是不適合的,這時(shí)最好使用playbook。
(2)就像執(zhí)行shell命令與寫shell腳本一樣,也可以理解為批處理任務(wù),不過playbook有自己的語(yǔ)法格式。
(3)使用playbook你可以方便的重用這些代碼,可以移植到不同的機(jī)器上面,像函數(shù)一樣,最大化的利用代碼。在你使用Ansible的過程中,你也會(huì)發(fā)現(xiàn),你所處理的大部分操作都是編寫playbook。可以把常見的應(yīng)用都編寫成playbook,之后管理服務(wù)器會(huì)變得十分簡(jiǎn)單。
Ansible playbook格式
playbook由YMAL語(yǔ)言編寫。YAML( /?jæm?l/ )參考了其他多種語(yǔ)言,包括:XML、C語(yǔ)言、Python、Perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發(fā)表了這種語(yǔ)言,另外Ingy döt Net與Oren Ben-Kiki也是這語(yǔ)言的共同設(shè)計(jì)者。
YMAL格式是類似于JSON的文件格式,便于人理解和閱讀,同時(shí)便于書寫。首先學(xué)習(xí)了解一下YMAL的格式,對(duì)我們后面書寫playbook很有幫助。以下為playbook常用到的YMAL格式。
文件的第一行應(yīng)該以 "—" (三個(gè)連字符)開始,表明YMAL文件的開始。
在同一行中,#之后的內(nèi)容表示注釋,類似于shell,python和ruby。
YMAL中的列表元素以"-"開頭然后緊跟著一個(gè)空格,后面為元素內(nèi)容。就像這樣
- apple - banana - orange等價(jià)于JSON的這種格式
[ "apple", "banana", "orange" ]
同一個(gè)列表中的元素應(yīng)該保持相同的縮進(jìn)。否則會(huì)被當(dāng)做錯(cuò)誤處理。
play中hosts,variables,roles,tasks等對(duì)象的表示方法都是鍵值中間以":"分隔表示,":"后面還要增加一
個(gè)空格。
例如:vim /etc/ansible/mysql.yml
在mysql.yml中,主要由三個(gè)部分組成。
hosts部分:使用hosts指示使用哪個(gè)主機(jī)或主機(jī)組來運(yùn)行下面的tasks,每個(gè)playbook都必須指定hosts,hosts也可以使用通配符格式。主機(jī)或主機(jī)組在inventory清單中指定,可以使用系統(tǒng)默認(rèn)的
/etc/ansible/hosts,也可以自己編輯,在運(yùn)行的時(shí)候加上-i選項(xiàng),指定清單的位置即可。在運(yùn)行清單文件的時(shí)候,–list-hosts選項(xiàng)會(huì)顯示那些主機(jī)將會(huì)參與執(zhí)行task的過程中
remote_user:指定遠(yuǎn)端主機(jī)中的哪個(gè)用戶來登錄遠(yuǎn)端系統(tǒng),在遠(yuǎn)端系統(tǒng)執(zhí)行task的用戶,可以任意指定,也可以使用sudo,但是用戶必須要有執(zhí)行相應(yīng)task的權(quán)限。
tasks:指定遠(yuǎn)端主機(jī)將要執(zhí)行的一系列動(dòng)作。tasks的核心為ansible的模塊,前面已經(jīng)提到模塊的用法。tasks包含name和要執(zhí)行的模塊,name是可選的,只是為了便于用戶閱讀,不過還是建議加上去,模塊是必須的,同時(shí)也要給予模塊相應(yīng)的參數(shù)。
使用ansible-playbook運(yùn)行playbook文件,得到如下輸出信息,輸出內(nèi)容為JSON格式。并且由不同顏色組成,便于識(shí)別。一般而言
綠色代表執(zhí)行成功,系統(tǒng)保持原樣
黃色代表系統(tǒng)代表系統(tǒng)狀態(tài)發(fā)生改變
紅色代表執(zhí)行失敗,顯示錯(cuò)誤輸出。
執(zhí)行有三個(gè)步驟:1、收集facts 2、執(zhí)行tasks 3、報(bào)告結(jié)果
Playbook的核心元素:
Hosts:主機(jī)
Tasks:任務(wù)列表
Variables
Templates:包含了模板語(yǔ)法的文本文件;
Handlers:由特定條件觸發(fā)的任務(wù);
Playbooks配置文件的基礎(chǔ)組件:
Hosts:運(yùn)行指定任務(wù)的目標(biāo)主機(jī);
remoute_user: 在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)的用戶;
sudo_user:
tasks:任務(wù)列表
模塊,模塊參數(shù);
格式:
(1) action: module arguments
(2) module: arguments
注意:shell和command模塊后面直接跟命令,而非key=value類的參數(shù)列表;
(1) 某任務(wù)的狀態(tài)在運(yùn)行后為changed時(shí),可通過"notify"通知給相應(yīng)的handlers;
(2) 任務(wù)可以通過"tags"打標(biāo)簽,而后可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用;
handlers:
任務(wù),在特定條件下觸發(fā);
接收到其它任務(wù)的通知時(shí)被觸發(fā);
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
小實(shí)驗(yàn):
先做一個(gè)簡(jiǎn)單的劇本,安裝個(gè)samba,然后再開啟服務(wù),劇本內(nèi)容如圖:
然后再去讓web中的遠(yuǎn)程主機(jī)執(zhí)行劇本
但是現(xiàn)在我只想開啟服務(wù),不想再次安裝samba(因?yàn)橐呀?jīng)安裝過了),此時(shí)就可以給啟動(dòng)服務(wù)打個(gè)標(biāo)簽,這樣執(zhí)行劇本就只開啟服務(wù)了
更改劇本,打個(gè)標(biāo)簽,如圖:
先停掉smb服務(wù)
ansible web -m service -a "name=smb state=stopped"
然后再去執(zhí)行劇本,使用-t調(diào)用我們剛才打的標(biāo)簽,如圖:沒有再去安裝samba,只啟動(dòng)服務(wù)
現(xiàn)在有一個(gè)需求,當(dāng)nginx的配置文件發(fā)生變化時(shí),就restarted,劇本如下圖所示:
然后執(zhí)行劇本
ansible-playbook nginx.yml
然后查看端口號(hào)
現(xiàn)在改變nginx的配置文件,也就是修改/app/nginx.conf,然后就可以觸發(fā)handlers
我就修改一個(gè)端口,將nginx監(jiān)聽的端口改為8888
然后再次執(zhí)行劇本,-t調(diào)用打的標(biāo)簽
然后再來查看端口
variables:
(1) facts:可直接調(diào)用;
注意:可使用setup模塊直接獲取目標(biāo)主機(jī)的facters;ansible web -m setup 來獲取主機(jī)的信息,里面有各種變量
{{ ansible_eth0['ipv4']['address'] }} centos6的IP地址變量
{{ ansible_ens33['ipv4']['address'] }} centos7的IP地址變量
(2) 用戶自定義變量:
(a) ansible-playbook命令的命令行中的
-e VARS, --extra-vars=VARS 也就是在命令中指定變量是什么
ansible-playbook nginx.yml -e rpmname=vsftpd
(b) 在playbook中定義變量的方法:
如圖:
再去改一下/app/nginx.conf,再改變一個(gè)端口如:9999
然后執(zhí)行劇本
(3) 通過roles傳遞變量;
(4) Host Inventory
(a) 用戶自定義變量
(i) 向不同的主機(jī)傳遞不同的變量;
IP/HOSTNAME varaiable=value var2=value2
(ii) 向組中的主機(jī)傳遞相同的變量;
[groupname:vars]
variable=value
[web]
172.17.251.188
172.17.250.209
[web:vars]
rpmname=samba
運(yùn)行playbook的方式:
(1) 測(cè)試
ansible-playbook --check 只檢測(cè)可能會(huì)發(fā)生的改變,但不真正執(zhí)行操作;
ansible-playbook --list-hosts 列出運(yùn)行任務(wù)的主機(jī);
(2) 直接運(yùn)行
模板:templates
文本文件,嵌套有腳本(使用模板編程語(yǔ)言編寫)
Jinja2:Jinja2是python的一種模板語(yǔ)言,以Django的模板語(yǔ)言為原本
支持:
字符串:使用單引號(hào)或雙引號(hào);
數(shù)字:整數(shù),浮點(diǎn)數(shù);
列表:[item1, item2, ...]
元組:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布爾型:true/false
算術(shù)運(yùn)算:
+, -, *, /, //, %, **
比較操作:
==, !=, >, >=, <, <=
邏輯運(yùn)算:
and, or, not
使用模板示例:
1.將/app/nginx.conf改名為/app/nginx.conf.j2 這個(gè)配置文件就變成模板配置文件了
mv /app/nginx.conf /app/nginx.conf.j2
2.然后將模板配置文件里面的監(jiān)聽端口寫成變量,cpu顆數(shù)也寫成變量
變量nginxport是我們自己定義的
變量ansible_processor_vcpus是用ansible命令獲取的ansible web -m setup |grep cpu
3.編寫劇本
4.執(zhí)行劇本,查看端口,有8888端口
條件測(cè)試:
when語(yǔ)句:在task中使用,jinja2的語(yǔ)法格式
tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6"
判斷ansible_distribution_major_version這個(gè)變量等于6還是7,如果是6,說明是centos6系統(tǒng),就執(zhí)行template: src=files/nginx.conf.c6.j2,如果是7,說明是centos7的系統(tǒng),就執(zhí)行 template: src=files/nginx.conf.c7.j2
循環(huán):迭代,需要重復(fù)執(zhí)行的任務(wù);對(duì)迭代項(xiàng)的引用,固定變量名為"item"而后,要在task中使用with_items給定要迭代的元素列表;
Ansible playbook字典
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
- name: add some groups
group: name={{ item }} state=present
with_items:
- group11
- group12
- group13
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user11', group: 'group11' }
- { name: 'user12', group: 'group12' }
- { name: 'user13', group: 'group13' }
企業(yè)級(jí)應(yīng)用:
角色定制:roles
對(duì)于以上所有的方式有個(gè)弊端就是無法實(shí)現(xiàn)復(fù)用假設(shè)在同時(shí)部署Web、db、ha 時(shí)或不同服務(wù)器組合不同的應(yīng)用就需要寫多個(gè)yml文件。很難實(shí)現(xiàn)靈活的調(diào)用。
roles 用于層次性、結(jié)構(gòu)化地組織playbook。roles 能夠根據(jù)層次型結(jié)構(gòu)自動(dòng)裝載變量文件、tasks以及handlers等。要使用
roles只需要在playbook中使用include指令即可。簡(jiǎn)單來講,roles就是通過分別將變量(vars)、文件(file)、任務(wù)(tasks)、模塊
(modules)及處理器(handlers)放置于單獨(dú)的目錄中,并可以便捷地include它們的一種機(jī)制。角色一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以是用于構(gòu)建守護(hù)進(jìn)程等場(chǎng)景中。
roles目錄結(jié)構(gòu)
角色集合:roles/
mysql/
httpd/
nginx/
files/:存儲(chǔ)由copy或script等模塊調(diào)用的文件;
tasks/:此目錄中至少應(yīng)該有一個(gè)名為main.yml的文件,用于定義各task;其它的文件需要由main.yml進(jìn)行"包含"調(diào)用;
handlers/:此目錄中至少應(yīng)該有一個(gè)名為main.yml的文件,用于定義各handler;其它的文件需要由main.yml進(jìn)行"包含"調(diào)用;
vars/:此目錄中至少應(yīng)該有一個(gè)名為main.yml的文件,用于定義各variable;其它的文件需要由main.yml進(jìn)行"包含"調(diào)用;
templates/:存儲(chǔ)由template模塊調(diào)用的模板文本;
meta/:此目錄中至少應(yīng)該有一個(gè)名為main.yml的文件,定義當(dāng)前角色的特殊設(shè)定及其依賴關(guān)系;其它的文件需要由main.yml進(jìn)行"包含"調(diào)用;
default/:此目錄中至少應(yīng)該有一個(gè)名為main.yml的文件,用于設(shè)定默認(rèn)變量;
實(shí)驗(yàn):角色定制:roles
1、在roles目錄下生成對(duì)應(yīng)的目錄結(jié)構(gòu)
cd /etc/ansible/roles
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
我們就以定義nginx角色為例
2、定義tasks/main.yml的配置文件
vim /etc/ansible/roles/nginx/tasks/main.yml
- name: cp
copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm
- name: install
yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest
- name: conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
tags: nginxconf
notify: new conf to reload
- name: start service
service: name=nginx state=started enabled=true
3.將最新版本的nginx rpm包下載到/etc/ansible/roles/nginx/files下
cd /etc/ansible/roles/nginx/files
lftp 172.17.0.1
cd /pub/Sources/7.x86_64/nginx
get nginx-1.10.2-1.el7.ngx.x86_64.rpm
quit
4.在/etc/ansible/roles/nginx/templates中配置模板文件
cp /etc/nginx/nginx.conf /etc/ansible/roles/nginx/templates/nginx.conf.j2
vim nginx.conf.j2
將nginx監(jiān)聽端口和cpu顆數(shù)設(shè)置為變量
5.在/etc/ansible/roles/nginx/vars目錄下配置變量文件mian.yml
cd /etc/ansible/roles/nginx/vars
vim main.yml
nginxport: 6666
只配置端口變量就行了,cpu顆數(shù)變量是內(nèi)建的,不用聲明
6.配置handlers文件
cd /etc/ansible/roles/nginx/handlers
vim main.yml
- name: new conf to reload
service: name=nginx state=restarted
7.定義/etc/ansible/roles.yml的playbook文件
---
- hosts: web
remote_user: root
roles:
- nginx
只需定義主機(jī)組,遠(yuǎn)程連接的用戶和角色(角色可以配置多個(gè))
8.測(cè)試,執(zhí)行劇本
ansible-playbook roles.yml 執(zhí)行成功
查看端口
文件目錄結(jié)構(gòu):
.
├── httpd
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── mysql
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── nginx
├── default
├── files
│ └── nginx-1.10.2-1.el7.ngx.x86_64.rpm
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ └── nginx.conf.j2
└── vars
└── main.yml
總結(jié)
以上是生活随笔為你收集整理的企业级自动化运维工具应用实战-ansible的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 验证哥德巴赫猜想c语言算法,验证哥德巴赫
- 下一篇: 详细说明船木家具的特点