1. 程式人生 > >Ansible自動化運維工具使用

Ansible自動化運維工具使用

概述
本文描述自動化運維工具 Ansible 的安裝及基礎使用方法,包含: Centos 下的安裝
主機配置
Ad-Hoc command(命令列執行)
Playbook (任務劇本)
Ansible 和 Saltstack 是目前主流的兩個自動化運維工具,都可以用於同時對大量主機進行系統配置,應用部署等工作,利用這種整合化的自動運維工具最大的優勢在於運維體系結構的持續可維護性。本文先著眼於 Ansible 的基礎使用,不會進行太多擴充套件,通過本文可以快速上手使用 Ansible。 安裝
Ansible 的一大特點是 agentless,可以通過 SSH 來對伺服器進行管理,意味著只需要將 Ansible 部署到一臺伺服器。 Ansible 並非一定使用 ssh 來與伺服器進行通訊,它也支援 ZeroMq 的擴充套件。事實上,如果不是總要同時對一個龐大主機群進行操作,通過 ssh 進行通訊在效率上的損失還是可以接受的。 在 Centos 系統上,Ansible 可以用過 yum 來進行安裝,前提是需要 EPEL 的源。 以 Centos7 為例執行下列命令安裝 EPEL 源: rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
1
安裝 Ansible yum install ansible
1
通常情況下,Ansible 可以部署到登入伺服器上,登入伺服器存放 ssh 私鑰,這樣在對操作主機群時就無需每次輸入密碼。 主機配置
Ansible 預設主機配置檔案在 /etc/ansible/hosts,你也可以建立新的配置檔案來管理主機,如果使用其他主機配置,在執行命令列時就需要通過 -i <path> 引數指定主機配置。 下邊是一個主機配置的例子,foo.example.com 這些就是主機的定義,webservers 是主機組的定義,在使用 Ansible 時,可以通過主機組對一組伺服器進行操作。 [webservers]
foo.example.com
bar.example.com
1
2
3
Ad-Hoc Command
Ad-Hoc Command 指那些希望立即執行對一組伺服器進行操作,而這個操作過程不需要進行儲存的方式。例如臨時需要對 webservers 這組主機下的 /opt/testfile 檔案進行刪除,而這種操作是沒有必要儲存成 Playbook (劇本模式,稍後會說到)的。 $ ansible webservers -m command -a "rm -f /opt/testfile"
1
引數 -m 指定使用的功能模組是 command,-a 設定模組所需引數佇列,對於 command 模組來講,這個引數就是你需要執行的命令。 事實上,command 模組也有幾個引數,當需要指定多個引數時,就需要使用 arg1=value1 arg2=value2 這樣的鍵值對方式指定,當沒有指定引數時,在這裡實際上使用 command 的是 free_form 引數。 Ansible 預設使用的模組是 command,這意味著上述命令列並不需要顯式指定功能模組,可以直接使用下列命令列
ansible webservers -a "rm -f /opt/testfile" 再舉個簡單的例子,批量檔案分發: $ ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts"
1
上述命令將本地 /etc/hosts 分發到 webservers 的 /tmp/hosts。 使用 ansible-doc -l 可以檢視 Ansible 支援哪些模組,也可以直接前往 這裡 去檢視。 使用 ansible-doc -s module_name 可以獲取模組的使用幫助。 Playbook
Playbook 可以稱之為任務劇本,它允許你按照劇本的方式編排需要完成的任務,使用 YAML 的語法格式。 早期,我們可能使用指令碼來完成一些流程相對繁多的任務,指令碼可以很好的執行,但可讀性差。YAML 這種配置性的語法格式則可讀性很好,並且對於沒有程式設計基礎的運維人員來講,它也更容易上手。 看一個 playbook 的例子: ---
- hosts: webservers
  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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
這個簡單的例子完成的任務是部署或更新 webservers 這一組主機的 apache。 hosts:定義操作的主機組 remote_user:使用的使用者 task:任務步驟,共分為三步: 1 通過 yum 模組確認 apache 是否安裝以及是否是最新版本,如果不是則安裝或更新;
2 通過 template 模組來設定配置檔案,如果配置有更新則通知 handler 重啟 apache;
3 通過 service 模組來判斷 apache 是否在執行,如果沒有則啟動 apache。
handlers:事件處理,處理任務中的 notify Playbook 完成後,執行就可以完成對一組伺服器的操作 ansible-playbook playbook.yml
1
以上就是 Ansible 的基礎使用方法,更多的可以去參考
Ansible 的文件

---------------------   一 Ansible簡介
   1.absible定義
   ansible是一個輕量級的運維管理工具,基於Python研發。可實現對系統的批量管理配置、程式的批量部署、批量的執行命令等功能。僅需在任意管理主機安裝ansible程式即可實現批量管理被管控主機且被管控的主機無需客戶端。
   2.ansible特性
   1、no agents:不需要在被管控主機上安裝任何客戶端;
   2、no server:無伺服器端,使用時直接執行命令即可;    3、modules in any languages:基於模組工作,可使用任意語言開發模組;    4、yaml,not code:使用yaml語言定製劇本playbook;    5、ssh by default:基於SSH工作;    6、strong multi-tier solution:可實現多級指揮。    3.優點    1、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;    2、批量任務執行可以寫成指令碼,而且不用分發到遠端就可以執行;    3、使用python編寫,維護更簡單,ruby語法過於複雜;    4、支援sudo    4.基本架構    Modules:模組化 
   Core Modules 核心模組 
   Customed Modules 自定義模組 
   Host Iventory 主機庫清單,定義要管理的主機 
   Files 可以通過配置檔案來實現 
   CMDB 也可以通過外部儲存來實現 
   PlayBooks 劇本,定義每個主機所扮演的角色 
   Connection Plugins:連線外掛,主要連線各管控主機 
   5.工作機制 二 Ansible安裝
   1.ansible需python2.6以上版本
[
[email protected]
~]# python -V
Python2.7.5
# 安裝python驅動(不然下面會報錯)
yum install python-devel -y
   2.安裝ansible
#setuptools安裝
cd
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
tar xvzf setuptools-7.0.tar.gz
cd setuptools-7.0
python setup.py install
#pycrypto模組安裝
wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
tar -xzf pycrypto-2.6.1.tar.gz
cd pycrypto-2.6.1
python setup.py install
#PyYAML模組安裝
cd
wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar -xzf yaml-0.1.5.tar.gz
cd yaml-0.1.5
./configure --prefix=/usr/local
make -j `grep processor /proc/cpuinfo| wc -l` && make install
cd
wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
tar -xzf PyYAML-3.11.tar.gz
cd PyYAML-3.11
python setup.py install
#Jinja2模組安裝
cd
wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
tar -xzf MarkupSafe-0.9.3.tar.gz
cd MarkupSafe-0.9.3
python setup.py install
cd
wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
tar xvzf Jinja2-2.7.3.tar.gz
cd Jinja2-2.7.3
python setup.py install
#paramiko模組安裝
cd
wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
tar xvzf ecdsa-0.11.tar.gz
cd ecdsa-0.11
python setup.py install
cd
wget https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
tar xvzf paramiko-1.15.1.tar.gz
cd paramiko-1.15.1
python setup.py install
#ansible 2.2.2安裝
cd
wget http://releases.ansible.com/ansible/ansible-2.2.2.0.tar.gz
tar -xzf ansible-2.2.2.0.tar.gz
cd ansible-2.2.2.0
python setup.py install
mkdir /etc/ansible
cp -rp examples/* /etc/ansible/
   3.yum安裝
yum install epel-release -y
yum install ansible -y
三 Ansible相關配置
   1.ansible相關檔案及命令
主程式目錄:/etc/ansible/
主配置檔案:/etc/ansible/ansible.cfg
預設主機清單:/etc/ansible/hosts
外掛目錄:/usr/share/ansible_plugins
主要命令:/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
#常用格式
ansible <host-pattern>[-f forks][-m module][-a args]
host-pattern # 可以是all,或者配置檔案中的主機組名
-v,–verbose 詳細模式,如果命令執行成功,輸出詳細的結果(-vv –vvv -vvvv)
-i PATH,–inventory=PATH 指定host檔案的路徑,預設是在/etc/ansible/hosts
-f NUM,–forks=NU NUM是指定一個整數,預設是5,指定fork開啟同步程序的個數。
-m NAME,–module-name=NAME 指定使用的module名稱,預設是command
-m DIRECTORY,–module-path=DIRECTORY 指定module的目錄來載入module,預設是/usr/share/ansible,
-a,MODULE_ARGS 指定module模組的引數
-k,-ask-pass 提示輸入ssh的密碼,而不是使用基於ssh的金鑰認證
-sudo 指定使用sudo獲得root許可權
-K,-ask-sudo-pass 提示輸入sudo密碼,與–sudo一起使用
-u USERNAME,-user=USERNAME 指定移動端的執行使用者
-C,-check 測試此命令執行會改變什麼內容,不會真正的去執行
#檢視各模組
ansible-doc [options][modules]
# 主要選項有:
-l或--list # 列出可用的模組
-s或--snippet #顯示指定模組的簡略使用方法
   2.配置檔案介紹
   配置檔案:/etc/ansible/ansible.cfg
hostfile=/etc/ansible/hosts #指定預設hosts配置的位置
host_key_checking =False#不進行host_key檢查,省去目標key發生變化時輸入(yes/no)的步驟
ask_pass=True# 每次執行ansible命令是否詢問ssh密碼
ask_sudo_pass=True# 每次執行ansible命令時是否詢問sudo密碼
   配置檔案:/etc/ansible/hosts
# Ex 1: Ungrouped hosts, specify before any group headers.
直接給出主機,IP主機名都可以
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group
把幾個主機分組,用中括號定義組名
## [webservers]
## alpha.example.org ...
## 192.168.1.100 ...
# If you have multiple hosts following a pattern you can specify
對主機進行通配001:006表示到一個範圍
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
定義一組資料庫伺服器
## [dbservers]
## db02.intranet.mydomain.net ...
## 10.25.1.56 ...
#引數解釋
1, ansible_ssh_host :
指定主機別名對應的真實 IP,如:100 ansible_ssh_host=192.168.1.100,隨後連線該主機無須指定完整 IP,只需指定251就行
2, ansible_ssh_port :
指定連線到這個主機的 ssh 埠,預設22
3, ansible_ssh_user:
連線到該主機的 ssh 使用者
4, ansible_ssh_pass:
連線到該主機的ssh密碼(連-k 選項都省了),安全考慮還是建議使用私鑰或在命令列指定-k 選項輸入
5, ansible_sudo_pass: sudo 密碼
6, ansible_sudo_exe: sudo 命令路徑
7, ansible_connection :
連線型別,可以是local、ssh 或 paramiko,ansible1.2之前預設為 paramiko
8, ansible_ssh_private_key_file :私鑰檔案路徑
9, ansible_shell_type :
目標系統的 shell 型別,預設為 sh,如果設定 csh/fish,那麼命令需要遵循它們語法
10, ansible_python_interpreter :
python 直譯器路徑,預設是/usr/bin/python,但是如要要連BSD系統的話,就需要該指令修改 python 路徑
11, ansible__interpreter :
這裡的"*"可以是 ruby 或 perl 或其他語言的直譯器,作用和 ansible_python_interpreter 類似
   3.主機與被控機建立ssh公私匙連線
   1.主機配置檔案新增被控端
cat >>/etc/ansible/hosts <<EOF
[web]
192.168.1.168
192.168.1.186
EOF
   2.配置ssh無密碼登入
#1.主機生成ssh金鑰
[
[email protected]
~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
e4:99:c4:17:c9:68:86:3c:ac:1b:20:19:c4:36:c1:fe [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|==. o . o.. |
|o=. =.+ o. |
|o... . ++ . |
| . o + + |
| . o S |
| E. |
| |
| |
| |
+-----------------+
#2.將公鑰發到被管理節點使用者的.ssh目錄
[[email protected] ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
The authenticity of host '192.168.1.168(192.168.1.168)' can't be established.
ECDSA key fingerprint is 80:a7:8d:c6:6c:14:27:5c:2b:dd:17:5e:ec:60:33:1c.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO:1 key(s) remain to be installed --if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
#3.驗證無密碼配置是否成功
[[email protected] ~]# ssh [email protected]
Last login: Wed Apr 12 11:02:08 2017 from 192.168.1.110
[[email protected] ~]#
#192.168.186執行2,3步即可
    3.測試主機連通性
#測試web組中機器聯通性(測試所有用all)
[[email protected] ~]# ansible web -m ping
192.168.1.168| SUCCESS =>{
"changed": false,
"ping":"pong"
}
192.168.1.186| SUCCESS =>{
"changed": false,
"ping":"pong"
}
   4.常見模組
ping:探測目標主機是否存活;
舉例: ansible all -m ping
command:在遠端主機執行命令;
舉例:ansible all -m command -a "ifconfig"
舉例:ansible all -m command -a "useradd centos"
shell:在遠端主機上呼叫shell直譯器執行命令,支援shell的各種功能,如管道等
舉例:ansible all -m shell -a "echo centos |passwd --stdin centos"
copy:複製檔案,給定內容生成檔案,mode, owner, group,follow,...
拷貝檔案
舉例:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
生成檔案
舉例:ansible all -m copy -a "content='hell\nworld\n' dest=/tmp/fstab.ansible mode=640"
file:設定檔案屬性
更改檔案屬主
舉例:ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
刪除檔案
舉例:ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
state 用來定義目標檔案狀態的
建立指定檔案空目錄
舉例:ansible all -m file -a "path=/tmp/dir.ansible state=directory"
連結檔案
舉例:ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible
state=link"
fetch:從遠端主機拉取一個檔案
ansible是用來管理多節點的,從遠端拉取多個檔案到目標主機顯然不近乎仁義。所以用scp就能搞定。略過
cron:用來管理crontab的週期性任務
定義一個任務
舉例:ansible all -m cron -a "minute'*/5' job='/usr/sbin/ntpdate 10.1.0.1 &>/dev/null'
name='sync time'"
crontab -l
刪除一個任務
舉例:ansible all -m cron -a "name='sync time' state=absent"
只刪除用ansible定義的名
hostname:定義主機名
舉例:
yum:使用yum包管理器,完成程式包管理
舉例:ansible all -m yum -a "name=httpd"安裝
舉例:ansible all -m yum -a "name=httpd state=absent"刪除
service:控制服務,控制服務是否開機自動啟動
舉例:ansible all -m service -a "name=httpd state=started enbaled=true"
script模組:
目的:在指定節點上執行/root/a.sh指令碼(該指令碼是在ansible主控端)
命令:ansible 10.1.1.113-m script -a ‘/root/a.sh‘
group:新增或者刪除組
舉例:
user:管理組賬號
舉例:
setup:收集遠端各主機的各種屬性之和
舉例:ansible all -m setup    5.PlayBook(各角色定義)(官方例項:https://github.com/ansible/ansible-examples)
   playbook是由一個或多個"play"組成的列表。play的主要功能在於將事先歸為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來將,所謂的task無非是呼叫ansible的一個module。將多個paly組織在一個playbook中,即可以讓他們聯通起來按事先編排的機制同唱一臺大戲。
playbook核心元素:
Tasks:任務,由模組定義的操作的列表;
Variables:變數
Templates:模板,即使用了模板語法的文字檔案;
Handlers:由特定條件觸發的Tasks;
Roles:角色;自包含,有完整獨立實體
playbook的基礎元件:
Hosts:執行指定任務的目標主機,可多個;
remote_user:在遠端主機以哪個使用者身份執行;
sudo_user:非管理員需要擁有sudo許可權;
tasks:給出任務列表,執行完一個,執行第二個
模組,模組引數:
格式:
(1) action: module arguments //任務執行過程
(2) module name: arguments //指定執行的模組
   playbook例項1(指揮web組內主機安裝httpd並監聽8080埠)
- hosts: web
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
tags: installpkg #指明跑某個標籤 -t installpkg
- name: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: installconf #指明跑某個標籤 -t installconf
notify: restart httpd service
- name: start httpd service
service: name=httpd state=started
handlers:#處理器,也是任務,在一定條件觸發
- name: restart httpd service
service: name=httpd state=restarted
#檢查語法,測試執行
ansible-playbook --syntax-check -t installconf --list-tags httpd.yaml
ansible-playbook --syntax-check httpd.yaml
ansible-playbook --list-hosts --list-tasks httpd.yaml
注意:
handlers:是指在一定條件下觸發,指明在一個需要讓別人重啟服務才生效的任務上使用notify,通知一定是handlers名字
tags:只執行playbook中指定的tags標籤,滿足部分需要,多個任務可指明一個同tags
也可以一次呼叫兩個標籤,如下
annsible-playbook -t installconf,installpkg httpd.yaml
   playbook例項2(自定義變數Varable,可自定義安裝任意程式包)
vim name.yaml
- hosts: web
remote_user: root
vars:
- pkgname: memcached #playbook中使用變數Variables
tasks:
- name: install a package
yum: name={{ pakgname }} state=present #自定義變數
#語法測試
ansible-playbook --syntax-check name.yaml
ansible-playbook -e pkgname=httpd/vsftpd/ name.yaml
#對應配置檔案hosts設定
vim /etc/ansible/hosts
[web]
192.168.1.168 pkgname=nginx
192.168.1.186 pkgname=httpd
[web:vars]#為一個內不同主機定義相同變數,效果同上
#web組內有一組變數vars,其中變數pkgname值是memcaches
pkgname=memcached
Inventory還可以使用引數:
用於定義ansible遠端連線目標主機使用的屬性,而非傳遞給playbook的變數
如:[webserver]
192.168.1.168 ansible_ssh_user= ansible_ssh_pass ansible_sudo_pass
不再是傳遞給playbook變數,而是主機本身。
    when條件判斷
- name: start nginx service on CentOS6
shell: service nginx start
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="6"
- name: start nginx service
shell: systemctl start nginx.service
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="7"
   基於字串列表給出元素 迴圈:迭代,需要重複執行的任務;
- name: install package
yum: name={{ item }} state=latest
with_items:
- httpd
- php
- php-mysql
- php-mbstring
- php-gd
   基於字典列表出元素 迴圈:迭代,需要重複任務;
- name: creat groups //第一個任務
yum: name={{ item }} state=latest
with_items:
- groupx1
- groupx2
- groupx3
- name: creat users //第二個任務
user: name={{ item.name }} group={{ item.group }} state=present
with_items://元素列表
-{name:'userx1', group:'groupx1'}//name鍵值隊
-{name:'userx1', group:'groupx1'}//name鍵值隊
-{name:'userx1', group:'groupx1'}//name鍵值隊
   
角色(自包含,按照目錄結構來組織) 指定由哪些主機去對應的完成哪個已定義好的角色
roles是以特定的層級目錄結構進行組織的tasks、variables、handlers、templates…
role_name/
files/:儲存由copy或script等模組呼叫的檔案;
tasks/:核心配置,分發資源和安裝軟體
handlers/: 發生改變則執行的操作(notify觸發)
vars/: 定義變數
templates/:儲存由template模組呼叫的模板文字;
meta/: 說明資訊,角色依賴等,一般不用
default/:此目錄中至少應該有一個名為main.yml的檔案,用於設定預設變數;
Ansible官方文件:http://www.ansible.com.cn/docs/playbooks_intro.html 
學習部落格:http://guoxh.blog.51cto.com/10976315/1914287  
學習部落格:http://zyxjohn.blog.51cto.com/5313197/1886251 
學習部落格:http://51eat.blog.51cto.com/11892702/1891709  ---------------------
原文:https://blog.csdn.net/HzSunshine/article/details/70227803    

ansible puppet saltstack三款自動化運維工具的對比