ansible(一)--基本安裝使用
ansible(一)——基本安裝使用
單位用的ansible,也用了salt,所以自動(dòng)化管理工具,基本上幾個(gè)重量級(jí)的都用到了,所以這邊總結(jié)就開始利用三者對(duì)比使用的總結(jié)
step0:簡(jiǎn)介
- Ansible是一種集IT系統(tǒng)的配置管理、應(yīng)用部署、流程設(shè)置的開源軟件工具,與其他管理軟件工具有多方面的差異。目標(biāo)是提供面對(duì)廣泛的自動(dòng)化挑戰(zhàn)如何獲得大型生產(chǎn)力的優(yōu)勢(shì)。當(dāng)Ansible提供更強(qiáng)大的生產(chǎn)力逐步替代其他許多核心性能的自動(dòng)化解決方案,它也在尋求解決其他還沒解決的IT挑戰(zhàn),這些包括如何時(shí)復(fù)雜多層級(jí)工作流程清晰化、清楚統(tǒng)一的OS配置、在單一框架下應(yīng)用軟件的部署。
- Ansible追尋保持IT工作流程描述的可理解性和能夠快速部署。這意味著需要容易構(gòu)建、容易理解 – 例如新用戶能夠快速融入新的IT項(xiàng)目。長(zhǎng)期存在自動(dòng)化的內(nèi)容即使是項(xiàng)目結(jié)束數(shù)個(gè)月之后也能夠容易理解。Ansible追尋使事情強(qiáng)大滿足專家使用,同時(shí)也能滿足不同水平級(jí)別用戶需求,保證較快把IT項(xiàng)目推向市場(chǎng),在IT配置需要變更時(shí)候能夠易于較快、較少錯(cuò)誤。
- Ansible是基于最小性質(zhì)、一致性、安全性、高可靠性設(shè)計(jì)的,同時(shí)對(duì)于管理員、開發(fā)者、IT經(jīng)理的學(xué)習(xí)曲線都非常低。
- Ansible和該領(lǐng)域許多其他的工具的最主要區(qū)別就是他們的架構(gòu):
- Ansible默認(rèn)管理遠(yuǎn)端機(jī)器是通過SSH,可以使用paramiko庫(kù)(基于Python)或OS-native OpenSSH,當(dāng)使用OpenSSH時(shí)也支持Kerberized SSH和堡壘主機(jī)。
是否需要其他方式的傳輸,傳輸方式是可以以插件方式添加的,例如基于0MQ加速傳輸就是這種方式。也提供本地連接類型(無網(wǎng)絡(luò))。 - Ansible不需要root用戶權(quán)限,如果需要可以通過sudo來訪問。
- Ansible不需要指定的SSH密鑰或?qū)S脦ぬ?hào),可以使用任何OS授權(quán)用戶或遵從你的操作系統(tǒng)允許的模型提供的帳號(hào)
當(dāng)需要的時(shí)候,Ansible將傳輸模塊到遠(yuǎn)程節(jié)點(diǎn),將運(yùn)行在遠(yuǎn)程用戶授權(quán)的模式下,并且不會(huì)留下任何安裝信息在這些遠(yuǎn)程節(jié)點(diǎn)上。 - Ansible不需要任何在管理機(jī)器運(yùn)行的服務(wù)軟件,只需要授權(quán)用戶有執(zhí)行權(quán)限就可以。
- Ansible不需要在任何遠(yuǎn)端機(jī)器上安裝任何代理軟件。
不需要維護(hù)除SSH端口之外的任何端口和額外的PKI架構(gòu)。
這些訪問控制服務(wù)器(或源控制)不能推送內(nèi)容到遠(yuǎn)程系統(tǒng)(除了命令他們)也在遠(yuǎn)程系統(tǒng)上沒有授權(quán)
當(dāng)Ansible不管理遠(yuǎn)程機(jī)器時(shí)候,遠(yuǎn)程這些機(jī)器沒有任何資源損耗。 - Ansible集這些特性于一身,使它成為高安全環(huán)境、高性能情況下的理想選擇,同時(shí)關(guān)注管理代理的穩(wěn)定性或性能,通常這些特性在所有的計(jì)算機(jī)領(lǐng)域都是有用的。
以上內(nèi)容摘自ansible中國(guó)工作組 http://www.ansible.cn/wordpress/?p=27
Ansible Vs. puppet Vs. Saltstack 對(duì)比
/ | Puppet | Saltstack | ansible
—- | —- | —- | —-
開發(fā)語言 | Ruby | Python | Python
是否有客戶端 | 有 | 有 | 無
是否支持二次開發(fā) | 不支持 | 支持 | 支持
服務(wù)器與遠(yuǎn)程機(jī)器是否相互驗(yàn)證 | 是 | 是 | 是
服務(wù)器與遠(yuǎn)程機(jī)器通信是否加密 | 是,標(biāo)準(zhǔn) SSL 協(xié)議 | 是,使用 AES | 加密 是,使用 OpenSSH
平臺(tái)支持 | 支持 AIX、BSD、HP-UX、Linux、 MacOSX、Solaris、 Windows | 支持 BSD、Linux、Mac OS X、Solaris、 Windows | 支持 AIX、BSD、 HP-UX、 Linux、Mac OSX、Solaris
是否提供 web ui | 提供 | 提供 | 提供,不過是商業(yè)版本
配置文件格式 | Ruby 語法格式 | YAML | YAML
命令行執(zhí)行 | 不支持,但可通過配置模塊實(shí)現(xiàn) | 支持 | 支持
如果去國(guó)外找找,Ansible在國(guó)外的流行程度甚至超過salt
系統(tǒng)環(huán)境
Distribution : CentOS 6.5 minimal
ansible version : 1.5.5
Init system : sysvinit
安裝之前
1、時(shí)間同步
2、關(guān)閉selinux
step1:安裝
1.拓?fù)?/h4>
node134:master
node131:slave
2.安裝
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum install ansible
Mac 下的安裝
當(dāng)用Mac os進(jìn)行管理的時(shí)候,使用了密碼管理會(huì)提示
to use the 'ssh' connection type with passwords, you must install the sshpass program
centos或者Ubuntu都可以用包管理工具進(jìn)行管理,但是Mac上homebrew卻因?yàn)榘踩虿恢С诌@個(gè)包,所以必須手動(dòng)或者安裝非官方的包
第一種方式:手動(dòng)安裝
cd ~/Downloads
curl -O -L http://downloads.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
tar xvzf sshpass-1.05.tar.gz
cd sshpass-1.05
./configure
make
sudo make install
```
第二種方式,安裝Mac os包管理器之外第三方包
brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb
3.配置文件
/etc/ansible/hosts — 默認(rèn)資源文件
/usr/share/ansible/ — 默認(rèn)模塊庫(kù)
/etc/ansible/ansible.cfg — 默認(rèn)配置文件
~/.ansible.cfg — 用戶配置文件,如果使用優(yōu)先級(jí)高于ansible.cfg配置文件
node134:master
node131:slave
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum install ansible
當(dāng)用Mac os進(jìn)行管理的時(shí)候,使用了密碼管理會(huì)提示
to use the 'ssh' connection type with passwords, you must install the sshpass program
centos或者Ubuntu都可以用包管理工具進(jìn)行管理,但是Mac上homebrew卻因?yàn)榘踩虿恢С诌@個(gè)包,所以必須手動(dòng)或者安裝非官方的包
第一種方式:手動(dòng)安裝
cd ~/Downloads
curl -O -L http://downloads.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
tar xvzf sshpass-1.05.tar.gz
cd sshpass-1.05
./configure
make
sudo make install
```
第二種方式,安裝Mac os包管理器之外第三方包
brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb
/etc/ansible/hosts — 默認(rèn)資源文件
/usr/share/ansible/ — 默認(rèn)模塊庫(kù)
/etc/ansible/ansible.cfg — 默認(rèn)配置文件
~/.ansible.cfg — 用戶配置文件,如果使用優(yōu)先級(jí)高于ansible.cfg配置文件
具體配置文件參考:http://docs.ansible.com/intro_configuration.html#pipelining
step2:遠(yuǎn)程執(zhí)行命令
ansible是基于ssh協(xié)議之上進(jìn)行遠(yuǎn)程管理,所以無須安裝客戶端,直接只要能ssh連接過去,就可以進(jìn)行管理了
1.配置管理客戶端和秘鑰登錄
cp hosts hosts.bak
vim hosts
[test] //group_name,名稱可以自定義,可以將不同的作用的機(jī)器放在不同的組里
192.168.122.134
192.168.122.131
[test]
192.168.122.134 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=skstserver
#ssh無秘鑰登錄
ssh-keygen -t rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.122.131
2、批量發(fā)送公鑰
為ansible開始管理節(jié)點(diǎn)傳遞公鑰
如果是可以直接使用root的環(huán)境,則直接使用這個(gè)腳本
vim tra_pub.exp
#!/usr/bin/expect -f
set timeout -1
set user root
set passwd "123456"
for { set i 201 } { $i < 208 } { incr i } {
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $user@192.168.1.$i
expect {
"yes/no" { send "yes\r";exp_continue }
"id_rsa" { send "yes\r";exp_continue }
"*assword" { send "$passwd\r" }
}
}
expect eof
如果需要使用普通用戶進(jìn)行切換的環(huán)境則可以使用以下的腳本
#!/usr/bin/expect -f
set timeout -1
set user test
set passwd "123456"
for { set i 100 } { $i < 120 } { incr i } {
spawn ssh -l $user 172.41.30.$i
expect {
"yes/no" { send "yes\r";exp_continue }
"id_rsa" { send "yes\r";exp_continue }
"*assword" { send "$passwd\r" ;exp_continue }
"test@" {
send "sudo su -\r"
expect {
"password for test" { send "$passwd\r";exp_continue }
}
}
}
}
expect eof
exit 0
3、批量定義inventory
直接利用for循環(huán)進(jìn)行批量的寫入
for i in $(seq 200 240);do echo 192.168.1.$i >> /etc/ansible/hosts;done
4.測(cè)試遠(yuǎn)程執(zhí)行命令
# ansible all -a 'pwd' -f 10 #10個(gè)線程
192.168.122.131 | success | rc=0 >>
/root
192.168.122.134 | success | rc=0 >>
/root
step3:利用模塊管理遠(yuǎn)程主機(jī)
# tree /usr/share/ansible/ -L 1 \\所有模塊庫(kù)存放位置
/usr/share/ansible/
├── cloud
├── commands
├── database
├── files
├── internal
├── inventory
├── messaging
├── monitoring
├── net_infrastructure
├── network
├── notification
├── packaging
├── source_control
├── system
├── utilities
└── web_infrastructure
16 directories, 0 files
1.創(chuàng)建定時(shí)任務(wù)
這邊以定時(shí)任務(wù)模塊舉例,創(chuàng)建定時(shí)任務(wù)
模塊主頁:http://docs.ansible.com/cron_module.html# ansible test -m cron -a 'name="create test crontab" minute="*1" job="/usr/sbin/ntpdate pool.ntp.org &> /dev/null"' 192.168.122.131 | success >> { "changed": true, "jobs": [ "create test crontab" ] } 192.168.122.134 | success >> { "changed": true, "jobs": [ "create test crontab" ] }
檢測(cè)結(jié)果
# ansible all -a 'crontab -l'
#Ansible: create test crontab
*1 * * * * /usr/sbin/ntpdate pool.ntp.org &> /dev/null
#Ansible: create test crontab
*1 * * * * /usr/sbin/ntpdate pool.ntp.org &> /dev/null
2.判斷某個(gè)服務(wù)是否正常啟動(dòng)
模塊主頁:http://docs.ansible.com/service_module.html
# ansible all -m service -a 'name=httpd state=started' 192.168.122.131 | FAILED >> { "failed": true, "msg": "cannot find 'service' binary or init script for service, possible typo in service name?, aborting" } 192.168.122.134 | success >> { "changed": true, "name": "httpd", "state": "started" }
\因?yàn)樵?22.134上,有安裝的httpd的啟動(dòng)腳本,而131上沒有,所以module執(zhí)行成功的前提是需要有相關(guān)的服務(wù)支持
3.批量安裝包
# ansible all -a 'rpm -q vsftpd' \\查看遠(yuǎn)程機(jī)器上是否安裝了vsftpd的包
192.168.122.131 | FAILED | rc=1 >>
package vsftpd is not installed
192.168.122.134 | FAILED | rc=1 >>
package vsftpd is not installed
```
#利用yum的module來進(jìn)行
# ansible all -m yum -a 'name=vsftpd state=present'
\\安裝過程取決于網(wǎng)絡(luò)安裝的速度
```
#檢測(cè)結(jié)果
# ansible all -a 'rpm -q vsftpd'
192.168.122.131 | success | rc=0 >>
vsftpd-2.2.2-11.el6_4.1.x86_64
192.168.122.134 | success | rc=0 >>
vsftpd-2.2.2-11.el6_4.1.x86_64
ansible的功能遠(yuǎn)遠(yuǎn)不止如此,重頭的playbook也是下面要學(xué)習(xí)的重點(diǎn)
4、查看節(jié)點(diǎn)信息
ansible all -m setup
這里的信息即為gather信息,后面可以使用這些信息做一些判斷
step4:執(zhí)行原理
參考了the5fire博客的內(nèi)容
大概的流程,只是針對(duì)playbook來說(Ad-Hoc的執(zhí)行是直接掉得runner)。
1.首先ansbile-playbook接受到參數(shù): playbook.yml,然后讀取這個(gè)yml文件,根據(jù)這個(gè)yml文件生成Playbook對(duì)象,代碼: class Playbook 。
2.在這個(gè)Playbook中加載yml文件,在執(zhí)行時(shí)生成Play對(duì)象,在Play對(duì)象中又包含了Task對(duì)象,一個(gè)Task對(duì)象可以算是一個(gè)最小的執(zhí)行單元。
3.到了Task這一步之后就應(yīng)該調(diào)用runner接口了,這個(gè)接口的調(diào)用還是在Playbook這個(gè)類中: Playbook._run_task_internal 。而這個(gè)runner接口,上面已經(jīng)介紹了,到此也就大體了解上層的執(zhí)行過程了。
step5:FAQ
1、"msg": "Error: ansible requires a json module, none found!"
原因是python版本過低,要不升級(jí)python要不就安裝python-simplejson
```
2、paramiko: The authenticity of host '192.168.122.132' can't be established.
The ssh-rsa key fingerprint is 397c139fd4b0d763fcffaee346a4bf6b.
Are you sure you want to continue connecting (yes/no)?
如果know_hosts中沒有目標(biāo)機(jī)器,那么ansible第一次連接的時(shí)候會(huì)報(bào)一個(gè)異常
如果不希望提示這個(gè)異常,直接編輯
# vim ansible.cfg
host_key_checking = False #取消注釋
```
3、FAILED: not a valid DSA private key file
需要你在最后添加參數(shù)-k,也就是-k, --ask-pass ask for SSH password
另外默認(rèn)ansible是使用key驗(yàn)證的,如果使用密碼登陸的服務(wù)器,使用ansible的話,要不修改ansible.cfg配置文件的ask_pass = True給取消注釋,
要不就在運(yùn)行命令時(shí)候加上-k,這個(gè)意思是-k, --ask-pass ask for SSH password
```
4、Error: ssh encountered an unknown error during the connection
命令行碰到這個(gè)問題,兩種辦法可以解決,
a、inventory的每個(gè)item記錄后面加上 ansible_ssh_user=root,當(dāng)然環(huán)境不允許root的,需要進(jìn)行sudo了
b、命令行上加上-u user進(jìn)行連接

浙公網(wǎng)安備 33010602011771號(hào)