天天看點

自動化運維之Ansible的安裝與簡單入門指令

早就聽說ansible簡單友善,但是一直沒有去認真了解過,想要了解ansible的沖動是因為需要在100多台伺服器上分發一個腳本,實在不想一台一台登陸上去操作。簡單翻了一下文檔,發現ansible上手挺容易的。最心水的還是所有的操作和配置都可以在管理結點完成,不需要在被管理結點安裝agent,唯一的要求可能就是python版本了。管理結點的python要是2.6及以上,被管理結點的python版本如果是2.4需要安裝simplejson包。

先從安裝說起吧,如果不嫌棄linux系統自帶ansible包版本低的話,可以直接安裝:

yum install ansible -y

也可以在github上clone一個新版本來安裝,步驟如下

git clone git://github.com/ansible/ansible.git --recursive

cd ./ansible

source ./hacking/env-setup

easy_install pip

pip install paramiko PyYAML Jinja2 httplib2 six

echo "127.0.0.1" > ~/ansible_hosts

export ANSIBLE_INVENTORY=~/ansible_hosts

執行你的第一條指令

在ansible_hosts在再加入一個被管理結點:

cat ansible_hosts 

127.0.0.1

10.32.1.206

ansible all -m ping --ask-pass

SSH password: 

127.0.0.1 | SUCCESS => {

    "changed": false, 

    "ping": "pong"

}

10.32.1.206 | SUCCESS => {

可以通過将管理節點的公鑰添加到被管理結點的authorized_keys中,就不需要--ask-pass來輸入密碼了。

先介紹幾個簡單常用的ad-hoc指令吧,什麼是ad-hoc呢?其實這是相對于ansible playbook來說的,ad-hoc就相當于在指令行敲shell指令,ansible playbook就相當于你執行一個shell腳本。總之簡單的任務交給ad-hoc,複雜的任務交給playbook.

ansible的幾個常用參數:

-u username          #指定ssh連接配接的使用者名,即執行後面指令的使用者,預設是目前使用者

-i inventory_file    #指定所使用的inventory檔案的位置,預設為/etc/ansible/hosts,此處測試了/root/ansible_hosts

-m module            #指定使用的子產品,預設為command

-f 10                #指定并發數,并發量大的時候,提高該值

--sudo [-k]          #當需要root權限執行的化,-k參數用來輸入root密碼

1,檢視被管理結點的負載

# ansible all -m command -a 'uptime' 

all表示/root/ansible_hosts檔案中的所有結點,可以在檔案中分組,[group1],group1表示組名,上面的指令如果隻想在group1中的結點執行則為:ansible group1 -m command -a 'uptime' --ask-pass

2,在被管理結點執行shell腳本

先來一個最簡單的腳本:

# cat t1.sh 

#!/bin/bash

ls -l /root/

# ansible all -m script -a '/root/t1.sh' 

當然你可以編寫可以實作複雜功能的腳本,這也就是為什麼網上有人不同意複雜的任務用playbook來做,用shell寫個腳本多簡單呀,YAML都可以不用學了。

3,拷貝檔案和目錄

拷貝目錄和檔案的指令都是一樣的。可以自行指定檔案和目錄的權限和屬主

拷貝檔案:

# ansible all -m copy -a "src=/root/test_dir dest=/tmp/ mode=777 owner=root" 

ansible all -m copy -a "src=/etc/fstab dest=/tmp/ mode=444 owner=root" 

4,删除檔案和目錄

拷貝目錄和檔案的指令都是一樣的,指定要删除的檔案的路徑就可以了,如果路徑是目錄的話,會将該目錄下面所有的檔案都删除掉

ansible all -m file -a "path='/tmp/fstab' state=absent" 

ansible all -m file -a "path='/tmp/test_dir' state=absent" 

5,軟體包管理

# ansible all -m yum -a "name=tree state=present"   

這條指令的意思是如果tree這個包沒有安裝,則安裝。

安裝完後我們可以測試一下指令是否可用

# tree test_dir/

test_dir/

└── t.txt

0 directories, 1 file

# ansible all -m yum -a "name=tree state=absent" --ask-pass

這個指令的意思是确認系統沒有安裝tree,如果有則解除安裝,我們執行完指令後再敲tree就報錯了。

[root@centos ~]# tree

-bash: /usr/bin/tree: No such file or directory

5,建立使用者和使用者組

# ansible all -m user -a "name=ansible_test groups=root,zabbix append=yes state=present" 

建立ansible_test使用者,并将其加入root,zabbix組

# id ansible_test

uid=503(ansible_test) gid=504(ansible_test) groups=504(ansible_test),0(root),503(zabbix)

6,管理服務

# ansible all -m service -a "name=mysqld state=stopped" 

停mysqld服務

# ansible all -m service -a "name=mysqld state=started" 

啟mysqld服務

# ansible all -m service -a "name=mysqld state=restarted" 

重新開機mysqld服務

ansible參考資料:

ansible-doc

子產品索引  http://docs.ansible.com/ansible/list_of_all_modules.html

角色倉庫  https://galaxy.ansible.com

谷歌論壇  https://groups.google.com/forum/#!forum/ansible-project

本文轉自 emma_cql 51CTO部落格,原文連結:http://blog.51cto.com/chenql/1889184