ansible簡介
ansible是一款新出的自動化運維工具,基于Python開發,可實作對多台伺服器進行批量配置、程式的部署及指令的運作。大大減少了在運維工程中的工作量。
常見的運維工具的工作模式有兩種agent和agentless。ansible屬于後者,即在被控制端沒有代理運作。ansible基于ssh實作資訊的傳輸,且在運作過程中具有幂等性(同一個操作執行多次,結果相同,不會重複執行)
ansible的安裝
rpm包安裝
在epel源中就有,添加epel源,直接使用yum下載下傳即可。
[root@www ~]# yum install ansible
源碼安裝
源碼的安裝包可去https://github.com上下載下傳,各個版本的都有。
[root@www ~]# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
[root@www ~]# tar xf ansible-1.9.2.tar.gz
[root@www ~]# cd ansible-1.9.2
[root@www ~]# python setup.py build
[root@www ~]# python setup.py install
[root@www ~]# mkdir /etc/ansible
[root@www ~]# cp -r examples/* /etc/ansible/
ansible的簡單應用
正真實作批量部署的是ansible中的子產品,常用的子產品有command,user,copy,cron,file,ping,yum,service,shell,script......
指令格式:ansible <host-pattern> [-m module] [-a args]
host-pattern # 目标主機的位址,一般是配置檔案中的組名
-m module # 指定應用的子產品
-a args # 指定子產品的參數
ansible-doc -l # 檢視所有可用的子產品
ansible-doc moduleName # 檢視指定子產品的幫助資訊
定義Host Inventory
/etc/ansible/hosts該檔案中定義了目标主機的位址,往往以組的形式定義。
[root@www ~]# vim /etc/ansible/hosts
[myhosts]
192.168.1.118 ansible_ssh_user=root ansible_ssh_pass=passwd
192.168.1.119 ansible_ssh_user=root ansible_ssh_pass=passwd
192.168.1.120 ansible_ssh_user=root ansible_ssh_pass=passwd
在指令行中module指定為myhosts,即可同時操縱這3台主機。在主機位址後面指定主機的使用者名和密碼,則在指令行可直接進行連接配接。常見參數還有有:
ansible_ssh_host # 指定連接配接的主機名
ansible_ssh_port # 指定ssh連接配接的端口
ansible_sudo_pass # sudo的密碼
ansible_connection # 指定連接配接方式(local,ssh,paramiko)
上面的認證方式不是很安全(密碼直接寫在了配置檔案上),可基于密鑰實作認證:
[root@vm1 ansible]# ssh-keygen -t rsa -P ''
[root@vm1 ansible]# ansible myhosts -m copy -a 'src=/root/.ssh/id_rsa.pub dest=/root/.ssh/authorized_keys owner=root group=root mode=600'
以下是幾個簡單的應用:
使用ping子產品測試所有主機是否線上:
[root@www ansible-1.9.2]# ansible myhosts -m ping
user子產品,為每台主機添加使用者:
[root@CentOS-6 ~]# openssl passwd -1 -salt `openssl rand -hex 8`
Password:
$1$a787e6a4$ySdBzC2krv/EbZQBDJSYl1
[root@CentOS-6 ~]# ansible myhosts -m user -a 'name=fedora password=$1$a787e6a4$ySdBzC2krv/EbZQBDJSYl1'
copy子產品,複制檔案至每一台主機:
[root@CentOS-6 ~]# ansible myhosts -m copy -a 'src=/root/hellodb.sql dest=/tmp owner=fedora group=root mode=440'
file子產品,建立檔案和連結:
[root@www ansible-1.9.2]# ansible myhosts -m file -a 'path=/tmp/test.txt state=touch'
[root@www ansible-1.9.2]# ansible myhosts -m file -a 'src=/tmp/test.txt path=/tmp/ptTest state=link'
yum子產品,使用yum在所有主機上安裝、删除軟體:
[root@www ~]# ansible myhosts -m yum -a 'name=zsh state=present'
[root@www ~]# ansible myhosts -m yum -a 'name=zsh state=absent'
service子產品,在所有主機上啟動、關閉相應的服務。
[root@www ~]# ansible myhosts -m service -a 'name=httpd state=started enabled=yes'
[root@www ~]# ansible myhosts -m service -a 'name=httpd state=stopped enabled=no'
setup子產品,這個子產品比較特殊,它可以用來擷取目标主機上的一些關于系統環境的變量,例如:
ansible_os_family # 目标主機的作業系統
ansible_pkg_mgr # 目标主機的軟體包管理器
ansible_machine # 計算機架構
........
[root@www ~]# ansible 192.168.1.108 -m setup
playbook簡介
playbook使用YAML文法結構,可讀性高。簡單的說,playbook就是将需要對多台伺服器的操縱過程以一定的格式寫在一個配置檔案中。然後在執行過程中,目标伺服器就會按照實作定義好的機制一個接着一個完成任務。下面是一段playbook内容:
- name: web service
remote_user: root
hosts: web #以上是全局配置
tasks:
- name: install httpd
yum: name=httpd state=present
- name: configuration
copy: src=httpd.conf dest=/etc/httpd/conf
- name: start service
service: name=httpd state=started enabled=no
hosts # 用于指定要執行指定任務的主機,往往是/etc/ansible/hosts中定義的組
remote_user # 用于指定遠端主機上的執行任務的使用者,也可用于各task中
task格式(每個橫線“-”代表一個任務):
name:任務名稱 # (用于playbook的執行結果輸出)
子產品名稱: 參數1=value 參數2=value
task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務後再開始第二個。在運作自下而下某playbook時,如果中途發生錯誤,不會復原,更正playbook後重新執行一次即可,因為子產品執行是幂等的,這意味着多次執行是安全的,結果均一緻。
如果某個任務執行出現失敗,就立即結束,後面的任務将不會被運作。這是可以用如下方式解決:
tasks:
- name: *****
shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors來忽略錯誤資訊:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True #若上面的指令執行錯誤則把它忽略
roles簡介
roles用于層次性、結構化地組織playbook,能夠根據層次型結構自動裝載變量檔案、tasks以及handlers等。roles将變量,任務,檔案等放置在不同的目錄中,然後直接調用某個roles即可完成某些特定的任務。
roles的目錄結構:
site.yml # 用來描述目前目錄是用來做什麼的
webservers.yml
roles/
common/ #第一個角色
files/ # 存放由copy或script等子產品調用的檔案
tasks/ # 定義了此角色的任務清單
handlers/ # 用于定義此角色用到的各handler
vars/ #用于定義此角色用到的變量
meta/ # 用于定義此角色的特殊設定及其依賴關系
webservers/ #第二個角色
........
使用ansible批量部署LAMP
實驗環境:使用ansible實作在192.168.1.118,192.168.1.119兩台伺服器上部署httpd,php服務,在192.168.1.120上部署mysql服務。
配置inventory檔案(以實作密鑰認證)
[root@www ~]# vim /etc/ansible/hosts
[myhosts]
192.168.1.118
192.168.1.119
192.168.1.120
[web]
192.168.1.118
192.168.1.119
[mysql]
192.168.1.120
建立roles的相關目錄(以下是我的roles目錄結構):
[root@www ansible]# ls
mysql.yml remove.yml roles site.yml web.yml
[root@www ansible]# tree
.
├── mysql.yml
├── remove.yml
├── roles
│ ├── mysql
│ │ ├── files
│ │ │ └── my.cnf
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ ├── php
│ │ ├── files
│ │ │ └── php.ini
│ │ ├── handlers
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ └── web
│ ├── files
│ │ └── httpd.conf
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
├── site.yml
└── web.yml
編輯web與php的playbook,php是以子產品的形式添加至httpd中,是以兩個服務在同一台伺服器上:
[root@www ansible]# cat web.yml
- name: web service
remote_user: root
hosts: web
roles:
- web
- php
#########web##########
[root@www ansible]# cat roles/web/tasks/main.yml
- name: install httpd
yum: name=httpd state=present
tags: install
- name: configuration
copy: src=httpd.conf dest=/etc/httpd/conf #src指定的檔案會自動去上一層的files目錄中尋找
tags: conf
notify: #當配置檔案發生更改時會觸發下面的動作
- reload httpd #會去handlers目錄下尋找任務檔案,然後執行
- name: start service
service: name=httpd state=started enabled=no
[root@www ansible]# cat roles/web/handlers/main.yml
- name: reload httpd
service: name=httpd state=reloaded
#########php##########
[root@www ansible]# cat roles/php/tasks/main.yml
- name: install php
yum: name=php state=present
tags: install
- name: configuration
copy: src=php.ini dest=/etc/php.ini
tags: conf
編輯mysql的playbook:
[root@www ansible]# cat mysql.yml
- name: install mysql
remote_user: root
hosts: mysql
roles:
- mysql
#######################
[root@www ansible]# cat roles/mysql/tasks/main.yml
- name: install mysql
yum: name=mysql-server state=present
tags: install
- name: configuration
copy: src=my.cnf dest=/etc/my.cnf
tags: conf
notify:
- restart mysqld
- name: start service
service: name=mysqld state=started enabled=no
[root@www ansible]# cat roles/mysql/handlers/main.yml
- name: restart mysqld
service: name=mysqld state=restarted
三者的配置檔案均存放在各自的file目錄下。
開始批量安裝,配置,啟動httpd,php服務:
mysql的安裝,配置,啟動
檢查伺服器端的寬口監聽狀況: