Ansible做爲今年來愈來愈火的一款開源運維自動化工具,經過Ansible能夠實現運維自動化,提升運維工程師的工做效率,減小人爲失誤。Ansible經過自己集成的很是豐富的模塊能夠實現各類管理任務,其自帶模塊超過上千個。更爲重要的是,它操做簡單,但提供的功能又很是豐富,在運維領域,幾乎能夠作任何事。
.
Ansible自2012年發佈以來,很快在全球流行,其特色以下:node
一、Ansible基於Python開發,運維工程師對其二次開發相對比較容易
二、Ansible豐富的內置模塊,幾乎能夠知足一切要求
三、管理模式很是簡單,一條命令能夠影響上千臺主機
四、無客戶端模式,底層經過SSH通訊python
咱們能夠經過四種方式和Ansible交互,我這裏只研究了其中兩種方式,應付平常工做足夠了。分別以下:web
一、Ad-Hoc命令集:user直接經過Ad-Hoc命令集調用Ansible工具集來完成任務。
二、playbooks:user預先編寫好ansible playbooks,經過執行playbooks中預先編排好的任務集,按序執行任務。shell
一、Ansible工做集:
.
Ansible工做集包含inventory、Modules、Plugins和API,其中,inventory(清單)用來管理設備列表,能夠經過分組實現,對組的調用直接影響組內的全部主機;modules是各類執行模塊,幾乎全部的管理任務都是經過模塊執行的;plugins提供了各類附加功能;API爲編程人員提供一個接口,能夠基於此作Ansible的二次開發。
.
Ansible能夠經過單條命令或者配置文件來對多臺主機進行控制及更改,下面將從安裝及配置依次寫出來。apache
二、playbook配置文件
.
playbook配置文件使用YAML語法,具備簡潔明瞭、結構清晰等特色。playbook配置文件相似於shell腳本,是一個YAML格式的文件,用於保存針對特定需求的任務列表。上面介紹的ansible命令雖然能夠完成各類任務,可是當配置一些複雜任務時,逐條輸入就顯得效率很是低下了。更有效的方案是在playbook配置文件中放置全部的任務代碼,利用ansible-playbook命令執行該文件,能夠實現自動化運維。YAML文件的擴展名一般爲.yaml或.yml。
.
Ansible的安裝及配置
.
環境以下:
1、準備工做:
一、本地yum倉庫:https://pan.baidu.com/s/1-ERCVm6QaUA4XQd_X5Kwow 提取碼: exnp 版本爲:Ansible 2.3.1.0
二、若本機聯網,可指向互聯網yum倉庫
三、默認採用TCP 22進行與客戶機進行通訊,如有更改,需自行設置防火牆放行
2、安裝Ansible:編程
[root@ansible /]# mount /dev/sr0 /media/ # 掛載yum倉庫 [root@ansible /]# rm -rf /etc/yum.repos.d/* # 刪除或移走yum目錄中的其餘配置文件 [root@ansible /]# vim /etc/yum.repos.d/a.repo [aaa] baseurl=file:///media gpgcheck=0 [root@ansible yum.repos.d]# yum clean all #清除yum緩存 [root@ansibleyum.repos.d]# yum -y install ansible #安裝Ansible [root@ansible yum.repos.d]# ansible --version #能夠查看到此信息,說明安裝成功 ansible 2.3.1.0 config file = /etc/ansible/ansible.cfg ...................
我這裏採用了互聯網yum倉庫進行安裝,即ansible 2.4.2.0。
.
安裝已經完成,可是若要正常的使用Ansible,還須要解決一個問題,就是在控制多臺主機時,若要每執行一次命令或腳本都要輸入一次對端密碼的話,顯得就很雞肋,因此還須要建立SSH免交互登陸,以下:
.
如下操做都在Ansible服務器進行:vim
[root@ansible ~]# ssh-keygen -t rsa #在Ansible服務器生成密鑰對,執行後默認一直按回車便可 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): #默認按回車 Enter passphrase (empty for no passphrase): #默認按回車 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: #默認按回車 SHA256:zhd2++KvByxFPE4ZKmDdmTHp6cjsuIEz5M26QrkBfes root@ansible The key's randomart image is: #默認按回車 +---[RSA 2048]----+ | o. .o*.o | | . .. =o* | | . ...= . | |. . . .o o | | . o.. oSooo. | | +o.+ o+.ooo. | | . += +oo .... | | o E+.... ... | | .o... .o=o | +----[SHA256]-----+ #至此密鑰對已經生成了,隱藏存在當前用戶的宿主目錄下。 [root@ansible ~]# ls -a | grep ssh #查看 .ssh [root@ansible ~]# cd .ssh [root@ansible .ssh]# ls #查看.ssh目錄下的文件,有公鑰和私鑰 id_rsa id_rsa.pub known_hosts [root@ansible ~]# ssh-copy-id root@192.168.1.20 #複製公鑰到主機192.168.1.20 root@192.168.1.20's password: #輸入主機1.20的root用戶密碼 [root@ansible ~]# ssh-copy-id root@192.168.1.30 #複製公鑰到主機192.168.1.30 root@192.168.1.30's password: #輸入主機1.30的root用戶密碼 #在實際生產環境中,不會使用root身份,更改一下複製公鑰時指定的用戶便可。 [root@ansible ~]# ssh 192.168.1.20 #測試是否能夠免密碼登陸 Last login: Tue Jul 23 08:11:39 2019 from 192.168.1.88 [root@server1 ~]# exit #退出192.168.1.2的shell環境 [root@ansible ~]# ssh 192.168.1.30 #測試是否能夠免密碼登陸 Last login: Tue Jul 23 08:43:16 2019 from 192.168.1.88 [root@server 2 ~]# exit #退出192.168.1.3的shell環境
3、Ansible配置:
inventory是Ansible管理主機信息的配置文件,至關於系統的hosts文件功能,默認存放在/etc/ansible/hosts,在hosts文件中,經過分組來組織設備,Ansible經過inventory來定義主機和分組,若不使用默認的/etc/ansible/hosts,能夠經過ansible -i 新的inventory路徑
來指定inventory,我這裏直接採用默認的路徑。
.
一、以分組的方式添加須要管理的主機:
.
正是管理以前,首先要編寫hosts文件,由於Ansible經過將設備列表以分組的方式添加hosts文件來實現對設備的管理。hosts文件中,[ ]包含的是組名,設備列表支持域名及IP地址,默認狀況下,經過訪問22端口(SSH)來管理設備,若目標主機使用了非默認的SSH端口,還能夠在主機名稱以後使用冒號加端口號標明,以行爲分隔單位,也支持通配符。
.centos
[root@ansible ~]# vim /etc/ansible/hosts #編輯清單文件,在文件末尾寫入如下內容 ..................... #省略部份內容 [web] #定義一個名爲web的分組,下面是web組中的主機 192.168.1.20 192.168.1.30 [test01] #定義一個名爲test01的分組,下面是test01組中的主機 www.test.com:222 #若目標主機使用了非默認的SSH端口,能夠在域名後面加端口號來指定 www[2:5].test.com #[2:5]表示2~5之間的全部數字,如www2.test.com、www3.test.com .......的全部主機 192.168.1.4:66 #IP地址後面也能夠指定非默認的端口號 #將須要管理的主機寫入後,保存退出便可。注意,該文件中包含一個隱含的分組「all」,表示全部主機。
.
配置完成後,能夠針對hosts定義的組進行遠程操做,也能夠針對組中所指定的某一個或者多個主機操做,以下:緩存
[root@ansible ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.1.20" #查看web組中的192.168.1.20主機httpd服務的狀態 192.168.1.20 | FAILED | rc=3 >> ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd. preset: disabled) Active: inactive (dead) Docs: man:httpd(8) man:apachectl(8)non-zero return code #也能夠這樣: [root@ansible ~]# ansible 192.168.1.20 -m command -a "systemctl status httpd" 192.168.1.20 | FAILED | rc=3 >> ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd. preset: disabled) Active: inactive (dead) Docs: man:httpd(8) man:apachectl(8)non-zero return code [root@ansible ~]# ansible 192.168.1.* -m command -a "systemctl status httpd" #查詢192.168.1.0這個網段全部主機的httpd服務狀態 192.168.1.20 | FAILED | rc=3 >> ................. 192.168.1.30 | FAILED | rc=3 >> .................
4、Ansible命令:服務器
[root@ansible ~]#ansible #輸入ansible後,連續按兩下tab鍵,能夠查看ansible全部相關命令 ansible ansible-doc ansible-playbook-2 ansible-2 ansible-doc-2 ansible-playbook-2.7 ansible-2.7 ansible-doc-2.7 ansible-pull ..........................
命令一、ansible:
.
ansible是生產環境中使用很是頻繁的命令之一,主要應用在如下場景:
.
ansible可用的選項以下:
- -v:輸出詳細的執行過程信息,能夠獲得執行過程全部的信息。
- -i PATH:指定inventory信息,默認爲/etc/ansible/hosts。
- -f:併發線程數,默認爲5個線程。
- --private-key=PRIVATE_KEY_FILE:指定密鑰文件。
- -m:指定執行使用的模塊。
- -M:指定模塊的存放路徑,默認爲/usr/share/ansible,也能夠經過ANSIBLE_LIBRARY來設定默認路徑。
- -a:指定模塊參數。
- -u:指定遠程主機以哪一個用戶運行命令。
- -l:限制運行主機,等同於「--limit」。
- --list-hosts:列出符合條件的主機列表,不執行任何命令。
用法示例1(須要提早在/etc/ansible/hosts文件中定義web組):
[root@ansible ~]# ansible all -f 5 -m ping <!--檢查全部主機是否存活--> 192.168.1.30 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.1.20 | SUCCESS => { "changed": false, "ping": "pong" } <!--其中192.168.1.30和1.20是執行主機,SUCCESS表示命令執行成功,「=> {」表示返回的 結果。「changed」:false表示沒有對主機作出更改,「ping」:「pong」表示執行了ping命令的 返回結果。命令中「all」關鍵字在前面提到過,表明了/etc/ansible/hosts文件中的全部主機, 不須要在hosts文件中定義,系統中默認存在的-->
用法示例2:
[root@ansible ~]# ansible web --list #列出web組全部的主機列表 hosts (2): 192.168.1.20 192.168.1.30 #以上表示web中包含兩個主機,分別是1.20和1.30
用法示例3:
[root@ansible ~]# ansible web -m command -a "df -hT" #顯示web組中主機的磁盤使用狀況 192.168.1.20 | SUCCESS | rc=0 >> 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root xfs 50G 5.8G 45G 12% / devtmpfs devtmpfs 895M 0 895M 0% /dev ............................ #省略部分 192.168.1.30 | SUCCESS | rc=0 >> 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/cl-root xfs 17G 5.5G 12G 33% / devtmpfs devtmpfs 897M 0 897M 0% /dev tmpfs tmpfs 912M 84K 912M 1% /dev/shm ............................ #省略部分
ansible的返回結果很是友好,通常會用三種顏色來表示執行結果:紅色、綠色和橘yellow(那個顏色被和諧了)。其中紅色表明執行過程當中有異常;橘yellow表示命令執行後目標有狀態變化;綠色表示執行成功且沒有對目標主機作修改。
命令二、ansible-doc:
ansible-doc用來查詢ansible模塊文檔的說明,相似於man命令,針對每一個模塊都有詳細的用法說明及應用案例介紹。
[root@ansible ~]# ansible-doc -l | wc -l #列出支持的模塊 1378 #支持的模塊有1378個 [root@ansible ~]# 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 ................#省略部份內容
命令三、ansible-playbook:
.
ansible-playbook是平常應用中使用率最高的命令,相似於Linux中的sh或source命令,用來執行系列任務。其工做機制是:經過讀取預先編寫好的playbook文件實現集中處理任務。ansible-playbook命令後跟yml格式的playbook文件,playbook文件存放了要執行的任務代碼,命令使用方式以下(playbook.yml文件須要提早編寫好,最好指定playbook.yml的絕對路徑):
[root@ansible ~]# ansible-playbook playbook.yml
命令四、ansible-console:
.
ansible-console是ansible爲咱們提供的一款交互式工具,相似於Windows中的cmd及Linux中的shell。能夠在ansible-console虛擬出來的終端上像shell同樣使用ansible內置的各類命令,這爲習慣於shell交互方式的用戶提供了良好的使用體驗,全部的操做與shell相似,並且支持tab鍵補全。具體操做以下:
[root@ansible ~]# ansible-console #鏈接交互式工具 Vault password: #ansible 2.4.2.0會提示輸入一個密碼,隨便輸入後按回車便可,不容許空值 Welcome to the ansible console. Type help or ? to list commands. root@all (2)[f:5]$ cd web #切換到web組 root@web (2)[f:5]$ list #列出組中主機 192.168.1.20 192.168.1.30 root@web (2)[f:5]$ ifconfig ens33 #查詢每一個主機的網卡信息 root@web (2)[f:5]$ exit #退出ansible-console環境
5、Ansible中自帶的模塊介紹:
一、command模塊:
command模塊在遠程主機執行命令,不支持管道,重定向等shell特性,其他和shell相似,經常使用參數以下:
- chdir:在遠程主機上運行命令前須要提早進入的目錄。
- creates:在命令運行時建立一個文件,若是文件已經存在,則不會執行建立任務。
- removes:在命令運行時移除一個文件,若是文件不存在,則不會執行移除任務。
- executeble:指明運行命令的shell程序。
[root@ansible ~]# ansible all -m command -a "chdir=/home ls ./" #在全部主機上運行「ls ./」命令,運行前切換至/home目錄下。
二、shell模塊(至關於萬能模塊,能夠執行大多數命令):
.
shell模塊在遠程主機執行命令,至關於調用遠程主機的shell進程,而後在shell下打開一個子shell運行命令。和command模塊的區別是它支持shell特性,如管道符、重定向等。
.
[root@ansible ~]# ansible web -m shell -a 'echo "hello world" >> /tmp/hello.txt' #在web組的主機上編寫一個txt文件 192.168.1.20 | SUCCESS | rc=0 >> 192.168.1.30 | SUCCESS | rc=0 >> [root@ansible ~]# ansible web -m shell -a ' cat /tmp/hello.txt' #查看編寫的文件 192.168.1.30 | SUCCESS | rc=0 >> hello world 192.168.1.20 | SUCCESS | rc=0 >> hello world
三、copy模塊:
copy模塊用於複製指定主機文件到遠程主機的位置,常見參數以下:
- src:指出源文件路徑,可使用相對路徑和絕對路徑。支持直接指定目錄,若是源是目錄,則目標也要是目錄。
- dest:指出複製文件的目標目錄位置,使用絕對路徑,支持直接指定目錄。若是源是目錄,則目標也要是目錄,若是目標已經存在,則會覆蓋原有內容。
- mode:指出複製時,目標文件的權限,可選。
- owner:指出複製時,目標文件的屬主,可選。
- group:指出複製時,目標文件的屬組,可選。
- content:指出複製到目標主機上的內容,不能與src一塊兒使用,至關於複製content指明的數據到目標文件中。
[root@ansible ~]# ansible web -m copy -a "src=/etc/hosts dest=/tmp/ mode=777 owner=nobody group=root" #將本機的/etc/hosts文件複製到web組中的主機,並指定權限爲777,屬主爲nobody,屬組爲root。
四、hostname模塊:
hostname模塊用於管理主機名,經常使用參數以下:
name:指明主機名。
[root@ansible ~]# ansible 192.168.1.20 -m hostname -a "name=web1" #將主機192.168.1.20的主機名改成web1 192.168.1.20 | SUCCESS => { ansible_facts: { ansible_domain: , ansible_fqdn: web1, ansible_hostname web1 ansible_nodename: web1 }, changed: true name: web1 } [root@server1 ~]# hostname #在192.168.1.20主機上查看 web1 [root@server1 ~]# cat /etc/hostname #在192.168.1.20主機上查看 web1 #更改主機名後需重啓纔可以使新的主機名生效。
五、yum模塊:
yum模塊基於yum機制,對遠程主機管理程序包,經常使用參數以下:
- name:程序包的名稱,能夠帶上版本號。若不指明版本,則默認安裝最新版本。
- state=present | latest | absent:指明對程序包執行的操做,present表示安裝程序包,latest表示安裝最新版本的程序包,absent表示卸載程序包。
- disablerepo:在用yum安裝時,臨時禁用某個倉庫的ID。
- enablerepo:在用yum安裝時,臨時啓用某個倉庫的ID。
- conf_file:yum運行時的配置文件,而不是使用默認的配置文件。
- diable_gpg_check=yes | no:是否啓用完整性校驗功能。
[root@ansible ~]# ansible web -m yum -a "name=httpd state=present" <!-- 在web組中的主機上安裝httpd服務,須要注意的是,管理端只是發送yum指令到被 管理端,被管理端要存在可用的yum倉庫才能夠成功安裝。 -->
六、Service模塊:
Service模塊用來管理遠程主機上的服務的模塊,常見參數以下:
- name:被管理的服務名稱。
- state=started | stopped | restarted | reloaded:動做包含啓動、關閉、重啓及從新加載配置文件。
- enabled=yes | no:表示是否設置該服務開機自啓動。
- runlevel:若是設定了enabled開機自啓動,則要定義在那些運行目標下自動啓動,如2/3/4/5。
[root@ansible ~]# ansible web -m service -a "name=httpd state=started enabled=yes" #啓動httpd服務,並設置爲開機自啓動。
七、user模塊:
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:當state=absent時,是否要刪除用戶的家目錄。
[root@ansible ~]# ansible web -m user -a 'name=user1 system=yes uid=501 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="test user"' #建立一個名爲user1的用戶 [root@ansible ~]# ansible web -m user -a "name=user1 remove=yes state=absent" #刪除剛纔建立的user1用戶
八、group模塊:
group模塊用於管理組,用於新建或刪除組,經常使用參數以下:
- gid:指定組的gid
- name:指定組的name
- state=present | absent:建立或刪除
- system=yes | no:是否爲系統組
[root@ansible ~]# ansible web -m group -a 'name=test gid=300 state=present system=yes' #建立gid爲300,組名爲test的系統組。 [root@ansible ~]# ansible web -m group -a 'name=test gid=300 state=absent system=yes' #刪除剛剛建立的組。
九、mount模塊:
mount模塊用於掛載文件系統,經常使用參數以下:
- src:要掛載的設備或文件系統
- name:指定掛載點
- fstype:指定文件系統類型
- ots=w | r | o :設置文件讀寫類型,可組合使用。
- state=present | absent | mounted | unmounted:present表示只修改fstab文件中的配置,不自動建立掛載點,並且不掛載;absent表示刪除掛載點,修改fstab文件;mounted:自動建立掛載點並掛載,添加自動掛載(fstab);unmounted:只卸載,不刪除掛載點,不修改fstab文件。
[root@an..~]# ansible web -m mount -a 'name=/warrent src=/dev/cdrom fstype=iso9660 state=mounted' #掛載iso鏡像到/warrent目錄下,並設置開機自動掛載。 [root@ansible ~]# ansible web -m mount -a 'name=/warrent state=absent' #卸載ISO鏡像,並刪除掛載點,刪除開機自動掛載。 [root@an..~]# ansible web -m mount -a "path=/mnt/data src=/dev/sdb1 fstype=xfs ots=wr state=mounted" #注:mount已經使用path代替了原來的name參數,可是name參數仍是可使用的。
十、cron模塊:
cron模塊用來管理計劃任務,經常使用參數以下:
- name:指定計劃任務描述,必填
- job:要執行的任務
- user:運行計劃任務的用戶
- 執行時間:
- minute:0-59,默認爲 *
- hour:0-23,默認爲 *
- day:1-31,默認爲 *
- month:1-12,默認爲 *
- weekday:1-7,默認爲 *
- state=present | absent:present表示添加計劃任務;absent表示刪除計劃任務。
[root@ansible ~]# ansible web -m cron -a 'name=test user=root minute=*/2 job="echo test >> /tmp/warrent.txt" state=present' #添加一個計劃任務測試一下 [root@ansible ~]# ansible web -m shell -a "crontab -l" #查看建立的任務計劃 192.168.1.20 | SUCCESS | rc=0 >> #Ansible: test */2 * * * * echo test >> /tmp/warrent.txt 192.168.1.30 | SUCCESS | rc=0 >> #Ansible: test */2 * * * * echo test >> /tmp/warrent.txt
十一、 script模塊:
功能:在遠程主機上執行主控端的腳本,至關於scp+shell組合。
用法以下:
[root@ansible ~]#ansible web -m script -a "/home/test.sh"
關於playbook配置文件的使用請參考:http://www.javashuo.com/article/p-uomzsfbs-gh.html