一、ansible基礎
6台虛拟機(2cpu,1.5G以上記憶體,10G以上硬碟,1塊網卡)
主機名 IP位址 角色
ansible40 192.168.4.40/24 管理主機
web41 192.168.4.41/24 托管主機
web42 192.168.4.42/24 托管主機
db43 192.168.4.43/24 托管主機
db44 192.168.4.44/24 托管主機
cache45 192.168.4.45/24 托管主機
1)ansible簡介
1.什麼是ansible
ansible是2013年推出的一款IT自動化和DevOps軟體,2015年被RedHat收購,是基于python研發,糅合很多老運維工具的優點,實作了批量作業系統配置,批量程式部署,批量運作指令等功能
ansible可以實作:
自動化部署APP
自動化管理配置項
自動化持續傳遞
自動化(AWS)雲服務管理
2.為什麼選擇ansible
選擇一款配置管理軟體,無外乎從以下幾點來權衡利弊
活躍度(社群)
學習成本
使用成本
編碼語言
性能
使用是否廣泛
ansible優點:
隻需要SSH和Python即可使用
無用戶端
ansible功能強大,子產品豐富
上手容易,門檻低
基于Python開發,做二次開發更容易
使用公司比較多,社群活躍
3.ansible特性
子產品化設計,調用特定的子產品完成特定任務
基于Python語言實作
paramiko
PyYAML(半結構化語言)
Jinja2
其子產品支援JSON等标準輸出格式,可以采用任何變成語言重寫
部署簡單
主從模式工作
支援自定義子產品
支援playbook
易于使用
支援多層部署
支援異構IT環境
4.工作流程
2)ansible安裝
1.軟體依賴關系
對管理主機
要求Python 2.6或2.7
ansible使用以下子產品,都需要安裝
paramiko
PyHAML
Jinja2
httplib2
six
對于被托管主機
ansible預設通過SSH協定管理機器
被管理主機要開啟ssh服務,允許ansible主機登入
在托管節點上也需要安裝Python2.5或以上的版本
如果托管節點上開啟了SELinux,需要安裝libselinux-python
2.安裝ansible
[[email protected] ~]# vim /etc/hosts
192.168.4.40 ansible40
192.168.4.41 web41
192.168.4.42 web42
192.168.4.43 db43
192.168.4.44 db44
192.168.4.45 cache45
安裝及驗證
在ansible托管主機上配置yum配置檔案
安裝 yum install ansible
驗證ansible --version
[[email protected] ~]# cd ansible/
[[email protected] ansible]# yum -y install *.rpm
[[email protected] ~]# ansible --version
二、ad-hoc
1.主機定義與分組
安裝ansible之後可以做一些簡單的任務
ansible配置檔案查找順序
首先檢測ANSIBLE_CONFIG變量定義的配置檔案
其次檢查目前目錄下的./ansible.cfg檔案
再次檢查目前使用者家目錄下的~/ansible.cfg檔案
最後檢查/etc/ansible/ansible.cfg檔案
/etc/ansible/ansible.cfg是ansible的預設配置檔案路徑
ansible.cfg配置檔案:
inventory定義托管主機位址配置檔案路徑名
inventory指定的配置檔案,寫入遠端主機的位址
格式:
#表示注釋
[組名稱]
主機名稱或ip位址,其他參數
ansible.cfg配置檔案:
ssh主機key驗證配置參數
host_key_checking = False
如果為False,不需要輸入yes
如果為True,等待輸入yes
分組定義,範圍定義樣例
[web]
web1
web2
[db]
db[1:2]
[other]
cache
[[email protected] ~]# vim /etc/ansible/ansible.cfg
14 inventory = /etc/ansible/hosts
61 host_key_checking = False
[[email protected] ~]# vim /etc/ansible/hosts
44 [web]
45 web41
46 web42
47
48 [db]
49 db43
50 db44
51
52 [other]
53 cache45
2.ansible指令基礎
ansible主機集合 -m 子產品名稱 -a 子產品參數
主機集合 主機名或分組名,多個使用逗号分隔
-m 子產品名稱,預設command子產品
-a or --args 子產品參數
-i inventory檔案路徑,或可執行腳本
-k 使用互動式登入密碼
-e 定義變量
-v 顯示詳細資訊
列出要執行的主機
ansible all --list-hosts
[[email protected] ~]# ansible all --list-hosts
hosts (5):
web41
web42
cache45
db43
db44
[[email protected] ~]# ansible web,db43 --list-hosts
hosts (3):
web41
web42
db43
批量檢測主機
ansible all -m ping -k
[[email protected] ~]# ansible web -m ping -k
SSH password:
3.部署證書檔案
ansible是通過SSH在遠端執行指令的
ssh遠端執行指令必須通過認證才行
密碼寫入配置檔案安全性很差
使用key認證
給所有主機部署公鑰
沒有密鑰指令執行會出錯
ansible web -a 'uptime'
[[email protected] ~]# cd /root/.ssh/
[[email protected] .ssh]# ssh-keygen -t rsa -b 2048 -N '' -f key
[[email protected] .ssh]# ssh-copy-id -i key.pub cache45 ==>>拷貝給所有主機
[[email protected] .ssh]# ssh web41 -i key ==>>指定私鑰
4.inventory擴充參數
ansible_ssh_port
ssh端口:如果不是預設的端口号,通過此變量設定
ansible_ssh_user
預設的ssh使用者名
ansible_ssh_pass
ssh密碼(這種方式不安全,建議采用--ask-pass或SSH密鑰)
ansible_ssh_private_key_file
ssh使用的私鑰檔案,适用于有多個密鑰,
vars變量定義,用于組名後面
例如:[all:vars]
ansible_ssh_private_key_file="/root/.ssh/key"
children子組定義,用于引用其他組名稱
例如:[app:children]
web
db
[[email protected] ~]# cat -n /etc/ansible/hosts
44 [web]
45 web41
46 web42
47
48 [db]
49 db43
50 db44 ansible_ssh_port=22 ==>>給單個主機定義變量
51
52 [other]
53 cache45
54
55 [all:vars]
56 ansible_ssh_private_key_file="/root/.ssh/key" ==>>給所有主機定義變量
57
58 [app:children]
59 web
60 db
自定義配置檔案
建立檔案夾myansible
建立配置檔案ansible.cfg
[[email protected] ~]# mkdir /myansible
[[email protected] myansible]# touch ansible.cfg
[[email protected] myansible]# vim ansible.cfg
1 [defaults]
2 inventory = myhosts
3 host_key_checking = False
[[email protected] myansible]# vim myhosts
1 [app1]
2 web41
3 db43
4
5 [app2]
6 web42
7 db44
8 cache45
5.動态主機
無限可能
ansible Inventory包含靜态和動态的Inventory,靜态Inventory指在檔案/etc/ansible/hosts中指定的主機群組,動态Inventory指通過外部腳本擷取主機清單,按照其要求格式傳回給ansible指令
Json
JSON(JavaScript Object Notation,Javascript對象表示法),一種基于文本獨立于語言的輕量級資料交換格式
三、批量配置管理
1.ansible-doc和ping子產品
ansible-doc
子產品的手冊相當與shell的man,很重要
ansible-doc -l 列出所有子產品
ansible-doc modulename 檢視幫助
ping子產品
測試網絡連通性,ping子產品沒有參數
[[email protected] ~]# ansible-doc -l
[[email protected] ~]# ansible-doc lineinfile
[[email protected] ~]# ansible all -m ping ==>>測試ssh的連通性
2.command子產品
預設子產品,遠端執行指令
用法;
ansible host-pattern -m command -a '[args]'
[[email protected] ~]# ansible all -m command -a 'uptime' ==>>檢視所有機器負載
[[email protected] ~]# ansible all -m command -a 'date +%F_%T' ==>>檢視日期和時間
注意事項:
該子產品通過-a跟上要執行的指令可以直接執行,若指令裡有如下字元則執行不成功,<,>,|,&。
command子產品不能解析系統變量
該子產品不啟動shell直接在ssh程序中執行,所有使用到shell的指令執行都會失敗
3.shell子產品
shell子產品用法基本和command一樣,差別是shell子產品是通過/bin/sh進行執行指令,可以執行任意指令
不能執行互動式的指令,如vim,top
[[email protected] ~]# ansible all -m shell -a 'uptime' ==>>檢視所有機器負載
變量解析
ansible執行指令是二次解析
第一次在本機解析,第二次在執行機器解析
需要二次解析的變量要轉義(\)
檔案在哪裡
檔案在使用者家目錄
ansible是使用ssh多次連接配接執行
連接配接退出之後之前的狀态就全部失效了
解決辦法:使用chdir代替cd指令
[[email protected] ~]# ansible cache45 -m shell -a 'chdir=/tmp touch testfile'
[[email protected] ~]# ansible cache45 -m shell -a 'touch /tmp/testfile1'
[[email protected] ~]# ansible web41,db44 -m shell -a 'useradd nb'
[[email protected] ~]# ansible web41,db44 -m shell -a 'echo 123456 |passwd --stdin nb'
4.scripts子產品
在本地寫腳本,然後使用scprit子產品批量執行
注意:該腳本包含但不限于shell腳本,隻要指定Sha-bang解釋器的腳本都可運作
[[email protected] ~]# vim userwk.sh
#!/bin/bash
id nb
if [ $? != 0 ];then
useradd wk
echo 123456 | passwd --stdin wk
fi
[[email protected] ~]# ansible web -m script -a 'userwk.sh'
5.yum子產品
使用yum包管理器來管理軟體包
name:要進行操作的軟體包名字
state:動作(installed,removed)
install === installed
remove === removed
[[email protected] ~]# ansible db -m yum -a 'name="mariadb-server" state=installed' ==>>給所有db主機安裝mariadb
[[email protected] ~]# ansible cache45 -m yum -a 'name="lrzsz" state=removed' ==>>cache45主機删除lrzsz
6.service子產品
name:必選項,服務名稱
enabled:是否開機啟動 yes|no
sleep:執行restarted ,會在stop和start之間沉睡幾秒鐘
state:對目前服務執行啟動,停止,重新開機,重新加載等操作(started,stopped,restarted,reloaded)
[[email protected] ~]# ansible cache45 -m service -a 'name="sshd" enabled="yes" state="started"'
7.copy子產品
複制檔案到遠端主機
src:複制本地檔案到遠端主機,絕對路徑和相對路徑都可以,路徑為目錄時會遞歸複制。若路徑以“/”解為,隻複制目錄裡的内容,若不以“/”結尾,則複制包含目錄在内的整個内容,類似rsync
dest:必選項,遠端主機的絕對路徑,如果源檔案是一個目錄,那該路徑必須是目錄
backup:覆寫前先備份原檔案,備份檔案包含時間資訊。有兩個選項:yes|no
force::若目标主機包含該檔案,但内容不同,如果設定為yes,則強制覆寫,設為no,則隻有當目标主機的目标位置不存在該檔案時财富值,預設為yes
[[email protected] ~]# ansible all -m copy -a 'src=/etc/resolv.conf dest=/etc/resolv.conf' ==>>複制檔案
[ro[email protected] ~]# ansible all -m copy -a 'src=/root/ dest=/root/'
8.lineinfile子產品
類似sed的一種行編輯替換子產品
path 目标檔案
regexp 正規表達式,要修改的行
line 最終修改的結果
[[email protected] ~]# ansible db -m lineinfile -a 'path="/etc/my.cnf" regexp="^binlog-format" line="binlog-format = row"'
9.replace子產品
類似sed的一種行編輯替換子產品
path 目标檔案
regexp 正規表達式
replace 最終修改的結果
[[email protected] ~]# ansible db -m replace -a 'path="/etc/my.cnf" regexp="row" replace="mixed"'
10.setup子產品
主要用于擷取主機資訊,playbooks裡經常會用的另一個參數gather_facts與該子產品相關,setup子產品常用filter參數
filter過濾所需資訊
[[email protected] ~]# ansible cache45 -m setup -a 'filter=ansible_distribution'
四、ansible七種武器
1.第一種武器
ansible指令,用于執行臨時性的工作,必須掌握
2.第二種武器
ansible-doc是ansible子產品的文檔說明,針對每個子產品都有詳細的說明及應用案例介紹,功能和Linux系統man指令類似,必須掌握
3.第三種武器
ansible-console是ansible為使用者提供的互動式工具,使用者可以在ansible-console虛拟出來的終端上像shell一樣使用ansible内置的各種指令,這位習慣使用shell互動方式的使用者提供了良好的使用體驗
4.第四種武器
ansible-galaxy從github上下載下傳管理Roles的一款工具,與python的pip類似
5.第五種武器
ansible-playbook是日常應用中使用頻率最高的指令,工作機制:通過讀取先編寫好的playbook檔案實作批量管理,可以了解為按一定條件組成的ansible任務及,必須掌握
6.第六種武器
ansible-vault主要用于配置檔案加密,如編寫好的playbook檔案中包含敏感資訊,不想他人随意檢視,可用它加密/解密這個檔案
7.第七種武器
ansible-pull
ansible有兩種工作模式pull/push,預設使用push模式工作,pull和push工作模式機制正好相反
适用場景:有大批量機器需要配置,即便使用高并發線程依舊要花費很多時間
通常在配置大批量機器的場景下使用,靈活性稍有欠缺,但效率幾乎可以無限提升,對運維人員的技術水準和前瞻性規劃有較高要求
五、JSON簡介
1.JSON是什麼
JSON是JavaScript對象表示法,它是一種基于文本獨立于語言的輕量級資料交換格式
JSON中的分割符号限于,單引号',小括号(),中括号[],大括号{},冒号:,逗号,。
2.JSON特性
JSON是純文字
JSON具有“自我描述性”(人類可讀)
JSON具有層級結構(值中存在值)
JSON可通過JavaScript進行解析
3.JSON文法規則
資料在名稱/值對中
資料由逗号分隔
大括号儲存對象
中括号儲存數組
4.JSON資料的書寫格式是:名稱/值對
名稱/值對包括字段名稱(在雙引号中),後面寫一個冒号,然後是值,例如:"詩仙":"李白"
5.JSON文法規則之數組
{"詩人":
["李白","杜甫","白居易","李賀"]
}
複合複雜類型
{"詩人":
[{"李白":"詩仙","年代":"唐"},
{"杜甫":"詩聖","年代":"唐"},
{"李賀":"詩鬼","年代":"唐"}
]
}
六、YAML簡介
1.YAML是什麼
是一個可讀性高,用來表達資料序列的格式
YAML(YAML Ain't Markup Language)
YAML參考了多種語言,如:C語言,Python,Perl等,并從XML,電子郵件的資料格式中獲得靈感,Clark Evans在2001年首次發表了這種語言,目前已有數種程式設計語言或腳本語言支援這種語言
2.YAML文法簡介
YAML的結構通過空格來展示
數組使用-表示
鍵值對使用:表示
YAML使用一個固定的縮進風格表示資料層級結構關系
一般每個縮進級别由兩個以上空格組成
#表示注釋
注意事項:
不要使用tab,縮進是初學者容易出錯的地方之一
同一層級縮進必須對齊
3.YAML的鍵值表示方法
采用冒号分隔
:後面必須有一個空格
例如:
"詩仙": "李白"
或
"李白":
"詩仙"
複雜YAML的鍵值對嵌套
例如:
"詩人":
"李白": "詩仙"
或
"詩人":
"李白":
"詩仙"
4.YAML數組表示方法
使用一個端橫杠加一個空格
例如:
- "李白"
- "杜甫"
- "李賀"
哈希數組複合表達式
"詩人":
- "李白"
- "杜甫"
- "李賀"
5.進階複合表達式
例如:
"詩人":
-
"李白": "詩仙"
"年代": "唐"
-
"杜甫": "詩聖"
"年代": "唐"
-
"李賀": "詩鬼"
"年代": "唐"