馬哥學習----李洋個人筆記----ansible學習心得
LINUX發展趨勢:越來越強大的工具,通過子命令來實現,而不是通過選項。
ANSIBLE擁有上千個模塊(子命令),ANSIBLE適用於200臺機器以上
運維自動化發展歷程及技術應用(以吃飯舉例)
最開始:本地部署-----在家自己做(on-premises)
接下來:操作系統-----買成品回去加工 (laas)
然後是:軟件-----------叫外賣(paas)
最後是:服務-----------去飯店吃(saas)
ANSIBLE學習功能簡介:
Ansible命令使用
? Ansible常用模塊詳解
? YAML語法簡介
? Ansible playbook(劇本)基礎,可以理解為ansible自身的腳本
? Playbook變量、tags、handlers使用
? Playbook模板templates
? Playbook條件判斷 when
? Playbook字典 with_items
? Ansible Roles(角色)可以理解為多個playbook的組合
運維工程師職能:
1 平臺架構組建:
負責參與並審核架構設計的合理性和可運維性,搭建運維平臺技術架構,通過開源解決方案,以確保在產品發布之後能高效穩定的運行,保障並不斷提升服務的可用性,確保用戶數據安全,提升用戶體驗。
2 日常運營保障
負責用運維技術或者運維平臺確保產品可以高效的發布上線,負 責保障產品7*24H穩定運行,在 此期間對出現的各種問題可以快 速定位並解決;在日常工作中不斷優化系統架構和部署的合理性, 以提升系統服務的穩定性。
3 性能,效率優化
用自動化的工具/平臺提升軟件在研發生命周期中的工程效率。不 斷優化系統架構、提升部署效率、優化資源利用率支持產品的不斷 叠代,需要不斷的進行架構優化調整。以確保整個產品能夠在功 能不斷豐富和復雜的條件下,同 時保持高可用性。
Linux運維工程師職能劃分,以發布軟件為例,如下圖:
企業實際應用場景分析
Dev開發環境--對應上圖中的1.
使用者:程序員
功能:程序員開發軟件,測試BUG的環境
管理者:程序員
測試環境--對應上圖中的2
使用者:QA測試工程師
功能:測試經過Dev環境測試通過的軟件的功能
管理者:運維
說明:測試環境往往有多套,測試環境滿足測試功能即可,不宜過多
1、測試人員希望測試環境有多套,公司的產品多產品線並發,即多個版本,意味著多個版本同步測試
2、通常測試環境有多少套和產品線數量保持一樣
發布環境:代碼發布機,有些公司為堡壘機(安全屏障)--對應上圖中的3
使用者:運維
功能:發布代碼至生產環境,一般是堡壘機(不是所有機器都可以連到生產環境)
管理者:運維(有經驗)
發布機:往往需要有2臺(主備)
生產環境—對應上圖中的4
使用者:運維,少數情況開放權限給核心開發人員,極少數公司將權限完全開放給開發人員並其維護
功能:對用戶提供公司產品的服務
管理者:只能是運維
生產環境服務器數量:一般比較多,且應用非常重要。往往需要自動工具協助部署配置應用。
灰度環境(生產環境的一部分)--對應上圖中的5
使用者:運維
功能:在全量發布代碼前將代碼的功能面向少量精準用戶發布的環境,可基於主機或用戶執行灰度發布(假設共100臺生產服務器,先發布其中的10臺服務器,等這10臺機器使用沒有重大問題的時候,再全部發布。這種發布方式就叫灰度發布)
管理者:運維
灰度環境:往往該版本功能變更較大,為保險起見特意先讓一部分用戶優化體驗該功能,待這部分用戶使用沒有重大問題的時候,再全量發布至所有服務器
程序發布要求:
1 不能導致系統故障或造成系統完全不可用
2 不能影響用戶體驗
? 預發布驗證:
新版本的代碼先發布到服務器(跟線上環境配置完全相同,只是未接入到調度器)
? 灰度發布:
? 發布路徑:
/webapp/tuangou--------正在使用的版本(這是個軟鏈接,平時指向位置是老版本,如有新版本程序上線到服務器上,將軟鏈接指向為新版本即可。)
/webapp/tuangou-1.1----老版本
/webapp/tuangou-1.2-----新版本
? 發布過程:在調度器上下線一批主機(標記為maintanance狀態) --> 關閉服務 --> 部署新版本的應用程序 --> 啟動服務 --> 在調度器上啟用這一批服務器
? 自動化灰度發布:腳本、發布平臺
調度器工作原理
自動化動維應用場景
文件傳輸--------比如把配置好的sulinux文件傳送到每個服務器上
命令執行--------比如安裝程序包,會包含:
應用部署
配置管理--------修改某個應用的配置文件,或者安裝路徑
任務流編排------命令執行的先後順序
這些任務都需要使用自動化運維工具來實現
常用自動化運維工具
Ansible:使用python來開發的,無需設置Agentless(代理),一般管理幾百臺。與ssh的方式也不一樣,ssh是基於c/s模式(客戶端+服務器)來使用服務端提供的服務,屬於多臺客戶端訪問一臺服務器。而ansible是控制端,使用裝了ansible的主機管理多臺主機。也叫做主控端。Ansible是通過ssh端口來實現無代理配置。
Saltstack:使用python語言開發,一般需部署agent(代理),執行效率更高,一般管理幾千臺。
Puppet:使用ruby語言開發,功能強大,配置復雜,適合大型環境(了解即可)
下面這些使用者較少,不做介紹
Fabric:使用python語言開發,agentless(不需要設置代理)
Chef: 使用ruby語言開發
Cfengine
Func
Ansible特性
模塊化:調用特定的模塊,完成特定任務
有Paramiko(基於ssh的開發語言),PyYAML(YAML語言),Jinja2(模板語言)這三個關鍵模塊,並支持自定義模塊
基於Python語言實現
部署簡單,基於python和SSH(默認已安裝),agentless(不需要設置代理)
安全,基於OpenSSH
支持playbook編排任務
冪等性:一個任務執行1遍和執行n遍效果一樣,不因重復執行帶來意外情況
無需代理不依賴PKI(無需ssl)
可使用任何編程語言寫模塊
YAML格式,編排任務,支持豐富的數據結構
較強大的多層解決方案
ansible架構圖:
用戶通過ANSIBLE來下達指令,通常是逐條命令執行。可以通過公有/私有雲來實現遠程管理.
主機庫存中包含著所有主機的列表,通過主機分組及連接插件來實現管理不同的主機,給一些主機升級,一些主機創建用戶等目的。
劇本是用在批量,定期做例行性工作的時候,比如定期做備份等等。在復雜一些的情況會使用角色(Roles),相當於多個劇本的組合。
Ansible主要組成部分
ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主機的清單,位於/etc/anaible/hosts文本文件中,內容為要管理的主機的名稱或IP地址.
MODULES:Ansible執行命令的功能模塊,多數為內置核心模塊,也可自定義
PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插
件等,該功能不常用
API:供第三方程序調用的應用程序編程接口
ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解為是ansible命令工具,其為核心執行工具
Ansible命令執行來源:
1 USER,普通用戶,SYSTEM ADMINISTRATOR(系統管理員)
2 CMDB(配置管理數據庫) API 調用(需要開發接口)
3 PUBLIC/PRIVATE CLOUD API調用(需要開發接口)
4 USER-> Ansible Playbook -> Ansibile(運維工程師通常用這種方式)
利用ansible實現管理的方式:
1 Ad-Hoc 即單條ansible命令,主要用於臨時命令使用場景
2 Ansible-playbook 主要用於長期規劃好的,大型項目的場景,需要有前提的規劃
Ansible-playbook(劇本)執行過程:
將已有編排好的任務集寫入Ansible-Playbook,通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行
Ansible主要操作對象:
HOSTS主機
NETWORKING網絡設備
註意事項
執行ansible的主機一般稱為主控端,中控,master或堡壘機
主控端Python版本需要2.6或以上
被控端Python版本小於2.4需要安裝python-simplejson
被控端如開啟SELinux需要安裝libselinux-python
windows不能做為主控端
ansible安裝:配置好倉庫的epel源,直接yum install ansible即可。
確認版本號: ansible –version
? ansible的配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,大部分配置不用修改,默認值即可.
/etc/ansible/hosts 主機清單,要控制的主機必須存放在這個文件中。
/etc/ansible/roles/ 存放角色的目錄,角色可理解為多個劇本的集合
? ansible的程序
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具(很多模塊的幫助信息都在這裏,相當於man)
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定制自動化任務,編排劇本工具/usr/bin/ansible-pull 遠程執行命令的工具(pull,拉取的意思。有時候把別人的文件拉取到我這來,有時候把我的東西推送到別人那)
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具
如何使用ansible
第一步,先配置好主機清單。
ansible的主要功用在於批量主機操作,為了便捷地使用其中的部分主機,可以
在inventory file(清單文件)中將其分組命名
默認的inventory file(清單文件)為/etc/ansible/hosts。主機清單可以有多個,且也可以通過Dynamic Inventory(動態庫存)來動態生成。
配置主機清單的格式
Ansible: /etc/ansible/hosts文件格式
Inventory(清單)文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機同時歸並到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口, 還可以在主機名稱之後使用冒號加端口號來標明嗎,比如:
ntp.magedu.com---------------主機名
[webservers]---------------組名
www1.magedu.com:2222--------主機名,但端口號為2222。屬於webservers組
www2.magedu.com--------------主機名,屬於webservers組
[dbservers]----------------組名
db1.magedu.com-------------主機名,屬於dbservers組.
db2.magedu.com-------------主機名,屬於dbservers組.
db3.magedu.com-------------主機名,屬於dbservers組.
如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機,比如:
[websrvs]-------------------組名
www[01:100].example.com-----主機名,拆分開後為從www01.example.com開始,到www100.example.com結束的主機名集合。
[dbsrvs]--------------------組名
db-[a:f].example.com--------主機名,拆分開後為從db-a.example.com開始,到db-f.example.com結束的主機名集合。
最簡單的:只寫IP名,完事
ansible 的配置文件
/etc/ansible/ansible.cfg (一般保持默認)
[defaults] 默認值
#inventory = /etc/ansible/hosts # 主機列表配置文件
#library = /usr/share/my_modules/ # 庫文件存放目錄
#remote_tmp = ~/.ansible/tmp #臨時py命令文件存放在遠程主機目錄#local_tmp = -------------~/.ansible/tmp # 本機的臨時命令執行目錄
#forks = 5-----------------# 默認並發數
# poll_interval = 15------# 拉取時候的時間間隔(默認為秒)
#sudo_user = root---------# 默認sudo 用戶
#ask_sudo_pass = True-----# 每次執行ansible命令是否詢問ssh密碼#ask_pass = True
#remote_port = 22
#host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋
這樣在大批量第一次連接時,就不用一個一個去敲yes了.
#log_path=/var/log/ansible.log #日誌文件,建議取消註釋使其生效.
Ansible系列命令(紅色部分為重點掌握)
1 ansible---------------程序主題,逐條執行命令
2 ansible-doc-----------相當於man ansible
3 ansible-playbook------劇本,類似於shell的腳本
4 ansible-vault---------加密的
5 ansible-console-------控制臺
6 ansible-galaxy--------配置角色的
7 ansible-pull----------將自己或別人的文件拉取或推廣到別人或自己那
ansible-doc: 顯示模塊幫助,格式為:
ansible-doc [options] [module...]
-a 顯示所有模塊的文檔
-l, --list 列出可用模塊
-s, --snippet 顯示指定模塊的playbook片段(即簡要說明)
示例:
ansible-doc –l 列出所有可用模塊
ansible-doc ping 查看指定模塊幫助用法
ansible-doc –s ping 查看指定模塊的劇本片段示例
ansible使用示例
# ansible 192.168.10.7 –m ping 使用ansible去ping一個ip地址
# ansible使用ssh進行連接,默認為驗證key的方式,如果目標地址做了key驗證,則能ping通,否則報錯。
如果想使用用戶名密碼的形式來ping,需要加上-k選項,如只寫-k則使用當前用戶去連接目標IP.
Ansible格式
ansible <host-pattern> [-m module_name] [-a args]
host-pettern是指在主機管理列表中的主機,可以是分組的組名,也可是要管理的主機的IP地址,或者是ALL(對所有主機進行管理.)
-version 顯示版本
-m module 指定模塊,默認為command,有些模塊後面還有參數,比如yum模塊,這時候會用到-a args(參數)來確定是執行yum的安裝or卸載。
-v 詳細過程 –vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫為—list
-k, --ask-pass 提示輸入ssh連接密碼(即用戶名密碼),默認是Key驗證(需要更改配置文件,將其中的#host_key_checking = False註釋去掉)
-K, --ask-become-pass 提示輸入sudo時的口令(key沒註釋掉的情況下,如果key加密了,則還會要求輸入key的密碼(見圖片1)。如果註釋掉了key,則需要與-k來一起使用,否則會報錯,拒絕權限見圖片2和圖片3)
以zhang sudo至root用戶執行ls
# ansible 192.168.10.227 –m command –a ‘ls /root ’ –u zhang –k –b -K
輸入兩次密碼很煩人,還能改為key驗證的方式.
# ssh-keygen 在/root/ssh下生成秘鑰對
# ssh-copy-id 192.168.10.227 將公鑰拷貝至目標IP
# ansible 192.168.10.227 -m command -a ‘ls /root‘
# 完成
如果主機數目很多的話,那麽將IP改為ALL,就相當於把ansible主機列表中的所有主機執行這條命令.
# # ansible all -m command -a ‘ls /root‘
-C, --check 檢查,並不執行,通常用來查看配置的環境是否正確.
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶
-b, --become 代替舊版的sudo 切換
ansible命令執行過程
1. 加載自己的配置文件 默認/etc/ansible/ansible.cfg
2. 加載自己對應的模塊文件,如command
3. 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME(家目錄)/.ansible/tmp/ansible-tmp-數字(數字為隨機生成)/XXX.PY文件
4. 給文件+x執行
5. 在對方主機上執行並返回結果
6. 刪除臨時py文件,sleep 0退出並返回到主控端.
執行狀態:
綠色:執行成功並且不需要做改變的操作
×××:執行成功並且對目標主機做變更
紅色:執行失敗
ansible的Host-pattern 匹配主機的列表
All :表示所有Inventory中的所有主機
# ansible all –m ping
*:通配符
# ansible “*” -m ping
# ansible 192.168.1.* -m ping
# ansible “*srvs” -m ping
或關系
# ansible “websrvs:appsrvs” -m ping
# ansible “192.168.1.10:192.168.1.20” -m ping
# 去ping在websrvs組的主機或者在appsrvs組的主機。也就是這兩個組的所有主機都會參與ping。
邏輯與
# ansible “websrvs:&dbsrvs” –m ping
# 去ping在websrvs組,並且在dbsrvs組中的主機。只有同時在這兩個組的主機才會執行ping命令。
邏輯非
# ansible ‘websrvs:!dbsrvs’ –m ping
# 在websrvs組,但不在dbsrvs組中的主機註意:此處為單引號
綜合邏輯
# ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
# ping在websrvs組或者在dbsrvs組,與 在appsrvs組並且不在ftpsrvs組的主機.即ping websrvs組的所有主機,同時在dbsrvs與appsrvs組的主機。
正則表達式
# ansible “websrvs:&dbsrvs” –m ping
# ansible “~(web|db).*\.magedu\.com” –m ping
# 去ping 在web組或著在db組,所有以.magedu.com結尾的主機。註意:正則表達式開始用~波浪線開始
ansible常用模塊
Command:在遠程主機執行命令,默認模塊,可忽略-m選項。
允許在執行命令時候,實現指定好目錄.
# ‘ls /root’ = ‘chdir=/root ls’ 這倆命令是等價的
判斷條件,如果文件存在,則不執行命令。
# ansible all –m command –a ‘creates=/etc/fstab ls /root’
# 如果存在/etc/fstab文件,則不執行 ls /root 命令.
# ansible srvs -m command -a ‘service vsftpd start’與
# ansible srvs -a ‘service vsftpd start’等價
# 開啟srvs組主機的vsftpd服務。
# ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功,因為此模塊不支持$VARNAME < > | ; & 等,只能用shell模塊來實現。
Shell:和command相似,用shell執行命令,一般在重定向,變量之類的時候用,也可以理解為增強型的command. 可以在/etc/ansible/ansible.cfg中修改默認shell.
# ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
# 將srv組中的主機的wang用戶面變更為magedu.
PS:調用bash執行命令 類似cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>/tmp/example.txt 這些復雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器.但是這樣也麻煩,可以使用script模塊來解決這個問題.
Script:運行腳本(很實用)
# snsible -m –script -a "/PATH/TO/SCRIPT_FILE“
# 運行指定路徑下的腳本文件,比如:
# snsible websrvs -m script -a f1.sh
# 在控制端編寫腳本,然後將其放在被控端主機的指定路徑中來運行,並將運行的結果返回到控制端。
Copy:從服務器復制文件到客戶端。主要參數選項:backup 復制過去的文件,如果存在的話默認是覆蓋,使用backup後不會覆蓋源文件,而是作為備份存在。
content 復制過去的目錄或文件,用content來代替src選項的話,可以用指定內容來替代本來用src指定的文件的內容。通常是中控機上要已存這個目標文件。但是這些文件放在中控機上也不便管理,並且目標文件如果丟失的話,在運行這個與ansible的playbook相關任務時就會報錯。通過copy模塊的content選項是可以將這個文件的內容就寫在playbook中。
dest (必須填寫的參數)復制過去的文件放在何處,需要指定一個絕對路徑。
如果復制過去文件類型是一個文件夾,那麽指定路徑也必須是一個文件夾。
如果指定路徑的目錄不存在,且復制過去的文件路徑以/結尾的,那麽該目錄會被創建。PS:如果復制過去的文件,和指定的路徑都是文件,但是指定路徑的父目錄不存在的話,則會失敗(比如要復制文件到/app/date中去,如果/app不存在的話,就報錯失敗)復制目錄時,以/結尾的,是復制這個目錄裏面的內容但不包括本身,不以/結尾的,是復制這個目錄本身及其裏面的內容
mode 修改權限,復制的時候可以修改下文件權限
group 重新指定所屬組
owner 更改所屬人
# ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh
owner=wang mode=600 backup=yes”
# 將控制端中的 /root/f1.sh復制到srv組中所有主機的/tmp/目錄下,名字改為f2.sh (只寫/tmp/意味著不改名)所屬人改為wang用戶,權限改為600,如果f2.sh事先存在,默認覆蓋,此處指定先備份指定了(backup)
# ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt”# 使用content產生內容,直接生成目標文件,保存路徑及名字為/tmp/f1.txt
內容為 test content+換行符號.
Fetch:從客戶端取文件至服務器端,與copy相反,目錄可先tar
# ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
# 將srv組中的/root/a.sh文件,拉取到控制端的/date/scripts目錄裏.這裏的src指的是被控端的源文件,與copy相反.每一個主機都會單獨建一個以IP為名字的目錄.
File:設置文件屬性
src:創建軟硬鏈接
path:必須要的選項,指明路徑.
state: 具體執行結果取決於等號後面的值.,具體如下:
directory:如果文件不存在,創建目錄
file:即使文件不存在,也不會被創建
link:創建軟連接
hard:創建硬鏈接
touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最後修改時間
absent:刪除目錄、文件或者取消鏈接文件.路徑不存在的話無操作.
# ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
# 將svw組中的主機,家目錄下的a.sh文件的所屬人改為wang,權限改為755.
# ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
# 將web組中的主機,創建一個軟鏈接.將控制端的/app/testfile做成鏈接,指向為被控端的/app/testfile-link,鏈接方式為link.???
Hostname:管理主機名
# ansible node1 -m hostname -a “name=websrv”
# 將nodel組的主機,名字改為websrv,永久更改.
Cron:計劃任務
name可以給計劃任務起名字,通過這個名字來刪除指定的計劃任務.
disabled 暫時停止指定的計劃任務。
state 值為absent(缺席)時候為刪除,值為present(出席)為創建
time minute,hour,day,month,weekday分,時,天,月,周的格式.
job 後面跟命令,只能跟命令的絕對路徑.比如想執行ls命令.寫為:
job= /usr/bin/ls
# ansible all -a ‘crontab -l’(需要將默認模塊改為shell)
# 查看所有主機上有無計劃任務
# ansible all -m cron -a "minute=*/5 weekday=1-5 job=‘/usr/sbin/nptdate 192.168.10.228&> /dev/null‘ name=synetime"
# 創建一個名字為synetime的計劃任務,每周一到周五,每隔5分鐘,與192.168.10.228的時間同步一次。
計劃任務可以暫時停止掉,取消暫停刪除 disabled=yes即可。
# ansible all -m cron -a "minute=*/5 weekday=1-5 job=‘/usr/sbin/nptdate 192.168.10.228&> /dev/null‘ name=synetime disabled=yes"
刪除計劃任務
# ansible all -m cron -a ‘name=synetime state=absent‘
# 刪除名字為synetmie的計劃任務
Yum:管理包
name 數據包名,可以接版本號。比如 name=ansible1.0等等。
state值為 present是安裝,值為absent為刪除。
# ansible srv -m yum -a ‘name=httpd state=present’
# 將srv組的主機,安裝名字為 httpd的程序包。PS:已經安裝的機器不會再次安裝
# ansible srv -m yum -.a ‘name=httpd state=absent’
# 將srv組的主機,安裝名字為 httpd的程序包。
Service:管理服務
# ansible srv -m service -a ‘name=httpd state=stopped‘
# 將srv組的主機,停止名字為httpd的服務,如下圖
# ansible srv -m service -a ‘name=httpd state=started‘
# 將srv組的主機,啟動名字為httpd的服務
# ansible srv –m service –a ‘name=httpd state=reloaded’
# 將srv組的主機,重新加載名字為httpd的服務(熱加載)。
# ansible srv -m service -a ‘name=httpd state=restarted‘
# 將srv組的主機,重新啟動名字為httpd的服務。
User:管理用戶
name 必選項,指定用戶名
passwd 加密
remove 配合 state=absent使用,刪除指定用戶的家目錄及郵箱等等,類似於(userdel -r)命令。
group 指定主組
groups 指定附加組,可以指定多個。
# ansible srv -m user -a ‘name=user1 comment=“test user” uid=2048 home=/app/user1 group=root’
# 將srv組所在的主機,創建一個用戶,名字為user1,註釋信息為test user,其UID號為2048.家目錄為/app/user1 主組為root組.
# ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1 ’
# 將srv組所在的主機,創建一個系統用戶,名字為sysuser1,家目錄為/app/sysuser1
# ansible srv -m user -a ‘name=user1 state=absent remove=yes’
# 加上remove=yes刪除用戶時,其家目錄等數據也會被刪除.
Group:管理組
# ansible srv -m group -a "name=testgroup system=yes”
# 創建系統用戶組 testgroup
# ansible srv -m group -a "name=testgroup state=absent"
# 刪除名為testgroup用戶組.
總結:服務,用戶,組屬於基本操作.
配置服務基本一個流程:
1 安裝服務的數據包
2 更改配置文件.機器數量多的時候,可以用主控端下載一個完全一致的數據包,將其中的配置文件修改完畢後,使用copy模塊將其推送到被控制端.
3 準備服務所需的數據,比如數據庫之類的. 準備數據也可以在主控端配置,然後使用copy模塊一並推送過去.
4 準備完畢後,啟動服務即可.
ansible系列命令之ansible-galaxy
ansible-galaxy是一個網站共享和下載 Ansible 角色,是幫助 roles (角色)更好的工作的命令行工具。多個ansible命令=playbook(劇本),多個劇本=角色(roles)使用方式: 連接 https://galaxy.ansible.com 下載相應的roles,這裏的roles大多是別人分享的ansible工具,包括了系統,安全,網絡,雲,數據包等等這些分類.
安裝galaxy
# ansible-galaxy install ajsalminen.hosts
列出所有已安裝的galaxy
# ansible-galaxy list
刪除galaxy
# ansible-galaxy remove ajsalminen.hosts(將文件刪除也算卸載)
ansible系列命令之ansible-pull
pull是推送命令至遠程再執行,效率無限提升,對運維要求較高
Ansible-playbook 相當於shell當中的腳本 ,參考下面的劇本文件:
ansible-playbook hello.yml 使用yml結尾的是劇本文件,正文最上面加上三個- 來表示這個是一個劇本文件,類似於shell腳本中的 #! /bin/bash
# cat hello.yml -----打開劇本文件
--- ======================約定俗成的做法,不加也不會出錯.
#hello world yml file---------註釋信息
- hosts: websrvs--------------要連接的主機的組名
Remote_user: root ------------以那個用戶的身份登錄(固定寫法)
tasks:------------------------任務,表明下面的內容是描述任務的
- name: hello world------------任務的名稱,註釋信息
command: /usr/bin/wall hello world ---真正要做的事情,command相當於模塊名, /usr/bin/wall hello world相當於模塊後面,-a 之後的指令.
最終執行後的結果,使用廣播wall發一條消息 hell world…
ansible系列命令之Ansible-vault
功能:管理加密解密yml文件,格式及選項:
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
# ansible-vault encrypt hello.yml 加密
# ansible-vault decrypt hello.yml 解密
# ansible-vault view hello.yml 查看(需要輸入之前設定的密碼才可以)
# ansible-vault edit hello.yml 編輯加密文件
# ansible-vault rekey hello.yml 修改口令
# ansible-vault create new.yml 創建新文件(創建的時候就設置了密碼)
ansible系列命令之 Ansible-console:2.0+新增,可交互執行命令,支持tab
# root@test (2)[f:10] $
# 執行用戶@當前操作的主機組 (當前組的主機數量)[f:並發數]$
設置並發數: forks n 例如: forks 10 (默認值為5)
切換組: cd 主機組 例如: cd web 切換為web組。
列出當前組主機列表: list
列出所有的內置命令: ?或help
示例:
# root@all (2)[f:5]$ list
# 列出所有被控端的IP地址。
# root@all (2)[f:5]$ cd appsrvs
# 切換至appsrvs組。
# root@appsrvs (2)[f:5]$ list
# 列出appsrvs組的所有主機IP地址。
# root@appsrvs (2)[f:5]$ yum name=httpd state=present
# 在appsrvs組的主機上安裝httpd服務。
# root@appsrvs (2)[f:5]$ service name=httpd state=started
# 在appsrvs組的主機上,將httpd服務啟動。
ansible之playbook
playbook是由一個或多個“play”組成的列表
play的主要功能在於將事先歸並為一組的主機裝扮成事先通過ansible中的task 定義好的角色。從根本上來講,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。
Playbook采用YAML語言編寫,格式簡介
1 在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
2 次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
3 使用#號註釋代碼
4 縮進必須是統一的,不能空格和tab混用
5 縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的
6 YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感
7 k/v的值可同行寫也可換行寫。同行使用:分隔
8 v可是個字符串,也可是另一個列表
9 一個完整的代碼塊功能需最少元素需包括 name: task
10 一個name只能包括一個task
11 YAML文件擴展名通常為yml或yaml
馬哥學習----李洋個人筆記----ansible學習心得