1. 程式人生 > >馬哥學習----李洋個人筆記----ansible學習心得

馬哥學習----李洋個人筆記----ansible學習心得

server books 出錯 pts images 此外 .com handlers play

自動運維化工具 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學習心得