當服務器愈來愈多,統一管理起來顯得尤其重要。那麼選擇一款管理工具必不可少,既要能知足管理新部署的機器,還要兼容以前部署的機器,無客戶端版的ansible管理工具可能成爲優先考慮的工具之一。html
ansible 是一款自動化運維工具,可以解決咱們在it工做中,一遍又一遍執行相同任務。利用它,咱們能夠只解決一次問題,而後自動化運行咱們的解決方案。 目前,數以千計的公司正在使用簡單但功能強大的it自動化引擎,我相信它能夠幫咱們加速完成DevOps計劃。 對了,它是由Red Hat公司出品的。python
[sl@localhost ~]# easy_install pip
[sl@localhost ~]# pip install ansible
複製代碼
從項目的checkout中能夠很容易運行Ansible,Ansible的運行不要求root權限,也不依賴於其餘軟件,不要求運行後臺進程,也不須要設置數據庫.linux
$ git clone git://github.com/ansible/ansible.git --recursive
$ cd ./ansible
//使用 Bash:
$ source ./hacking/env-setup
//使用 Fish:
$ . ./hacking/env-setup.fish
複製代碼
$ sudo yum install ansible
複製代碼
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
複製代碼
修改這個列表/etc/ansible/hostsnginx
[test]
10.10.100.205:22 ansible_ssh_user=sl ansible_ssh_pass=1
10.10.100.230:22 ansible_ssh_user=sl ansible_ssh_pass=1
複製代碼
這裏我使用了用戶名密碼鏈接,固然官方並不建議這種鏈接方式,下文介紹證書鏈接。 若是提示找不到sshpass,需安裝。git
yum install sshpass
複製代碼
你還能夠經過組的形式添加,如:github
[test]
10.10.100.[1-10]
server[1-10]
[a-z].company.com
複製代碼
以上,各自表明一組機器。web
其餘參數shell
ansible_ssh_host
將要鏈接的遠程主機名.與你想要設定的主機的別名不一樣的話,可經過此變量設置.
ansible_ssh_port
ssh端口號.若是不是默認的端口號,經過此變量設置.
ansible_ssh_user
默認的 ssh 用戶名
ansible_ssh_pass
ssh 密碼(這種方式並不安全,咱們強烈建議使用 --ask-pass 或 SSH 密鑰)
ansible_sudo_pass
sudo 密碼(這種方式並不安全,咱們強烈建議使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
sudo 命令路徑(適用於1.8及以上版本)
ansible_connection
與主機的鏈接類型.好比:local, ssh 或者 paramiko. Ansible 1.2 之前默認使用 paramiko.1.2 之後默認使用 'smart','smart' 方式會根據是否支持 ControlPersist, 來判斷'ssh' 方式是否可行.
ansible_ssh_private_key_file
ssh 使用的私鑰文件.適用於有多個密鑰,而你不想使用 SSH 代理的狀況.
ansible_shell_type
目標系統的shell類型.默認狀況下,命令的執行使用 'sh' 語法,可設置爲 'csh' 或 'fish'.
ansible_python_interpreter
目標主機的 python 路徑.適用於的狀況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",好比 \*BSD, 或者 /usr/bin/python
複製代碼
在控制主機中生成ssh密鑰對數據庫
ssh-keygen -t rsa
複製代碼
一路回車下去,而後執行apache
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.100.205
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.100.206
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.100.207
複製代碼
/etc/ansible/hosts 中增長機器ip及端口號便可,最後測試一下。
列出文件列表
ansible test -a "ls "
複製代碼
測試機器是否通
[sl@localhost ~]# ansible test -m ping
10.10.100.205 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
10.10.100.230 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
複製代碼
其餘命令
# 執行遠程命令
# ansible test -m command -a 'uptime'
# 執行主控端腳本
# ansible test -m script -a '/etc/ansible/script/test.sh'
# 執行遠程主機的腳本
# ansible test -m shell -a 'ps aux|grep zabbix'
# 相似shell
# ansible test -m raw -a "ps aux|grep zabbix|awk '{print \$2}'"
# 建立軟連接
# ansible test -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"
# 刪除軟連接
# ansible test -m file -a "path=/tmp/resolv.conf state=absent"
# 複製文件到遠程服務器
# ansible test -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"
複製代碼
Playbook是一種與adhoc任務執行模式徹底不一樣的方式,並且特別強大。 簡單地說,Playbooks是一個很是簡單的配置管理和多機器部署系統的基礎,不一樣於任何已經存在的配置系統,並且很是適合部署複雜應用程序。
yml是一種比較精簡的語法結構,經過空格來控制層級,具體可移步百度。
---
- hosts: test
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
複製代碼
保存爲test.yml,運行
ansible-playbook test.yml
複製代碼
由於全部機器上都沒有安裝,全部報failed。
基本結構: - host: test remote_user: tasks: - task1 module_name: module_args - task 2 handlers: - handler1 - handler2 hosts行是一個或多個組或主機模式的列表,以冒號分隔, 每一個任務定義可遠程用戶:
- hosts : webservers
remote_user : root
tasks :
- name : test connection
ping :
remote_user : yourname
複製代碼
任務分爲service、command、shell等:
tasks:
- name: make sure apache is running
service: name=httpd state=started
tasks:
- name: enable selinux
command: /sbin/setenforce 1
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
複製代碼
寫安裝nginx的sh腳本vim nginx-install.yml
- hosts: test
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: copy nginx-install.sh to client
copy: src=nginx-install.sh dest=/tmp/nginx-install.sh
- name: chomd a+x
shell: chmod +x /tmp/nginx-install.sh
- name: install nginx
shell: /tmp/nginx-install.sh
複製代碼
執行ansible-playbook
[shaolei@localhost ~]# ansible-playbook nginx-install.yml
複製代碼
到各機器上觀察
[shaolei@localhost html]# ps -ef |grep nginx
shaolei 2477 31369 0 13:09 pts/0 00:00:00 grep --color=auto nginx
複製代碼
整體來講,ansible功能十分強大,適合大部分公司大部分場景,本文介紹了ansible基本用法,和playbook腳本的一些簡單實踐。固然若是你熟悉python,你還可使用python寫出各類各樣適合本身公司的運維命令來。