ansible入門
- 2019 年 10 月 3 日
- 筆記
前言
學習和使用任何語言、工具都是服務於具體的目標的。目標驅動和即時回饋往往能讓你效率提升,積極性被調動,掌握知識點也會更加牢靠。筆者學習和使用ansible的初衷是:使用ansible通過一台中控的linux機器,管理N台其他Linux主機,能夠做到批量文件分發、批量修改配置文件、批量啟動軟體服務,從而合理」偷懶「
ps:手動一台一台擼過去會讓人崩潰的,也是不聰明的做法,筆者在公司用java寫了一套dup(deploy update platform)工具,用於批量部署軟體,跟ansible的作用類似
基礎概念
ansible究竟是什麼?能做什麼呢?它是一個自動化運維工具,能批量配置、管理,避免做一些重複的體力勞動。
比如:給N台主機安裝jdk、拷貝文件到N台主機或者其他重複性工作。
當然,對於簡單的任務,我們寫點腳本也可以滿足需求,但是ansible具有"冪等性",保證重複執行某個任務,得到相同的結果,即它會判斷是否已經是正確完成的狀態,不過已經完成,不執行操作。
當然,對於運維工具熟悉的同學可能還用過puppet、saltstack、chef等,它們要麼是需要安裝agent到目標主機,要麼用Ruby語言等,ansible用python語言開發,採用ssh協議實現主機間通訊,不用安裝agent,配置文件用YAML,任意一台主機都能當中控機(去中心化)。總體來說,簡單易用,ansible還有一些特性:點對點(ad-hoc)、清單(inventory)、劇本(playbook)、模式(patterns)、模組(modules)、插件(plugins),這些後面會逐步介紹。
基礎配置
首先是安裝ansible環境,官方文檔介紹的非常詳細,ansible官方地址 包含了安裝前置條件、python版本、ansible版本選擇,apt安裝/yum安裝/pip安裝等,由於大家安裝環境的差異不展開講,如果這一步環境都不能自己搞定,後面也不用看了,畢竟聰明的人才適合玩轉ansible。
筆者的演示環境均為centos7.6的主機:
- 172.16.101.25 (中控機)
- 172.16.101.250 (受控主機1)
- 172.16.101.251 (受控主機2)
- 172.16.101.34 (受控主機3)
- 172.16.101.4 (受控主機4)
採用yum安裝,先配置好阿里的鏡像源
# cd /etc/yum.repos.d/ # cat aliBase.repo [aliBase] name=aliBase baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-$releasever # cat aliEpel.repo name=aliEpel baseurl=https://mirrors.aliyun.com/epel/$releaseverServer/$basearch/ enabled=1 gpgcheck=0
配置完畢repo後,直接yum安裝ansible
yum install ansible
此時安裝好的ansible是version 2.4.2.0
此時輸入ansible,能正常提示表示安裝好了。
此時安裝的目錄為/etc/ansible,這個目錄下有ansible.cfg(配置文件)、hosts(受控主機清單)、roles(角色定義)
基本用法
下面根據ansible命令提示嘗試一個內置的ping命令,m表示module模組:
ansible 172.16.101.4 -m ping
發現結果是:
想想看,對於中控機172.16.101.25而言,172.16.101.4並不認識,你想控制它,並不被允許,所以需要把172.16.101.4加入受控主機清單(inventory),即/etc/ansible/hosts文件中,hosts文件末尾添加了這個ip後,執行同樣的命令,發現連接被拒絕:
這也很容易理解,你並沒有172.16.101.4的用戶名/密碼,或者驗證身份的秘鑰,它不可能讓你控制它,所以在hosts中加入用戶名、密碼、埠
172.16.101.4 ansible_port=22 ansible_user=root [email protected]
- ansible_port 埠
- ansible_user 用戶名
- ansible_ssh_pass 密碼
再次執行ping命令返回結果:
這樣就表示能連接172.16.101.4這台主機了
能夠通訊後,我們開始執行一些特定的命令做測試,例如在這台主機上新建一個文件夾,命令:
ansible 172.16.101.4 -m command -a 'mkdir /root/test'
返回結果:
當然,上述只是管理了一台主機,對於多台,我們需要在hosts文件中加入更多的主機即可,而且還有其他的一些配置方法:
上述第二行給172.16.101.251取了一個別名251,這樣就能用別名來管理主機:
ansible host251 -m ping
上圖第三行的172.16.101.34因為配置了ssh秘鑰認證,所以不用配置用戶名密碼,埠為默認的22,所以也不用配置了。如果想了解ssh秘鑰認證,可以參考我之前的文章ssh的秘鑰認證做配置即可(ansible官方推薦用ssh秘鑰認證)
最後看看ping多台主機的情況:
ansible all -m ping
返回結果:
表示我們可以連接到所有的受控主機了。
了解了ansible的安裝、配置和最基礎用法,後面我們會繼續研究它的其他用法。