ansible學習總結

 

 

1      前言

Ansible是新出現的運維工具是基於Python研發的糅合了衆多老牌運維工具的優勢實現了批量操做系統配置、批量程序的部署、批量運行命令等功能。html

ansible是基於模塊工做的ansible自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊ansible只是提供一種框架。python

2      ansible的基本使用

2.1   安裝

其實ansible的安裝的方式有不少中,以下:linux

從源碼運行git

經過Yum安裝最新發布版本web

經過Apt (Ubuntu)安裝最新發布版本shell

經過 Portage (Gentoo)安裝最新發布版本apache

經過 pkg (FreeBSD)安裝最新發布版本編程

經過 Homebrew (Mac OSX)安裝最新發布版本windows

經過 Pip 安裝最新發布版本centos

發行版的Tarball。

我這兒就只介紹在centos系統上經過yum來安裝ansible

2.1.1    關閉防火牆和selinux

# service iptables stop

 

能夠看到防火牆已經關閉了

 

#setenforce 0

能夠看到selinux已經關閉了

 

2.1.2    安裝EPEL第三方yum源:

# rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm

 

2.1.3    安裝Ansible

# yum install ansible –y

 

2.2   Ansible配置

衆所周知任何軟件的使用須要先配置成本身的配置,ansible也不例外,Ansible 可同時操做屬於一個組的多臺主機,組和主機之間的關係經過 inventory 文件配置. 默認的文件路徑爲 /etc/ansible/hosts 。

除默認文件外,你還能夠同時使用多個 inventory 文件(後面會講到),也能夠從動態源,或雲上拉取 inventory 配置信息。

2.2.1    主機與組

 

/etc/ansible/hosts 文件的格式與windows的ini配置文件相似:

 

mail.example.com

 

[webservers]

foo.example.com

bar.example.com

 

[dbservers]

one.example.com

two.example.com

three.example.com

個人例子

方括號[]中是組名,用於對系統進行分類,便於對不一樣系統進行分類的管理,。主機能夠是ip地址也能夠是域名。

 

一個系統能夠屬於不一樣的組,好比一臺服務器能夠同時屬於 webserver組 和 dbserver組.這時屬於兩個組的變量均可覺得這臺主機所用,至於變量的優先級關係將於之後的章節中討論.

 

若是有主機的SSH端口不是標準的22端口,可在主機名以後加上端口號,用冒號分隔.SSH 配置文件中列出的端口號不會在 paramiko 鏈接中使用,會在 openssh 鏈接中使用.

 

端口號不是默認設置時,可明確的表示爲:

badwolf.example.com:5309

假設你有一些靜態IP地址,但願設置一些別名,但不是在系統的 host 文件中設置,又或者你是經過隧道在鏈接,那麼能夠設置以下:

jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50

在這個例子中,經過 「jumper」 別名,會鏈接 192.168.1.50:5555.記住,這是經過 inventory 文件的特性功能設置的變量. 通常而言,這不是設置變量(描述你的系統策略的變量)的最好方式.後面會說到這個問題.

一組類似的 hostname , 可簡寫以下:

[webservers]

www[01:50].example.com

數字的簡寫模式中,01:50 也可寫爲 1:50,意義相同.你還能夠定義字母範圍的簡寫模式:

[databases]

db-[a:f].example.com

對於每個 host,你還能夠選擇鏈接類型和鏈接用戶名:

[targets]

 

localhost              ansible_connection=local

other1.example.com     ansible_connection=ssh     ansible_ssh_user=mpdehaan

other2.example.com     ansible_connection=ssh     ansible_ssh_user=mdehaan

全部以上討論的對於 inventory 文件的設置是一種速記法,後面咱們會討論如何將這些設置保存爲 ‘host_vars’ 目錄中的獨立的文件.

2.2.2    主機變量

前面已經提到過,分配變量給主機很容易作到,這些變量定義後可在 playbooks 中使用:

[atlanta]

host1 http_port=80 maxRequestsPerChild=808

host2 http_port=303 maxRequestsPerChild=909

2.2.3    組的變量

也能夠定義屬於整個組的變量:

[atlanta]

host1

host2

 

[atlanta:vars]

ntp_server=ntp.atlanta.example.com

proxy=proxy.atlanta.example.com

2.2.4    把一個組做爲另外一個組的子成員

能夠把一個組做爲另外一個組的子成員,以及分配變量給整個組使用. 這些變量能夠給 /usr/bin/ansible-playbook 使用,但不能給 /usr/bin/ansible 使用:

[atlanta]

host1

host2

 

[raleigh]

host2

host3

 

[southeast:children]

atlanta

raleigh

 

[southeast:vars]

some_server=foo.southeast.example.com

halon_system_timeout=30

self_destruct_countdown=60

escape_pods=2

 

[usa:children]

southeast

northeast

southwest

northwest

 

若是你須要存儲一個列表或hash值,或者更喜歡把 host 和 group 的變量分開配置,請看下一節的說明.

2.2.5    分文件定義 Host 和 Group 變量

在 inventory 主文件中保存全部的變量並非最佳的方式.還能夠保存在獨立的文件中,這些獨立文件與 inventory 文件保持關聯. 不一樣於 inventory 文件(INI 格式),這些獨立文件的格式爲 YAML.詳見YAML 語法 .

假設 inventory 文件的路徑爲:

/etc/ansible/hosts

假設有一個主機名爲 ‘foosball’, 主機同時屬於兩個組,一個是 ‘raleigh’, 另外一個是 ‘webservers’. 那麼如下配置文件(YAML 格式)中的變量能夠爲 ‘foosball’ 主機所用.依次爲 ‘raleigh’ 的組變量,’webservers’ 的組變量,’foosball’ 的主機變量:

/etc/ansible/group_vars/raleigh

/etc/ansible/group_vars/webservers

/etc/ansible/host_vars/foosball

舉例來講,假設你有一些主機,屬於不一樣的數據中心,並依次進行劃分.每個數據中心使用一些不一樣的服務器.好比 ntp 服務器, database 服務器等等. 那麼 ‘raleigh’ 這個組的組變量定義在文件 ‘/etc/ansible/group_vars/raleigh’ 之中,可能相似這樣:

---

ntp_server: acme.example.org

database_server: storage.example.org

這些定義變量的文件不是必定要存在,由於這是可選的特性.

還有更進一步的運用,你能夠爲一個主機,或一個組,建立一個目錄,目錄名就是主機名或組名.目錄中的能夠建立多個文件, 文件中的變量都會被讀取爲主機或組的變量.以下 ‘raleigh’ 組對應於 /etc/ansible/group_vars/raleigh/ 目錄,其下有兩個文件 db_settings 和 cluster_settings, 其中分別設置不一樣的變量:

/etc/ansible/group_vars/raleigh/db_settings

/etc/ansible/group_vars/raleigh/cluster_settings

‘raleigh’ 組下的全部主機,均可以使用 ‘raleigh’ 組的變量.當變量變得太多時,分文件定義變量更方便咱們進行管理和組織. 還有一個方式也可參考,詳見 Ansible Vault 關於組變量的部分. 注意,分文件定義變量的方式只適用於 Ansible 1.4 及以上版本。

Tip: Ansible 1.2 及以上的版本中,group_vars/ 和 host_vars/ 目錄可放在 inventory 目錄下,或是 playbook 目錄下. 若是兩個目錄下都存在,那麼 playbook 目錄下的配置會覆蓋 inventory 目錄的配置。

Tip: 把你的 inventory 文件 和 變量 放入 git repo 中,以便跟蹤他們的更新,這是一種很是推薦的方式。

2.2.6    Inventory 參數的說明

如同前面提到的,經過設置下面的參數,能夠控制 ansible 與遠程主機的交互方式,其中一些咱們已經講到過:

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

      不是 2.X 版本的 Python.咱們不使用 "/usr/bin/env" 機制,由於這要求遠程用戶的路徑設置正確,且要求 "python" 可執行程序名不可爲 python之外的名字(實際有可能名爲python26).

 

      與 ansible_python_interpreter 的工做方式相同,可設定如 ruby 或 perl 的路徑....

一個主機文件的例子:

some_host         ansible_ssh_port=2222     ansible_ssh_user=manager

aws_host          ansible_ssh_private_key_file=/home/example/.ssh/aws.pem

freebsd_host      ansible_python_interpreter=/usr/local/bin/python

ruby_module_host  ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

 

2.3   Ansible—ac-hoc命令

      若是咱們敲入一些命令去比較快的完成一些事情,而不須要將這些執行的命令特別保存下來, 這樣的命令就叫作 ad-hoc 命令。

 

 Ansible提供兩種方式去完成任務,一是 ad-hoc 命令,一是寫 Ansible playbook, 前者能夠解決一些簡單的任務, 後者解決較複雜的任務。

 

通常而言,在學習了 playbooks 以後,你才能體會到 Ansible 真正的強大之處在哪裏

 

那咱們會在什麼情境下去使用ad-hoc 命令呢?

好比說由於聖誕節要來了,想要把全部實驗室的電源(系統)關閉,咱們只須要執行一行命令 就能夠達成這個任務,而不須要寫 playbook 來作這個任務。

 

至於說作配置管理或部署這種事,仍是要藉助 playbook 來完成,即便用 ‘/usr/bin/ansible-playbook’ 這個命令.

 

(關於 playbook 的使用,請參考 Playbooks )

 

若是你尚未閱讀 Inventory文件 ,最好先看一看,而後咱們繼續往下.

 

 

咱們先來看一條很基本的命令

若是沒有免密碼登陸的話,可使用以下命令:

 在ansible中還有一個Module(模塊)的概念,這個模塊能夠理解爲一個庫,全部的ac-hoc命令都須要經過模塊來執行,好比上面的那個命令: ansible test-servers -m ping,實際上是調用了ping模塊,-m後面表示用什麼模塊, 除了ping模塊還有其餘不少模塊,下面介紹一下比較經常使用的模塊 。

執行ansible-doc –l命令列出全部已安裝的模塊文檔:

2.3.1    ansible的command模塊

ansible的command模塊是默認的模塊,若是你不寫模塊名,就是調用這個模塊。使用command命令能夠在遠程節點上執行bash上面的命令。

實例1關機

ansible test-servers -m command -a "init 0" -u root

 

 

實例二:查看系統linux內核

ansible test-servers -m command -a "uname -r" -u root

 

實例三:查看系統的運行了多長時間

ansible test-servers -m command -a "uptime" -u root

基本上大部分命令均可以執行,可是command 模塊不支持 shell 變量,也不支持管道等 shell 相關的東西.若是你想使用 shell相關的這些東西, 請使用’shell’ 模塊。

ansible test-servers -m command -a "ls |grep log" -u root

 

 

2.3.2    Ansible的shell和script模塊

實例一:管道命令使用

ansible test-servers -m s      -a "ls ~|grep log"

 

實例二:查看該組主機的變量TERM

ansible test-servers -m shell -a 'echo $TERM'

 

使用 Ansible ad hoc 命令行接口時(與使用 Playbooks 的狀況相反),尤爲注意 shell 引號的規則. 好比在上面的例子中,若是使用雙引號」echo $TERM」,會求出TERM變量在當前系統的值,而咱們實際但願的是把這個命令傳遞 到其它機器執行。

 

實例三:執行遠程主機上面的shell腳本

71和72上面的/ h腳本內容以下:

在本機上面沒有這個腳本

ansible test-servers -m shell -a "/root/a.sh"

 

實例四:將管理主機(本機)上的腳本到遠程主機上面執行(scp+shell)

 

腳本在主控端,有一個/root/b.sh

 

遠程主機71和72上面都沒有

用shell模塊執行會失敗

ansible test-servers -m shell -a "/root/b.sh"

 

應該使用script模塊來執行

ansible test-servers -m script -a "/root/b.sh"

 

優勢:

1比起來其餘自動化集羣管理和運維工具 Puppet、Chef、Ansible 顯得很簡單而且輕量級, 可是 Ansible 又不像 Fab 那樣功能單一隻能作批量命令,也能夠和puppet同樣進行模塊擴展。

2輕量級的好處是學習門檻低、問題少、安裝快、執行快。操做徹底依賴 SSH 而不須要安裝 agent 。這樣的好處是再也不須要維護 agent 的狀態,不用擔憂 Agent 掛掉。而 SSH 是每臺服務器必備的服務。它很是適合安全補丁更新的場景。好比,100 臺服務器打 bash vulnerability 安全補丁只須要 10 分鐘。

3.Ansible 結合 Docker、Mesos、Puppet、Vagrant、Git 等系統能夠構建出很是好的自動化運維平臺。Ansible 比起其餘自動化運維工具更適合對 Docker 實例進行維護和管理。若是你的機器實例數量超過 1000,也能夠選擇Ansible 的 Web 控制工具 Ansible Tower 。

缺點

1.一樣這樣的簡單設計的劣勢是沒有依賴管理功能(感受不適合咱們公司,或者和別的一塊兒用)。可是 Ansible 對於通常的使用場景已經足夠了。

2.3.3    Ansible的copy模塊

複製文件到遠程主機,這是 /usr/bin/ansible 的另外一種用法.Ansible 可以以並行的方式同時 SCP 大量的文件到多臺機器。這個的適用場景於文件發佈,這種需求不少,好比平常的配置文件更新,程序版本發佈等,基本都會用到。

輸入的命令以下:

ansible test-servers -m copy -a "src=/opt/file dest=/opt/file"

 

注意:目標主機上面的目錄層級結構以下:

 

命令參數以下:

backup:在覆蓋以前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no

content:用於替代「src」,能夠直接設定指定文件的值

dest:必選項。要將源文件複製到的遠程主機的絕對路徑,若是源文件是一個目錄,那麼該路徑也必須是個目錄,若是該目錄不存在則會自動建立。且

directory_mode:遞歸設定目錄的權限,默認爲系統默認權限

force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes

others:全部的file模塊裏的選項均可以在這裏使用

src:被複制到遠程主機的本地文件,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用「/」來結尾,則只複製目錄裏的內容,若是沒有使用「/」來結尾,則包含目錄在內的整個內容所有複製,相似於rsync。

 

2.3.4    Ansible的file模塊

實例一:使用 file 模塊能夠作到修改文件的屬主和權限:

ansible test-servers -m file -a "dest=/opt/file/file/3.c mode=600"

 

實例二:使用 file 模塊也能夠建立目錄,與執行 mkdir -p 效果相似:

ansible test-servers -m file -a "dest=/opt/file/file/ccc mode=755 owner=root group=root state=directory"

 

 

 

遠程目標機器上面的目錄結構以下:

實例三:刪除目錄(遞歸的刪除)和刪除文件:

ansible test-servers -m file -a "dest=/opt/file/file/ccc mode=755 owner=root group=root state=absent"

 

再查看目標主機上面,能夠看獲得,ccc目錄已經被刪除了。

相關參數選項以下:

force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在,但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no

group:定義文件/目錄的屬組

mode:定義文件/目錄的權限

owner:定義文件/目錄的屬主

path:必選項,定義文件/目錄的路徑

recurse:遞歸設置文件的屬性,只對目錄有效

src:被連接的源文件路徑,只應用於state=link的狀況

dest:被連接到的路徑,只應用於state=link的狀況

state:

       directory:若是目錄不存在,就建立目錄

       file:即便文件不存在,也不會被建立

       link:建立軟連接

       hard:建立硬連接

       touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間

       absent:刪除目錄、文件或者取消連接文件

 

2.3.5    Ansible的更多其餘模塊

其餘經常使用模塊,好比:service、cron、yum、synchronize就不一一例舉,能夠結合自身的系統環境進行測試。

service:系統服務管理

cron:計劃任務管理

yum:yum軟件包安裝管理

synchronize:使用rsync同步文件

user:系統用戶管理

group:系統用戶組管理

 

更多模塊能夠參考:

#ansible-doc –l

2.4   Playbook

像不少其它配置文件管理方法同樣,Ansible使用一種比較直白的方法來描述本身的任務配置文件。

Ansible 的任務配置文件被稱之爲「playbook」,咱們能夠稱之爲「劇本」。每一齣劇本(playbook)中都包含一系列的任務,這每一個任務在ansible中又被稱爲一出「戲劇」(play)。一個劇本(playbook)中包含多出戲劇(play),這很容易理解。

 

Playbooks 與 adhoc 相比,是一種徹底不一樣的運用 ansible 的方式,是很是之強大的。

 

簡單來講,playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎.與現有的其餘系統有不一樣之處, 且很是適合於複雜應用的部署。

 

Playbooks 可用於聲明配置,更強大的地方在於,在 playbooks 中能夠編排有序的執行過程,甚至於作到在多組機器間,來回有序的執行特別指定的步驟,而且能夠同步或異步的發起任務。

 

咱們使用 adhoc 時,主要是使用 /usr/bin/ansible 程序執行任務.而使用 playbooks 時,更可能是將之放入源碼控制之中,用之推送你的配置或是用於確認你的遠程系統的配置是否符合配置規範。

2.4.1    Playbook的組成部分

Playbook主要由如下四部分組成:

 

Target section:定義將要執行playbook的遠程主機組

Variable section:定義playbook運行時須要使用的變量

Task section:定義將要在遠程主機上執行的任務列表

Handler section:定義task執行完成之後須要調用的任務

 

2.4.2    Playbook的每一部分經常使用參數

2.4.2.1     Target section經常使用參數

  1. hosts:定義遠程主機組
  2. user:執行該任務的用戶
  3. sudo: 設置爲yes的時候,執行任務的時候使用root權限
  4. sudo_user 若是你設置用戶爲tshare365,那麼你執行的時候會使用tshare365用戶的權限
  5. connection 經過什麼方式鏈接到遠程主機,默認是ssh
  6. gather_facks 是否啓用在遠程主機執行setup模塊,默認是會執行的,可用同setup模塊獲取遠程主機的信息,在定義變量的時候使用

2.4.2.2     Variabler section經常使用參數

1.    vars  定義格式 變量名:變量值

2.    vars_files  指定變量文件

3.    vars_prompt  用戶交互模式自定義變量

4.    setup 模塊去遠程主機的值

2.4.2.3     Task ssection

1.    name:輸出到屏幕的信息

2.    action:定義執行的動做調用ansible的模塊例如:yum name=http state=installed就是安裝apache服務

3.    copy:複製本地文件到遠程主機

4.    template:複製本地文件到遠程主機可是他能夠在本地文件中調用變量

5.    service :定義服務的狀態

2.4.3    Playbook的實例

Playbooks 的格式是YAML(詳見:YAML 語法),語法作到最小化,意在避免 playbooks 成爲一種編程語言或是腳本,但它也並非一個配置模型或過程的模型。

 

playbook 由一個或多個 ‘plays’ 組成.它的內容是一個以 ‘plays’ 爲元素的列表。

 

在 play 之中,一組機器被映射爲定義好的角色.在 ansible 中,play 的內容,被稱爲 tasks,即任務.在基本層次的應用中,一個任務是一個對 ansible 模塊的調用,這在前面章節學習過。

首先一個簡單的playbook的實例

實例一:,把當前用戶名輸出到whoami.rst文件中:

# playbook.yml

---

- hosts: test-serviers  # hosts中指定

  remote_user: root  # 若是和當前用戶同樣,則無需指定

  tasks:

    - name: whoami

      shell: 'whoami > whoami.rst'

執行這個playbook:

ansible-playbook  playbook.yml

 

 

在遠程目標主機上,已經生成這個文件,且裏面有內容:

 

實例二:將shell腳本轉換爲playbook

下面有一個安裝apache的shell腳本,你們來感覺一下:

#!/bin/bash

# 安裝Apache

yum install --quiet -y httpd httpd-devel

# 複製配置文件

cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf

cp /path/to/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf

# 啓動Apache,並設置開機啓動

service httpd start

chkconfig httpd on

將其轉換爲一個完整的playbook後:

---

- hosts: all

 

  tasks:

   - name: "安裝Apache"

     command: yum install --quiet -y httpd httpd-devel

   - name: "複製配置文件"

     command: cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf

     command: cp /tmp/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf

   - name: "啓動Apache,並設置開機啓動"

     command: service httpd start

     command: chkconfig httpd on


也就是說,只要你有編寫shell腳本的基本能力,你就能夠快速的學會利用playbook來發揮Ansible的強大威力。

在上述playbook中,咱們使用了「command」模塊來運行了標準的shell命令。咱們還給了每一出play一個「name」,所以當咱們運行playbook時,每個play都會有很是易讀的的信息輸出:

上面的playbook已經能夠很好的運行shell腳本了,可是Ansible還有不少其餘內置模塊,能夠大幅提高處理複雜配置的能力。

---

- hosts: all

  sudo: yes

 

  tasks:

   - name: 安裝Apache

     yum: name={{ item }} state=present

     with_items:

     - httpd

     - httpd-devel

   - name: 複製配置文件

     copy:

       src: "{{ item.src }}"

       dest: "{{ item.dest }}"

       owner: root

       group: root

       mode: 0644

     with_items:

     - {

       src: "/tmp/httpd.conf",

         dest: "/etc/httpd/conf/httpd.conf" }

     - {

       src: "/tmp/httpd-vhosts.conf",

       dest: "/etc/httpd/conf/httpd-vhosts.conf"

       }

   - name: 檢查Apache運行狀態,並設置開機啓動

     service: name=httpd state=started enabled=yes

運行結果以下:

 

Ansible講解比較好的網站以下,寫的很是到位:

http://www.jianshu.com/p/41c4ed3ce779

http://doc.178linux.com/docs/playbooks_intro.html#playbook

2.5   Ansible的拓展

咱們能夠對ansible進行擴展,ansible提供了Ansible API用Ansible的Python API來管理節點,能夠經過擴展Ansible來響應大量的Python事件,你能夠寫各類的插件,而且,你能夠經過插件來調取外部數據源。

3      總結

     Ansible感受仍是不是挺適合咱們的業務,主要是因爲過於簡單,且語言也不合適(python)還不如如今本身開發一個比較靠譜。

相關文章
相關標籤/搜索