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的安裝、配置和最基礎用法,後面我們會繼續研究它的其他用法。