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