常用自動化運維工具:
Ansible:python,Agentless,中小型應用環境
Saltstack:python,一般需要部署agent,執行效率高
Puppent:ruby,功能強大,配置複雜,適合大型環境
Fabric:python,agentlees
Ansible特性:
- 模塊化:調用特定的模塊,完成特定任務
- 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
- 支持自定義模塊
- 基於Python語言實現
- 部署簡單,基於python和ssh,agentless
- 安全,基於openssh
- 支持playbook編排任務
- 冪等性:一個任務執行1遍和執行n遍效果一樣,不會因爲重複執行而帶來意外情況
- 無須代理不依賴PKI(無須SSL)
- 可使用任何編程語言寫模塊
- YAML格式,編排任務,支持豐富的數據結構
- 較強大的多層解決方案
Ansible架構:
User通過主控端ansible控制host,ansbile裏有一個host lnventory 主機清單記錄着哪些主機是要被控制的,模塊用於單一的命令,如果要執行多條任務就要用到playbook批量執行。 要連接被控制主機就要用到Connection plugins連接插件基於SSH協議來執行。不僅可以使user用戶來管理,也可以利用私有云或公有云開發接口來進行管理。
Ansible工作過程:
1、加載自己的配置文件/etc/ansbile/ansbile.cfg
2、加載自己對應的模塊文件,如command
3、通過ansbile模塊或命令生成對用的臨時py文件,並將該文件傳輸至遠程服務器的對應用戶$HOME/.ansbile/tmp/ansible-tmp-數字/xxx.py文件
4、給文件+x執行
5、執行並返回結果
6、刪除臨時py文件,sleep 0退出執行狀態:
- 綠色:執行成功並且不需要做改變的操作
- yellow色:執行成功並且對目標主機做變更
- 紅色:執行失敗
Ansbile主要組成部分:
- Ansbile playbooks:任務劇本(任務集),編排定義ansible任務集的配置文件,由ansbile順序依次執行,通常是JSON格式的文件。
- Inventory:ansible管理主機的清單/etc/ansbile/hosts
- Modules:ansbile執行命令的功能模塊,多數爲內置核心模塊,也可自定義
- Plugins:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
- Api:供第三方程序條用的應用程序編程接口
- Ansbile:組合inventory、api、modules、plugins的綠框,可以理解爲是ansbile命令工具,其爲核心執行工具
注意事項:
- 執行ansible的主機一般稱爲主控端、中控、master或堡壘機
- 主控端python版本需要2.6或以上
- 被控端python版本小於2.4需要安裝python-simplejson
- 被控端如開啓SElinux需要安裝libselinux-python
- Windows不能作爲主控端
Ansible的安裝
rpm包安裝:EPEL源
yum install ansible
Git方式:
Git clone git://github.com/ansible/ansbile.git --recursive
cd ./ansbile
source ./hacking/env-setup
還有編譯安裝、pip安裝這裏就不寫了。本次安裝採用yum安裝epel源
- 主控端:ansible 192.168.32.104
- 被控端:node-1 192.168.32.105
- node-2 192.168.32.106
在主控端ansible節點安裝ansbile
[root@ansible ~]# yum install -y ansible 看下ansbile詳細信息 [root@ansible ~]# yum info ansible Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com Installed Packages Name : ansible Arch : noarch Version : 2.4.2.0 //本次安裝的是2.4版本 Release : 2.el7 Size : 38 M Repo : installed From repo : extras Summary : SSH-based configuration management, deployment, and task execution system URL : http://ansible.com License : GPLv3+ Description : : Ansible is a radically simple model-driven configuration management, : multi-node deployment, and remote task execution system. Ansible works : over SSH and does not require any software or daemons to be installed : on remote nodes. Extension modules can be written in any language and : are transferred to managed machines automatically.
Ansbile相關文件:
配置文件:
- /etc/ansible/ansible.cfg 主配置文件,配置ansbile工作特性
- /etc/ansbile/hosts 主機清單
- /etc/ansbile/roles 存放角色的目錄
- 程序:
- /usr/bin/ansbile 主程序,臨時命令執行工具
- /usr/bin/ansbile-doc 查看配置文檔,模塊功能查看工具
- /usr/bin/ansbile-galaxy 下載/上傳代碼或role模塊的官網平臺
- /usr/bin/ansbile-playbook 定製自動化任務,編排劇本工具/usr/bin/ansbile-pull遠程執行命令的工具
- /usr/bin/ansbile-vault 文件加密工具
- /usr/bin/ansbile-console 基於Console界面與用戶交互的執行工具
主機清單inventory:
inventory主機清單:
- ansbile的主要功能用在於批量主機操作,爲了便攜地使用其中的部分主機,可以在inventory file中將其分組命名。
- 默認的inventory file爲/etc/ansbile/hosts
- Inventory file也可以有多個,且也可以通過dynamic inventory來動態生成
演示被控端主機是否存活:
要使用ansbile中的ping模塊,這裏的ping不是windows中的ping命令,只是同名而已,如果被控主機存活則回覆pong。
警報信息:主機清單列表是空的,只有本機可用 本機可用那就用本機測試一下看看
還是有警報信息:忽略本機 所以要去配置主機清單文件 [root@ansible ~]# vim /etc/ansible/hosts 光標跳到最下面添加要加入主機清單的主機 192.168.32.105 192.168.32.106 保存退出,然後在執行一次ping模塊命令看看行不行
看到這個就可以確定連接插件走的是SSH協議
報錯:不可到達目標主機,因爲沒有基於Key的驗證,所以不能隨便連接其他主機 如果不做基於Key的驗證就要在命令後面加上-k(輸入對應的用戶名指令)
這裏的口令是被控端主機的口令
輸入正確口令後,被控主機存活就會回覆一個pong 默認情況下ssh登錄比較慢,如果有需要可以修改ssh配置文件 [root@ansible ~]# vim /etc/ssh/sshd_config 將UseDNS yes 改成no GSSAPIAuthentication yes 也改成no 這裏是給一個主機測試存活,如果是多個主機那麼該輸入誰的口令(口令不一樣)?
在這裏輸入的是node-1主機的口令,所以只能測試node-1主機不能去測試node-2主機 而且發送的順序也不一樣,命令中是105在前106在後,而回覆信息中是先發送的106最後是105。所以輸口令這種方式只能適合所有主機一樣的口令,那麼主機口令不一樣就要基於Key的驗證來實現。 接着上面的繼續做,如果把node-2主機的口令修改成和node-1的口令一樣,那麼會成功嗎?
可以看到node-2還是錯的,口令明明都一樣了爲什麼還是錯的呢? 這是因爲known_hosts文件只記住了第一次成功的主機口令
可以看到這裏沒有node-2的口令 那用ssh直接連接node-2呢?會不會成功?
可以連,然後在用ping模塊試一下呢?
這回成功了。爲什麼呢? 因爲上次失敗了就記住了這臺主機是不可信的,所以在此用ansbile連接的時候還是報錯不會再讓你連接。所以只能手工ssh協議連接node-2讓known_hosts文件記住node-2的正確口令
所以最好的解決辦法就是做基於key的驗證,到後面在做這一步。 如果想把所有的主機都控制,可以把主機IP地址改成all,all代表主機清單中的所有主機
主機清單inventory:
- /etc/ansbile/hosts文件格式
- Inventory文件遵循INI文件風格,中括號中的字符爲組名。可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來證明
- [websrvs] //分組的名稱 websrvs代表node-1這臺主機
- 192.168.32.105
- [dbsrvs] //dbsrvs代表node-2這臺主機
- 192.168.32.106
- [appsrvs]
- 192.168.32.10[5:6] //這種就是代表105到106 多臺同組主機可以這樣使用
- 這樣就可以實現分組控制
ansible配置文件:
Ansible配置文件/etc/ansible/ansible.cfg(一般保持默認)
[defaults]
some basic default values...
#inventory = /etc/ansible/hosts #主機清單配置文件
#library = /usr/share/my_modules/ #庫文件存放目錄
#remote_tmp = ~/.ansible/tmp #臨時py命令文件存放在遠程主機目錄
#local_tmp = ~/.ansible/tmp #本機的臨時命令執行目錄
#forks = 5 #默認併發數
#sudo_user = root #默認sudo用戶
#ask_sudo_pass = True #每次執行ansbile命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22 #遠程主機端口號
#host_key_checking = False #檢查對應服務器的host_key,建議取消註釋
#log_path = /var/log/ansible.log #日誌文件
Ansbile修改配置文件不需要重啓服務生效。
Ansbile系列命令:
ansbile ansbile-doc ansbile-playbook ansbile-vault ansbile-console ansbile-galaxy ansbile-pull
ansbile-doc:顯示模塊幫助
ansbile-doc [options] [module]
-a 顯示所有模塊的文檔
-l,--list 列出可用模塊
-s,--snippet 顯示指定模塊playbook片段
示例:
ansbile-doc -l 列出所有模塊
ansbile-doc ping 查看指定模塊的幫助方法
ansbile-doc -s ping 查看指定模塊的幫助方法
可以看下ansbile現在一共有多少個模塊
[root@ansible ~]# ansible-doc -l | wc -l
1378
目前所用的版本一共有1378個模塊,如果使用最新版本的話還會更多。
Ansbile命令參數詳解:
Ansbile <host-parttern>主機清單 [-m module_name]模塊名字 [-a args]模塊參數
--version 顯示版本
-m module 指定模塊,默認爲command一般不寫
-v 詳細過程-vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫-list
-k,--ask-pass 提示輸入ssh連接密碼,默認key驗證
-K,--ask-become-pass 提示輸入sudo時的口令
-C,--check 檢查,並不執行
-T,--timeout=TIMEOUT 執行命令的超時時間,默認10s
-u,--user=REMOTE_USER 執行遠程執行的用戶
-b,--become 代替舊版的sudo切換
實例:列出全部的主機列表、websrcs和dbsrcs組的主機列表
[root@ansible ~]# ansible websrvs -m ping -u test -k
以test用戶進行遠程連接
以test用戶遠程連接去查看/root目錄,因爲test沒有權限所以報錯了,那就要用到sudo
[root@ansible ~]# ansible websrvs -a 'ls /root' -u test -k -b -K
這裏要輸入test的口令和sudo root的口令
![](https://s1.51cto.com/images/blog/201909/19/71f00e6afbe996a0eac92eb4d2a12a43.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
報錯:因爲在105主機上沒有做過sudo授權
下面進行sudo授權
[root@node-1 ~]# visudo
#%wheel ALL=(ALL) ALL
將註釋去掉
[root@node-1 ~]# usermod -aG wheel test
將test加到組
做完授權之後再試一次
![](https://s1.51cto.com/images/blog/201909/19/90ac6a685e62143eb21d9dac6577f705.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
成功執行。
如果sudo時不想輸入口令
#%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL
上面的加上註釋,下面的去掉註釋
![](https://s1.51cto.com/images/blog/201909/19/2a38cf4c1232c7f93d071e6107bea045.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
這時候把-K去掉就可以不用輸入sudo口令也可以成功執行
開始做基於Key的驗證
![](https://s1.51cto.com/images/blog/201909/19/08ce26b384cc53717a68533aa4d9b368.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
![](https://s1.51cto.com/images/blog/201909/19/2cf8312fbf3d13c9bcaa0c25a1c80b96.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
這樣就做完了,下面再用ansbile命令就不用再加-k了
![](https://s1.51cto.com/images/blog/201909/19/f9f50a2e172d1fe236a212f827fe1cfb.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
Ansbile的Host-pattern:
匹配主機的列表:
All:表示所有主機清單中的所有主機
ansbile all -m ping
*:通配符
ansible “*” -m ping
ansbile 192.168.32.* -m ping
ansbile “*srvs” -m ping
或關係:
ansible “websrvs:appsrvs” -m ping
ansbile “192.168.32.105:192.168.32.106” -m ping
邏輯與:
ansbile “websrvs:&dbsrvs” -m ping
在websrvs組並且在dbsrvs組中的主機
邏輯非:
ansbile ‘websrvs:!dbsrvs’ -m ping
在websrvs組,但不在dbsrvs組中的主機
注意:此處爲單引號
綜合邏輯:
ansbile ‘websrvs:dbsrvs:&appsrvs:!ftpsvs’ -m ping
正則表達式:
ansbile “websrvs:&dbsrvs” -m ping
ansbile “~(web|db)srv” -m ping
Ansbile常用模塊:
* Command:在遠程主機執行命令,默認模塊
* 此命令不支持$VARNAME < > | ; & 等,用shell模塊實現
* Shell:和command相似,commadn可以用的shell可以用,command不可以用shell也可以用
* Scrpit:運行腳本
* Ansbile websrvs -m script -a f1.sh
* Copy:從服務器複製文件到客戶端
* ansible all -m copy -a ‘content=’test contenet\n’ dest=/tmp/f1.txt’ 利用內容,直接生成目標文件
* ansbile all -m copy -a ‘src=/root/f1.sh dest=/tmp/f2.sh owner=test mode=500 backup=yes’
* 如果目標存在,默認覆蓋,此處指定先備份backup=yes
* Fetch:從客戶端讀取文件到服務器端,與copy相反,因爲只能讀取單個文件,如果是多個文件或目錄的話,需要先tar打包一下在讀取到服務器端。
* File:設置文件屬性
* ansible all -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
* ansible all -m file -a “path=/root/a.sh owner-test mode=755”
實例:修改selinux狀態:
這裏要修改node-1節點的selinux狀態
先在ansbile節點修改selinux配置文件
SELINUX=disable
[root@ansible ~]# cp /etc/selinux/config .
將配置文件copy到 根目錄
然後用ansbile的copy模塊將config配置文件copy到被控主機
![](https://s1.51cto.com/images/blog/201909/19/606f9463dcd18b86fdb9c26fb7869655.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
因爲106節點上我已經配置過selinux爲disable了所有這裏顯示爲綠色,而105節點沒有修改過config所有這次是yellow色代表修改了配置文件。
然後查看一下有沒有修改成功
![](https://s1.51cto.com/images/blog/201909/19/d36f381f84841922fe420b9fc876d25a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
ansible all -m shell -a ‘reboot’ 重啓主機
在執行重啓命令後是紅色的信息,但其實主機已經在重啓了,所有這個算是ansbile的一個bug吧。