天天看點

inotify用法簡介及結合rsync實作主機間的檔案實時同步

目錄:

一、ansible簡介

1.1、ansible是什麼 1.2、ansible如何工作 1.3、ansible優缺點 1.4、ansible安裝方式 1.5、ansible檔案簡單介紹 1.6、ansible簡單使用

二、ansible-shell簡介

2.1、ansible-shell是什麼 2.2、ansible-shell安裝方式 2.3、ansible-shell簡單使用

三、使用ansible的authorized_key子產品批量推送公鑰到遠端主機

3.1、生産秘鑰對 3.2、使用ansible-playbook來生成推送公鑰

四、相關站點的推薦

廢話不多說,開始上幹貨。。。。

ansible是個什麼東西呢?官方的title是“Ansible is Simple IT Automation”——簡單的自動化IT工具。這個工具的目标有這麼幾項:讓我們自動化部署APP;自動化管理配置項;自動化的持續傳遞;自動化的(AWS)雲服務管理。

下面這是摘自36氪的一段介紹,很詳細:

AnsibleWorks成立于2012年,由自動化工具Cobbler及Func的開發者Michael DeHaan建立。其Ansible平台是一個開源的配置及計算機管理平台。可實作多節點的軟體部署,執行特定任務并進行配置管理。

Ansible 跟其他IT自動化技術的差別在于其關注點并非配置管理、應用部署或IT流程工作流,而是提供一個統一的界面來協調所有的IT自動化功能,是以 Ansible的系統更加易用,部署更快。受管理的節點無需安裝額外的遠端控制軟體,由平台通過SSH(Secure SHell)對其進行管理,是以十分友善。其子產品支援JSON等标準輸出格式,可采用任何程式設計語言重寫。

Ansible可以讓使用者避免編寫腳本或代碼來管理應用,同時還能搭建工作流實作IT任務的自動化執行。IT自動化可以降低技術門檻及對傳統IT的依賴,進而加快項目的傳遞速度。

目前,Ansible已有30萬使用者,每月下載下傳量接近3萬次。其客戶包括AppDynamics、Evernote 、MapR以及金融服務、電信、醫療保健、媒體業的财富500強公司。

1.2、ansible如何工作:

Ansible預設是通過SSH通道來管理的,也就是它所說的免用戶端方式管理, 它底層是通過 paramiko 來實作的。   

ansible執行過程大體過程如下圖,其中暖色調的代表已經子產品化。

<a href="http://s3.51cto.com/wyfs02/M01/27/E7/wKiom1N1faXDDKHyAAJ2qmuQi9E804.jpg" target="_blank"></a>

ansible有如下優點:        1.3.1、輕量級,他不需要去用戶端安裝agent,更新時,隻需要在操作機上進行一次更新即可         1.3.2、批量任務執行可以寫成腳本,而且不用分發到遠端就可以執行         1.3.3、使用python編寫的,維護更簡單         1.3.4、支援sudo
缺點:        1.3.5、對于幾千台、上萬台機器的操作,還不清楚性能、效率情況如何,需要進一步了解。        
1.4.1、安裝前提 Control Machine Requirements Currently Ansible can be from any machine with Python 2.6 installed (Windows isn’t supported for the control machine). This includes Red Hat, Debian, CentOS, OS X, any of the BSDs, and so on. Managed Node Requirements On the managed nodes, you only need Python 2.4 or later, but if you are are running less than Python 2.5 on the remotes, you will also need: python-simplejson 1.4.2、源碼安裝 1.4.3、pip安裝 1.4.4、yum安裝 <code>[root@ansible ~]#</code> <code>[root@ansible ~]# rpm -qa | grep ansible  # 檢查是否安裝</code> <code>ansible-1.5.3-1.el6.noarch</code> <code>[root@ansible ~]# yum install ansible -y  # 沒有安裝的話,使用這個安裝即可</code>

1.5、ansible組成介紹

1.5.1、包含檔案介紹 <code>[root@ansible ~]# tree /etc/ansible/</code> <code>/etc/ansible/</code> <code>├── ansible.cfg  # ansible的配置檔案</code> <code>└── hosts             # ansible的主倉庫 用來存儲需要管理的遠端主機的相關資訊</code> <code>0 directories, 2 files</code>
1.5.2、ansible其他元件介紹 ansible-doc                子產品文檔檢視器,很有用,使用ansible -l 顯示所有module清單,使用 ansible-doc  &lt;module_x&gt; 來檢視module_x的詳細文檔,這裡不做太多介紹 ansible-playbook    傳說中的配置管理工具,如果你用過puppet或者saltstack,這個可以不用介紹了,如果你沒用過,也沒關系,花費20分鐘看下官方的 Video。 掌握一件事情最好的辦法就是使用它,你可以下載下傳官方的example來學習 ansible-galaxy         和三星沒關系,你可以把他了解成ansible的pip,可以從galaxy.ansible.com下載下傳官方收錄的playbooks ansible-pull               支援直接從git下載下傳playbook執行,需要遵循其規定的目錄格式,用處不是特别大,可以不關注 ansible-vault            如果你的配置檔案中含有敏感資訊,你可能并不希望他能被人看到,vault可以幫你加密/解密這個配置檔案,進階用法,請參照http: //blog.ansibleworks.com/2014/02/19/ansible-vault/ ansible.cfg檔案不用去管,我們隻需要配置hosts檔案即可,hosts檔案也就是官方說的Inventory, hosts檔案配置的幾種格式: 單純的寫主機名或ip,所屬組為all <code>#blue.example.com</code> <code>#192.168.100.1</code> 定義一個組 <code>#[webservers]</code> <code>#alpha.example.org</code> <code>#beta.example.org</code> <code>#192.168.1.100</code> 組成員可以使用通配符來比對 www[001:006].example.com 如果你沒有使用公鑰,想要使用密碼,你也可以這樣寫(适用于第一次登陸控制) 格式:【主機名】 【主機位址】 【主機密碼】  預設是root使用者來進行的 <code>[keepalived]</code> <code>keepalived1  ansible_ssh_host=192.168.146.136 ansible_ssh_pass="test"</code> <code>keepalived2  ansible_ssh_host=192.168.146.137 ansible_ssh_pass="test"</code> hosts檔案設定的參數官方給出的:

<a href="http://img1.51cto.com/attachment/201405/15/4265610_1400152589OJFT.png" target="_blank"></a>

1.6、ansible的簡單使用

1.6.1、上傳公鑰到遠端主機 定義好了倉庫,那麼我們就需要把控制端的公鑰推送到遠端主機上 (稍後會有講到) 方法:1、使用expect+shell方式批量推送 方法:2、自己手動一個一個的推送 1.6.2、牛刀小試看看效果如何
好了,公鑰都傳到對方主機了,那麼我們來簡單的使用來試用下 <code>[root@ansible ~]# ansible keepalived -a "uptime"  # 預設使用command子產品</code> <code>keepalived1 | success | rc=0 &gt;&gt;</code> <code> </code><code>13:07:24 up  7:59,  1 user,  load average: 0.00, 0.00, 0.00</code> <code>keepalived2 | success | rc=0 &gt;&gt;</code> <code> </code><code>13:07:31 up  7:58,  1 user,  load average: 0.00, 0.00, 0.00</code>
常用子產品: yum、service、shell、raw yum子產品常用來安裝軟體 service子產品常用來對服務的開關操作 shell子產品可以用來執行指令以及腳本 raw和command、shell類似,但是它可以傳遞管道 <code>[root@ansible ~]# ansible keepalived -m raw -a "rpm -qa | grep xinetd"  # 使用raw子產品檢視遠端伺服器上是否安裝了xinetd服務</code> <code>keepalived1 | FAILED | rc=1 &gt;&gt;</code> <code>keepalived2 | FAILED | rc=1 &gt;&gt;</code> <code>[root@ansible ~]# ansible keepalived -m yum -a "name=xinetd state=latest"  # 使用yum子產品進行安裝yum源裡最新版的xinetd軟體</code> <code>keepalived1 | success &gt;&gt; {</code> <code>    </code><code>"changed": true,</code> <code>    </code><code>"msg": "",</code> <code>    </code><code>"rc": 0,</code> <code>    </code><code>"results": [</code> <code>        </code><code>"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * epel: ftp.riken.jp\nSetting up Install Process\nResolving Dependencies\n--&gt; Running transaction check\n---&gt; Package xinetd.x86_64 2:2.3.14-39.el6_4 will be installed\n--&gt; Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch            Version                    Repository     Size\n================================================================================\nInstalling:\n xinetd          x86_64          2:2.3.14-39.el6_4          base          121 k\n\nTransaction Summary\n================================================================================\nInstall       1 Package(s)\n\nTotal download size: 121 k\nInstalled size: 259 k\nDownloading Packages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction Test Succeeded\nRunning Transaction\n\r  Installing : 2:xinetd-2.3.14-39.el6_4.x86_64                              1/1 \n\r  Verifying  : 2:xinetd-2.3.14-39.el6_4.x86_64                              1/1 \n\nInstalled:\n  xinetd.x86_64 2:2.3.14-39.el6_4                                               \n\nComplete!\n"</code> <code>    </code><code>]</code> <code>}</code> <code>keepalived2 | success &gt;&gt; {</code> <code>        </code><code>"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * epel: mirrors.yun-idc.com\nSetting up Install Process\nResolving Dependencies\n--&gt; Running transaction check\n---&gt; Package xinetd.x86_64 2:2.3.14-39.el6_4 will be installed\n--&gt; Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch            Version                    Repository     Size\n================================================================================\nInstalling:\n xinetd          x86_64          2:2.3.14-39.el6_4          base          121 k\n\nTransaction Summary\n================================================================================\nInstall       1 Package(s)\n\nTotal download size: 121 k\nInstalled size: 259 k\nDownloading Packages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction Test Succeeded\nRunning Transaction\n\r  Installing : 2:xinetd-2.3.14-39.el6_4.x86_64                              1/1 \n\r  Verifying  : 2:xinetd-2.3.14-39.el6_4.x86_64                              1/1 \n\nInstalled:\n  xinetd.x86_64 2:2.3.14-39.el6_4                                               \n\nComplete!\n"</code> <code>[root@ansible ~]# ansible keepalived -m raw -a "rpm -qa | grep xinetd"  # 再次使用raw子產品檢視xinetd是否安裝</code> <code>xinetd-2.3.14-39.el6_4.x86_64</code> <code>[root@ansible ~]# ansible keepalived -m shell -a "service xinetd restart"   # 使用shell子產品啟動xinetd服務</code> <code>Stopping xinetd: [FAILED]</code> <code>Starting xinetd: [  OK  ]</code> <code>[root@ansible ~]# ansible keepalived -m service -a "name=xinetd state=restarted" # 同樣你也可以使用service子產品進行服務的啟動,關閉和重新開機</code> <code>    </code><code>"name": "xinetd",</code> <code>    </code><code>"state": "started"</code>

NOTE:

   通俗點說,ansible執行管理的時候分兩部分:

1、Ad-Hoc(我們剛才1.6所示範的就是屬于Ad-Hoc)

What’s an ad-hoc command?

An ad-hoc command is something that you might type in to do something really quick, but don’t want to save for later.

詳情請檢視:http://www.ansible.cn/docs/intro_adhoc.html

2、Playbooks

Playbooks are Ansible’s configuration, deployment, and orchestration language. They can describe a policy you want your remote systems to enforce, or a set of steps in a general IT process.

詳情請檢視:http://www.ansible.cn/docs/#playbooks

ansible-shell是用python寫出來的一個腳本,配合ansible使用的一個利器,可以讓你像在shell下一樣使用指令。

<code>[root@ansible ~]#  git clone https://github.com/dominis/ansible-shell.git</code>

<code>[root@ansible ~]#  pip install -e ./ansible-shell</code>

<a href="http://img1.51cto.com/attachment/201405/15/4265610_1400152589Wwb8.png" target="_blank"></a>

ansible-shell内置的指令主要有四個:

cd :      切換到指定的組/表達式篩選的機器集合上

list:    顯示目前的機器集合,list groups 可以列出所有的組(對我們可能沒啥用)

serial:  運作時的并發度,預設是2

help:    顧名思義,他能生成簡單的子產品幫助資訊,友善即時查詢

<a href="http://s3.51cto.com/wyfs02/M02/27/E7/wKiom1N1f_vClWaQAAS97Kryses820.jpg" target="_blank"></a>

當然,ansible-shell的功能不止這些,這裡隻是做下簡單的示範而已,我們後期會繼續更新相關内容

如果你python不錯的話,可以在ansible-shell的基礎上進行修改,更新,確定更加适合你的環境。

好 了,ansible和ansible-shell大緻講解了一下,“知道的越多,肩上的責任越重“,随之而來是你如何在一個很大的環境中來使用 ansible,因為ansible是依托于ssh的,難到你要手動的去ssh-copy-id到幾十台,幾百台甚至上千台機器上麼,估計等你公鑰都傳完 了,早已經過了項目上線的時間,在這裡我們使用ansible來進行公鑰的批量推送,以下幾個是我個人思路,如果你有更好的方式請告知

1、shell 腳本 + expect

2、scp 腳本 + expect + 修改authorized_keys檔案權限

3、ansible直接推送腳本

個人感覺:

第一個坑:1和2兩條的主要問題是,第一次ssh到遠端主機上的時候,遠端主機會對你進行公鑰驗證,是以這是一個坑,

第二個坑:針對scp上傳之後,檔案不對又是另外一個坑

第三個坑:如果隻是簡單的使用expect的話,remote host主機密碼要統一,不統一的話又是一個大坑

第四個坑:使用ansible推送公鑰的話,第一次操作需要把遠端主機的資訊,賬戶,密碼都寫到host檔案中去,這是一項大的工程

廢話不多說,我們繼續上幹貨

三、使用ansible的authorized_keys子產品+yaml實作批量上傳公鑰

3.1、生成秘鑰對

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''  # 生産密鑰對

這個指令會産生一個公鑰(~/.ssh/id_rsa.pub)和密鑰(~/.ssh/id_rsa),

 -t dsa:表示使用密鑰的加密類型,可以為'rsa'和'dsa'

 -P '':表示不需要密碼登入

 -f ~/.ssh/id_dsa:表示密鑰存放的路徑為${USER}/.ssh/id_dsa

ssh-copy-id -i ~/.ssh/id_rsa.pub username@[ip,hostname]  #如果你是單台機器的話,可以使用這種方式把公鑰檔案傳遞到對方主機

<a href="http://img1.51cto.com/attachment/201405/15/4265610_1400152589LBdv.png" target="_blank"></a>

PS:

   很多時候,一些童鞋使用scp來把公鑰檔案傳遞到遠端主機上,然後再給cat到遠端主機的authorized_keys檔案中,但是這種情況是屬于你手動建立了authorized_keys檔案,這個時候這個檔案的權限跟你系統定義的umask是相關聯的,是以也就導緻了你已經上傳公鑰到遠端主機但是依舊不能通過公鑰來登入遠端主機。這是authorized_keys檔案權限問題導緻的。

無圖無真相,來看看我們已經做好的一台ansible機器上來羅列遠端主機上的authorized_keys的權限,如果你的機器不行,那就改為600即可

<a href="http://img1.51cto.com/attachment/201405/15/4265610_1400152589WIlT.png" target="_blank"></a>

3.2、使用ansible-playbook來生成推送ymal檔案

這裡使用到了authoried_keys子產品

估計背牆了,是以。。。。。

authoried_keys子產品參數介紹

<a href="http://img1.51cto.com/attachment/201405/15/4265610_14001525902EXC.png" target="_blank"></a>

修改ansible的hosts(Inventory)檔案,如下圖所示,格式:

[主機名] [ssh連接配接賬戶] [ssh主機位址] [ssh連接配接賬戶對應的密碼]

<a href="http://img1.51cto.com/attachment/201405/15/4265610_1400152591KsFo.png" target="_blank"></a>

下面示範我們使用ansible-playbook來推送我們寫好的ymal檔案

再次檢視hosts檔案内容

<a href="http://img1.51cto.com/attachment/201405/15/4265610_1400152595O966.png" target="_blank"></a>

到了這裡你可以對着大片的伺服器說,管理你們so easy,從此你不用在為不會except而發愁,解放你的雙手,讓你更從容,更快速便捷的來管理你的伺服器群組!如果你會python,那就是如虎添翼了!

國内一個團隊把1.3的官方文檔全部移過來了,從此你再也不用擔心閱讀官方文檔被牆了,感謝他們。。。

想要了解yaml的同學可以移步到這裡:

後續主要針對ansible-playbook對線上環境的使用部落格,敬請關注

<b>本文轉自 dengaosky 51CTO部落格,原文連結:http://blog.51cto.com/dengaosky/1853563,如需轉載請自行聯系原作者</b>