前言
什麼是ansible
ansible是一款開源自動化平臺,是一個配置管理工具,自動化運維工具
ansible命令相當於linux命令
ansible是基於模塊開發的,常用的20~30個
YAML語法是自帶語法
playbook(劇本)相當於腳本
ansible roles(角色)一大堆腳本
ansible的優點
1.跨平臺支持
2.人類可讀自動化: ansible提供linux,Windows,unix和網絡設備的無代理支持,適用於>物理、虛擬、雲和容器環境
3.完美描述應用:playbook
4.輕鬆管理版本控制:playbook是純文本,可視作源代碼
5.支持動態清單
6.編排可與其他系統輕鬆集成:puppet、jenkins
7.基礎架構即代碼
8.減少人爲錯誤
任務、play和playbook設計爲具有冪等性,所以在運行playbook時,
如果目標主機處於正確狀態,則不會進行任何更改。
安裝ansible
-
在機子上安裝ansible(先確定已經搭建好了epel倉庫)
dnf install -y ansible
-
查看ansible版本信息
ansible --version
示例:
[root@rhel8_node2 /]# ansible --version ansible 2.9.5 config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.6/site-packages/ansible executable location = /usr/bin/ansible python version = 3.6.8 (default, Jan 11 2019, 02:17:16) [GCC 8.2.1 20180905 (Red Hat 8.2.1-3)]
-
使用setup模塊驗證python
ansible -m setup localhost | grep ansible_python_version "ansible_python_version": "3.6.8",
部署ansible
構建ansible清單(講解)
- 清單:它定義了ansible將要管理的一批主機
靜態清單
每行一個,填寫主機名或ip,如:
www.westos.org
172.25.254.250
還可以定義主機組:
[webservers]
server1.westos.org
server2.westos.org
172.25.0.1
[dbservers]
node1.westos.org
node1.westos.org
‘注意:一臺主機可以存在於多個主機組’
定義嵌套組
ansible主機清單可以包含多個主機組構成的組,如:
[webservers]
server1.westos.org
server2.westos.org
172.25.0.1
[dbservers]
node1.westos.org
node1.westos.org
[servers:children]
webservers
dbservers
通過範圍簡化主機規格
可以指定主機名稱或ip範圍或者數字和字母範圍
語法:[START:END]
172.25.[0:4].[0:254] (匹配172.25.0.0/24,172.25.1.0/24 …)
server[01:10].example.com (匹配server01.example.com到server20.example.com>所有主機,此方式不匹配server1,之匹配server01)
[a:c].example.com (匹配a.example.com到c.example.com)
-
驗證清單
[root@workstation ~]# ansible workstation.lab.example.com --list-hosts
‘當前主機中沒有受管主機’ -
默認清單位置:/etc/ansible/hosts(一般不使用,而是自己新建)
-
動態清單–> 可以從開源社區的腳本中獲取
練習
配置默認清單:
[root@workstation ~]# vim /etc/ansible/hosts
servera.lab.example.com
[webservers]
serverb.lab.example.com
列出清單中所有受管主機:
[root@workstation ~]# ansible all --list-hosts
列出不屬於某個組的主機:
[root@workstation ~]# ansible ungrouped --list-hosts
列出屬於webservers組的主機
[root@workstation ~]# ansible webservers --list-hosts
自定義清單
mkdir deploy-inventory #建立清單目錄
列出主機
[root@workstation deploy-inventory]# ansible all -i inventory --list-hosts
列出未入組主機
[root@workstation deploy-inventory]# ansible ungrouped -i inventory --list-hosts
列出www組中的主機
[root@workstation deploy-inventory]# ansible www -i inventory --list-hosts
westos組包含www組和bbs組
[root@workstation deploy-inventory]# ansible westos -i inventory --list-hosts
管理ansible配置文件
-
配置ansible
配置文件:- /etc/ansible/ansible.cfg (基本配置文件,如果找不到其他配置文件,>使用這個)
- ~/.ansible.cfg(如果存在此配置並且當前工作目錄中也沒有ansible.cfg,此文件替代/etc/ansible/ansible.cfg)
- ./ansible.cfg(執行ansible命令的目錄中如果有ansible.cfg,就用它,不使用上面兩個(推薦使用,上面兩個不常用))
顯示使用的配置文件:
[root@rhel8_node1 deploy-adhoc]# ansible web -i inventory --list-host -v
Using /root/.ssh/deploy-adhoc/ansible.cfg as config file
hosts (2):
rhel7_node1.westos.com
rhel7_node2.westos.com -
管理配置文件中的設置:
[defaults] (部分設置ansible操作的默認值)
[privilege_escalation] (配置ansible如何在受管主機上執行特權升級)例:
[root@workstation deploy-inventory]# vim ansible.cfg
[defaults]
inventory = ./inventory
remote_user = student #指定登錄受管主機的用戶,如不指定則使用當前用戶名稱
ask_pass = false #是否提示輸入ssh密碼,做了免密就可以設置爲false,否則需>爲true[privilege_escalation]
become = true #連接到受管主機上是否進行身份切換
become_method = sudo #切換方式,默認爲sudo
become_user = root #切換到的用戶
become_ask_pass = false #是否需要爲become_method提示輸入密碼,默認爲false使用sudo進行權限下放
使用超級用戶編輯文件:[root@workstation ~]# vim /etc/sudoers.d/student
student ALL=(ALL) NOPASSWD: ALL
注意: 需要在每一個需要用戶下放權限的主機都進行權力下放
運行臨時命令
使用臨時命令可以快速測試和更改,無需編寫playbook
-
格式:
ansible host-pattern -m module [-a ‘module arguments’] [-i inventory] -
檢查能否在受管主機上運行python模塊
[root@workstation ~]# ansible all -m ping
serverb.lab.example.com | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/libexec/platform-python”
},
“changed”: false,
“ping”: “pong”
}
在運行過程可能會出現一些問題,常見問題的解決辦法 -
使用臨時命令通過模塊執行任務
列出所有模塊:[root@workstation ~]# ansible-doc -l
查看ping模塊幫助文檔:
[root@workstation ~]# ansible-doc ping
-
ansible模塊
文件模塊:
-copy:將本地文件複製到受管主機
-file:設置文件的權限和其他屬性
-lineinfile:確保特定行是否在文件中
-synchronize:使用rsync同步內容系統模塊:
-firewalld:使用firewalld管理任意端口和服務
-reboot:重啓
-service:管理服務
-user:添加、刪除和管理用戶賬戶Net Tools模塊:
-get_url:通過http、https、或者ftp下載文件
-nmcli:管理網絡
-uri:與web服務交互 -
例:
使用user模塊確保student用戶存在於servera.lab.example.com且uid爲1000[root@workstation ~]# ansible -m user -a 'name=student uid=1000 state=present' servera.lab.example.com
在受管主機上運行命令:
[root@workstation ~]# ansible webservers -m command -a /usr/bin/hostname serverb.lab.example.com | CHANGED | rc=0 >> #狀態報告,顯示主機名稱和操作結>果 serverb.lab.example.com #命令輸出
使結果顯示在一行:
[root@workstation ~]# ansible webservers -m command -a /usr/bin/hostname -o #加上-o參數,單行顯示 serverb.lab.example.com | CHANGED | rc=0 | (stdout) serverb.lab.example.com
注意: command模塊允許執行遠程命令,但這些命令不是shell處理,所以無法訪問shell環境變量,所以不能執行重定向、傳送等操作
-
使用shell和command的區別
shell:[root@workstation ~]# ansible localhost -m command -a set localhost | FAILED | rc=2 >> [Errno 2] No such file or directory: 'set': 'set'
command:
[root@workstation ~]# ansible localhost -m shell -a set localhost | CHANGED | rc=0 >> BASH=/bin/sh ...
-
使用command模塊執行臨時命令
[root@workstation deploy-adhoc]# ansible localhost -m command -a 'id' [root@workstation deploy-adhoc]# ansible localhost -m command -a 'id' -u student #通過-u選項使用student進行連接並執行id命令
注意: 執行上面兩條命令時,需要在新建的目錄中執行,否則結果不會變
-
使用copy模塊
1.首先使用student用戶,因爲student用戶沒有寫權限,會失敗
[root@workstation deploy-adhoc]# ansible localhost -m copy -a ‘content=“westos ansible\n” dest=/etc/motd’ -u westos
(使用copy模塊,以westos用戶登錄,使用root權限,把“westos ansible” 複製給本臺主機的/etc/motd文件,–become給westos用戶提升權限)
2.使用特權升級
‘注意:此處使用特權升級需要先編輯/etc/sudoers.d/student文件’
[root@workstation deploy-adhoc]# cat /etc/sudoers.d/student
student ALL=(ALL) NOPASSWD: ALL
以root身份運行
[root@workstation deploy-adhoc]# ansible localhost -m copy -a ‘content=“westos ansible\n” dest=/etc/motd’ -u student --become
查看是否更改
[root@workstation deploy-adhoc]# cat /etc/motd
westos ansible
使用all參數一次更改servera和localhost
[root@workstation deploy-adhoc]# ansible all -m copy -a ‘content=“westos ansible\n” dest=/etc/motd’ -u student --become
可以看到localhost顯示SUCCESS,servera顯示CHANGED,因爲localhost已經處於正確狀態
查看
[root@workstation deploy-adhoc]# ansible all -m command -a ‘cat /etc/motd’ -u student
後記
練習and記憶