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特性
   一、no agents:不須要在被管控主機上安裝任何客戶端;
   二、no server:無服務器端,使用時直接運行命令便可;
   三、modules in any languages:基於模塊工做,可以使用任意語言開發模塊;
   四、yaml,not code:使用yaml語言定製劇本playbook;
   五、ssh by default:基於SSH工做;
   六、strong multi-tier solution:可實現多級指揮。
   3.優勢
   一、輕量級,無需在客戶端安裝agent,更新時,只需在操做機上進行一次更新便可;
   二、批量任務執行能夠寫成腳本,並且不用分發到遠程就能夠執行;
   三、使用python編寫,維護更簡單,ruby語法過於複雜;
   四、支持sudo
   4.基本架構
   Modules:模塊化 
   Core Modules 核心模塊 
   Customed Modules 自定義模塊 
   Host Iventory 主機庫清單,定義要管理的主機 
   Files 能夠經過配置文件來實現 
   CMDB 也能夠經過外部存儲來實現 
   PlayBooks 劇本,定義每一個主機所扮演的角色 
   Connection Plugins:鏈接插件,主要鏈接各管控主機 
   5.工做機制
二 Ansible安裝
   1.ansible需python2.6以上版本
[root@test1 ~]# 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密鑰
[root@test1 ~]# 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 root@test1
The key's randomart image is:
+--[ RSA 2048]----+
|==. o . o.. |
|o=. =.+ o. |
|o... . ++ . |
| . o + + |
| . o S |
| E. |
| |
| |
| |
+-----------------+
#2.將公鑰發到被管理節點用戶的.ssh目錄
[root@test1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.168
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
root@192.168.1.168's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.1.168'"
and check to make sure that only the key(s) you wanted were added.
#3.驗證無密碼配置是否成功
[root@test1 ~]# ssh root@192.168.1.168
Last login: Wed Apr 12 11:02:08 2017 from 192.168.1.110
[root@test2 ~]#
#192.168.186執行2,3步便可
    3.測試主機連通性
#測試web組中機器聯通性(測試全部用all)
[root@test1 ~]# 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
 
 
相關文章
相關標籤/搜索