自動化運維工具ansible學習+使用ansible批量推送公鑰到遠程主機


目錄:

一、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簡介
1.1、ansible是什么

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強公司。

 

免費版:http://www.ansibleworks.com/docs/

 

1.2、ansible如何工作:
Ansible默認是通過SSH通道來管理的,也就是它所說的免客戶端方式管理, 它底層是通過 paramiko 來實現的。   
對Ansible底層工作機制感興趣的可以參考這個:  http://www.the5fire.com/explore-the-ansible.html

 

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

wKiom1N1faXDDKHyAAJ2qmuQi9E804.jpg

圖片來源於:http://ju.outofmemory.cn/entry/67581

 

1.3、ansible優缺點

ansible有如下優點:       
1.3.1、輕量級,他不需要去客戶端安裝agent,更新時,只需要在操作機上進行一次更新即可        
1.3.2、批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行        
1.3.3、使用python編寫的,維護更簡單        
1.3.4、支持sudo

缺點:       
1.3.5、對於幾千台、上萬台機器的操作,還不清楚性能、效率情況如何,需要進一步了解。        

 
1.4、ansible安裝方式
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安裝
1
2
3
4
[root@ansible ~]#
[root@ansible ~]# rpm -qa | grep ansible  # 檢查是否安裝
ansible-1.5.3-1.el6.noarch
[root@ansible ~]# yum install ansible -y  # 沒有安裝的話,使用這個安裝即可

 

 
1.5、ansible組成介紹
1.5.1、包含文件介紹
1
2
3
4
5
6
[root@ansible ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg  # ansible的配置文件
└── hosts             # ansible的主倉庫 用來存儲需要管理的遠程主機的相關信息
0 directories, 2 files
[root@ansible ~]#
1.5.2、ansible其他組件介紹

ansible-doc                模塊文檔查看器,很有用,使用ansible -l 顯示所有module列表,使用 ansible-doc  <module_x> 來查看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/

1.5.3、ansible的  Inventory 介紹
ansible.cfg文件不用去管,我們只需要配置hosts文件即可,hosts文件也就是官方說的Inventory,
 
hosts文件配置的幾種格式:
單純的寫主機名或ip,所屬組為all
1
2
#blue.example.com
#192.168.100.1
 
定義一個組
1
2
3
4
#[webservers]
#alpha.example.org
#beta.example.org
#192.168.1.100
組成員可以使用通配符來匹配 www[001:006].example.com
 
如果你沒有使用公鑰,想要使用密碼,你也可以這樣寫(適用於第一次登陸控制)
格式:【主機名】 【主機地址】 【主機密碼】  默認是root用戶來進行的
1
2
3
[keepalived]
keepalived1  ansible_ssh_host=192.168.146.136 ansible_ssh_pass="test"
keepalived2  ansible_ssh_host=192.168.146.137 ansible_ssh_pass="test"

 

hosts文件設置的參數官方給出的:

1c2a7094-1c62-4a4a-98ef-8a6a8b0cfcb3

 

 

1.6、ansible的簡單使用

1.6.1、上傳公鑰到遠程主機

定義好了倉庫,那么我們就需要把控制端的公鑰推送到遠程主機上 (稍后會有講到)

方法:1、使用expect+shell方式批量推送

方法:2、自己手動一個一個的推送

1.6.2、牛刀小試看看效果如何

好了,公鑰都傳到對方主機了,那么我們來簡單的使用來試用下

1
2
3
4
5
6
[root@ansible ~]# ansible keepalived -a "uptime"  # 默認使用command模塊
keepalived1 | success | rc=0 >>
 13:07:24 up  7:59,  1 user,  load average: 0.00, 0.00, 0.00
keepalived2 | success | rc=0 >>
 13:07:31 up  7:58,  1 user,  load average: 0.00, 0.00, 0.00
[root@ansible ~]#
 

常用模塊:

yum、service、shell、raw

yum模塊常用來安裝軟件

service模塊常用來對服務的開關操作

shell模塊可以用來執行命令以及腳本

raw和command、shell類似,但是它可以傳遞管道

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@ansible ~]# ansible keepalived -m raw -a "rpm -qa | grep xinetd"  # 使用raw模塊查看遠程服務器上是否安裝了xinetd服務
keepalived1 | FAILED | rc=1 >>
keepalived2 | FAILED | rc=1 >>
[root@ansible ~]# ansible keepalived -m yum -a "name=xinetd state=latest"  # 使用yum模塊進行安裝yum源里最新版的xinetd軟件
keepalived1 | success >> {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * epel: ftp.riken.jp\nSetting up Install Process\nResolving Dependencies\n--> Running transaction check\n---> Package xinetd.x86_64 2:2.3.14-39.el6_4 will be installed\n--> 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"
    ]
}
keepalived2 | success >> {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * epel: mirrors.yun-idc.com\nSetting up Install Process\nResolving Dependencies\n--> Running transaction check\n---> Package xinetd.x86_64 2:2.3.14-39.el6_4 will be installed\n--> 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"
    ]
}
[root@ansible ~]# ansible keepalived -m raw -a "rpm -qa | grep xinetd"  # 再次使用raw模塊查看xinetd是否安裝
keepalived1 | success | rc=0 >>
xinetd-2.3.14-39.el6_4.x86_64
keepalived2 | success | rc=0 >>
xinetd-2.3.14-39.el6_4.x86_64
[root@ansible ~]# ansible keepalived -m shell -a "service xinetd restart"   # 使用shell模塊啟動xinetd服務
keepalived2 | success | rc=0 >>
Stopping xinetd: [FAILED]
Starting xinetd: [  OK  ]
keepalived1 | success | rc=0 >>
Stopping xinetd: [FAILED]
Starting xinetd: [  OK  ]
[root@ansible ~]#
[root@ansible ~]# ansible keepalived -m service -a "name=xinetd state=restarted" # 同樣你也可以使用service模塊進行服務的啟動,關閉和重啟
keepalived1 | success >> {
    "changed": true,
    "name": "xinetd",
    "state": "started"
}
keepalived2 | success >> {
    "changed": true,
    "name": "xinetd",
    "state": "started"
}
[root@ansible ~]#

 

 

 

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簡介
2.1、ansible-shell是什么
ansible-shell是用python寫出來的一個腳本,配合ansible使用的一個利器,可以讓你像在shell下一樣使用命令。
 

項目地址:https://github.com/dominis/ansible-shell

 

2.2、ansible-shell安裝方式

 

1
2
[root@ansible ~]#  git clone https://github.com/dominis/ansible-shell.git
[root@ansible ~]#  pip install -e ./ansible-shell

 

2.3、ansible-shell簡單使用

 

2

 

ansible-shell內置的命令主要有四個:

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

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

serial:  運行時的並發度,默認是2

help:    顧名思義,他能生成簡單的模塊幫助信息,方便即時查詢

 

wKiom1N1f_vClWaQAAS97Kryses820.jpg

 

當然,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]  #如果你是單台機器的話,可以使用這種方式把公鑰文件傳遞到對方主機

 

3
PS:
   很多時候,一些童鞋使用scp來把公鑰文件傳遞到遠程主機上,然后再給cat到遠程主機的 authorized_keys文件中,但是這種情況是屬於你手動創建了authorized_keys文件,這個時候這個文件的權限跟你系統定義的umask是相關聯的,所以也就導致了你已經上傳公鑰到遠程主機但是依舊不能通過公鑰來登錄遠程主機。這是 authorized_keys文件權限問題導致的。

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

 

4

 

3.2、使用ansible-playbook來生成推送ymal文件

這里使用到了authoried_keys模塊
估計背牆了,所以。。。。。

authoried_keys模塊參數介紹

 

5 

 

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

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

 

6

 

下面演示我們使用ansible-playbook來推送我們寫好的ymal文件

 

78

 

再次查看hosts文件內容

 

9

 

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

 

四、相關站點的推薦

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

對應官方的1.3版本的手冊:http://www.ansible.cn/docs/

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

YAML的官方網站:http://www.yaml.org

 

后續主要針對ansible-playbook對線上環境的使用博客,敬請關注

參考文章:  
http://www.kankanews.com/ICkengine/archives/136988.shtml
http://www.shencan.net/index.php/2014/04/10/ansible-好***-ansible-shell/
https://github.com/dominis/ansible-shell
https://linuxtoy.org/archives/hands-on-with-ansible.html
https://github.com/ansible/ansible
http://www.the5fire.com/explore-the-ansible.html
http://ju.outofmemory.cn/entry/67581

分享到:  0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM