Ansible概述
Ansible是近年越來越火的一款開源運維自動化工具,通過Ansible可以實現運維自動化,提高運維工程師的工作效率,減少人爲的失誤。Ansible通過本身集成的非常豐富的模塊實現各種管理任務,其自帶模塊超多上千個。更爲重要的是,它的操作非常簡單,即使新手也比較容易上手,但它提供的功能確實非常豐富,在運維領域,它幾乎可以做任何事。
Ansible自2012年發佈以來,很快在全球流行。其特點表現如下:
- 基於Python開發,比較容易二次開發
- 提供豐富的內置模塊,基本滿足工作需求
- 管理模式簡單,一條命令可以影響上千臺服務器
- 被控制端無需安裝任何軟件,通過SSH通信
Ansible沒有客戶端,所以不需要在被管理主機添加代理程序,通過SSH完成底層通信,而SSH在Linux的發行版本中默認已經安裝並啓用。而在Windows系統下,則依賴於PowerShell,Ansible要求管理端必須是Linux系統,在管理節點通過應用模塊將指令發送到被管理主機上,並在執行完畢後自動刪除產生的臨時文件。
根據ansible使用過程中的不同角色,可將其分爲以下三個部分。
使用者:如何使用ansible實現自動化運維?
ansible工具集:ansible可以實現那種功能。
作用對象:ansible可以影響那種主機
1. 使用者
CMDB:CMDB存儲和管理者企業IT架構中的各項配置信息,是構建ITIL項目的核心工具,運維人員可以組合CMDB和Ansible,通過CMDB直接下發指令調用Ansible工具集完成操作者所希望達到的目標。
PUBLIC/PRIVATE方式:Ansible除了豐富的內置模塊外,同時還提供豐富的API語言接口,如PHP、Python、PERL等多種流行語言,基於PUBLIC/PRIVATE,Ansible以API調用的方式運行。
Ad-Hoc命令集:Users直接通過Ad-Hoc命令集調用Ansible工具集來完成任務。
Playbooks:Users預先編寫好Ansible Playbooks,通過執行Playbooks中預先編排好的任務集,按序執行任務。
2.Ansible工具集
- Ansible Playbooks:任務腳本,任務集配置文件
- Inventory:ansible管理主機清單
- Modules:功能模塊,一般內置,也可自定義
- API:第三方應用程序接口
3.作用對象
Ansible的作用對象不僅僅是Linux和非Linux操作系統的主機,也可以作用於各類PUBLIC/PRIVATE、商業和非商業設備的網絡設施。
使用者使用Ansible或Ansible-Playbooks時,在服務器終端輸入Ansible的Ad-Hoc命令集或Playbooks後,Ansible會遵循預選安排的規則將Playbooks逐步拆解爲Play,再將Play組織成Ansible可以識別的任務,隨後調用任務涉及的所有模塊和插件,根據Inventory中定義的主機列表通過SSH將任務集以臨時文件或命令的形式傳輸到遠程客戶端執行並返回執行結果,如果是臨時文件則執行完畢後自動刪除。
ansible的配置
1.安裝ansible
1)yum安裝ansible
本地yum並沒有自帶ansible的安裝包
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
或者下載ansible的包,通過yum安裝
鏈接:https://pan.baidu.com/s/1wTqqJciyxcqN5fzIlJkJbw
提取碼:w0ck
yum -y install ansible
2)驗證安裝結果
[root@localhost ~]# ansible --version
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
3)創建ssh免交互登錄
[root@localhost ~]# ssh-keygen //生成密鑰對
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): //密鑰對存放路徑
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
//輸入私鑰保護密碼,直接按Enter鍵表示無密碼
Enter same passphrase again: //再次輸入
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
36:9f:34:06:b2:d4:7d:64:81:34:9e:8c:a2:fd:6b:27 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| .o.+. |
| . =.= |
| + + = . |
| + + . . |
| . o S + |
| o = o |
| . o |
| E.. |
| ..o |
+-----------------+
[root@localhost ~]# ssh-copy-id [email protected] //複製公鑰到遠端192.168.1.2
[root@localhost ~]# ssh-copy-id [email protected] //複製公鑰到遠端192.168.1.3
[root@localhost ~]# ssh-copy-id [email protected] //複製公鑰到遠端192.168.1.4
[root@localhost ~]# ssh-copy-id [email protected] //複製公鑰到遠端192.168.1.5
測試是否可以遠程免密碼等入
[root@localhost ~]# ssh 192.168.1.2 //遠程訪問192.168.1.2
Last login: Tue Feb 11 11:19:46 2020 from 192.168.1.1
[root@localhost ~]# ssh 192.168.1.3
Last login: Tue Feb 11 11:19:46 2020 from 192.168.1.1
[root@localhost ~]# ssh 192.168.1.4
Last login: Tue Feb 11 11:19:46 2020 from 192.168.1.1
[root@localhost ~]# ssh 192.168.1.5
Last login: Tue Feb 11 11:19:46 2020 from 192.168.1.1
到此,已經完成Ansible的部署,接下來就可以通過Ansible對設備進行管理了。
2.ansible配置
Inventory是Ansible管理主機信息的配置文件,相當於系統Hosts文件的功能,默認存放在/etc/ansible/hosts。在hosts文件中,通過分組來組織設備,Ansible通過Inventory來定義主機和分組,通過在ansible命令中使用選項-i或–inventory-file來指定Inventory。比如:
[root@localhost ~]# ansible -i /etc/ansible/hosts web -m ping
如果使用默認的Inventory文件(/etc/ansible/hosts),也可以不指定Inventory文件,比如:
[root@localhost ~]# ansible web -m ping
Ansible通過設備列表以分組的方式添加到/etc/ansible/hosts文件來實現對設備的管理,所以在正式管理之前,首先要編寫好hosts文件。hosts文件中,以[ ]包含的部分代表組名,設備列表支持主機名和IP地址。默認情況下,通過訪問22端口(SSH)來管理設備。若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口標明,以行爲單位分隔配置。另外,hosts文件還支持通配符
[root@localhost ~]# vim /etc/ansible/hosts
[web]
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
1)通過命令查看httpd服務狀態(前提:node1、node2安裝httpd)
①管理單臺主機
只對web組中192.168.1.2主機操作,通過–limit參數限定主機的變更
ansible web -m command -a "systemctl status httpd" --limit "192.168.1.2"
//-a指定命令
//-m指定模塊
②管理清單內主機組
ansible web -m command -a "systemctl status httpd"
3.Ansible命令
1)ansible
ansible主要用在:
非固化需求
臨時一次性操作
二次開發接口調用
非固化需求是指臨時性的維護,如查看web服務器組磁盤使用情況、複製一個文件到其他機器等。類似這些沒有規律的、臨時需要做的任務,我們成爲非固化需求,臨時一次性操作。語法如下:
Ansible <host-pattern> [options]
可用選項如下:
-v:輸出詳細的執行過程
-i PATH(--inventory=PATH):指定inventory信息,默認爲/etc/ansible/hosts
-f NUM:併發線程數,默認爲5個線程
--private-key=PRIVATE_KEY_FILE:指定密鑰文件
-m:指定模塊
-M:指定模塊存放目錄,默認爲/usr/share/ansible
-a:指定模塊參數
-u:指定遠程主機以username運行命令
-l:限制運行主機
--list-host:列出符合條件的主機列表
①命令ping所有主機
ansible all -f 5 -m ping
②列出所有主機
ansible web --list
③查看web組清單主機磁盤使用情況
ansible web -m command -a "df -hT"
三種顏色來表示執行結果:
- 紅色:表示執行過程出現異常;
- 橘黃顏色:表示命令執行後目標有狀態變化;
- 綠色:表示執行成功且沒有目標機器做修改
2)Ansible-doc
Ansible-doc用來查詢ansible模塊文檔的說明,類似於man命令,針對每個模塊都有詳細的用法說明及應用案例介紹,語法如下:
ansible-doc [options] [module……]
[root@localhost ~]# ansible-doc -l
//列出所支持的模塊
[root@localhost ~]# ansible-doc ping
//關於ping模塊的說明信息
> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
A trivial test module, this module always returns `pong' on successful contact. It
does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify
the ability to login and that a usable python is configured. This is NOT ICMP ping,
this is just a trivial test module.
EXAMPLES:
# Test we can logon to 'webservers' and execute python with json lib.
ansible webservers -m ping
MAINTAINERS: Ansible Core Team, Michael DeHaan
METADATA:
Status: ['stableinterface']
Supported_by: core
3)Ansible-playbook
Ansible-playbook是日常應用中使用頻率最高的命令,類似於Linux中的sh或source命令,用來執行系列任務。其工作機制:通過讀取預先編寫好的playbook文件實現集中處理任務。Ansible-playbook命令後跟yml格式的playbook文件,playbook文件存放了要執行的任務代碼,命令使用方式如:
Ansible-playbook playbook.yml
//playbook.yml文件要提前編寫好,建議使用絕對路徑
4)Ansible-console
Ansible-console是Ansible爲用戶提供的一款交互式工具,類似於Windows的cmd或者是Linux中shell。用戶可以在ansible-console虛擬出來的終端上像shell一樣使用Ansible內置的各種命令,這爲習慣於使用shell交互式方式的用戶提供了良好的使用體驗。在終端輸入ansible-console命令後,顯示如下
[root@localhost ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
//輸入help或?獲取幫助
root@all (2)[f:5]$ cd web //使用cd命令切換主機或分組
root@web (2)[f:5]$ list //列出當前的設備
192.168.1.2
192.168.1.3
//支持Tab鍵補全,快捷鍵Ctrl+D或Ctrl+C即可退出當前的虛擬終端
4.ansible模塊
(1)command模塊
使用命令關閉selinux和防火牆
ansible web -m command -a "setenforce 0"
ansible web -m command -a "systemctl stop firewalld"
使用chdir切換目錄
ansible web -m command -a "chdir=/tmp ls ./"
(2)shell模塊:通過調用被管理主機的shell運行命令,支持管道和重定向
使用echo 和 > 創建文件
ansible web -m shell -a 'echo "hello" >> /tmp/hello.txt'
(3)copy模塊:複製文件到遠程主機
主要參數:dest 目標位置
src 源文件路徑
mode 目標權限
owner 目標文件屬主
group 目標文件屬組
content 可選內容複製,不能與src共用
複製本機/etc/hosts到遠程主機/tmp,權限777
ansible web -m copy -a "src=/etc/hosts dest=/tmp mode=777 owner=nobody group=root"
(4)hostname模塊:管理遠程主機主機名,把node3主機名改爲demo
ansible node3 -m hostname -a "name=demo"
(5)yum模塊:對遠程主機,管理yum程序
參數:
name:程序包名稱
state=present|latest|absent:present表示安裝、latest表示安裝最新版本、absent表示卸載
disablerepo:臨時禁用某個yum倉庫
enablerepo:臨時啓用倉庫
conf_file:yum運行時臨時啓用的配置文件,不是默認文件
diable_gpg_check=yes|no:是否啓用完整性校驗
使用yum模塊,遠程安裝node1的httpd服務
ansible node1 -m yum -a "name=httpd state=present"
(6)service模塊:管理遠程主機服務
name:服務名
state=started|stoped|restarted:啓動|關閉|重啓
enabled=yes|no:服務是否開機自啓動
runlevel:服務在那個級別開機自啓動
設置node1的httpd服務開機自動啓動
(7)user模塊:管理遠程主機的用戶帳號
name:賬號名
state=present|absent:present表示創建、absent表示刪除
system=yes|no:是否爲系統賬號
uid:用戶uid
group:基本組
groups:附加組
shell:默認shell
home:宿主目錄
move_home=yes|no:如果宿主目錄已存在,是否移動宿主目錄
password:密碼
comment:註釋
remove=yes|no:刪除用戶時,是否刪除宿主目錄
所有web組主機創建用戶user1,密碼user1
ansible web -m user -a "name=user1 system=yes uid=666 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1"
刪除web組主機user1用戶
ansible web -m user -a "name=user1 remove=yes state=absent"