Ansible應用介紹

Ansible

簡介

ansible是個什么東西呢?官方的title是“Ansible is Simple IT Automation”——簡單的自動化IT工具。這個工具的目標有這么幾項:自動化部署APP;自動化管理配置項;自動化的持續交互;自動化的(AWS)云服務管理。所有的這幾個目標從本質上來說都是在一個臺或者幾臺服務器上,執行一系列的命令而已。通俗的說就是批量的在遠程服務器上執行命令 。當然,最主要的是它是基于 paramiko 開發的。這個paramiko是什么呢?它是一個純Python實現的ssh協議庫。因此fabric和ansible還有一個共同點就是不需要在遠程主機上安裝client/agents,因為它們是基于ssh來和遠程主機通訊的。簡單歸納一下:

Ansible

—基于 Python paramiko 開發,分布式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2模板語言,更強的遠程命令執行操作

類似的自動化運維工具有很多常用的還有:

Puppet

—基于 Ruby 開發,采用 C/S 架構,擴展性強,基于 SSL,遠程命令執行相對較弱

SaltStack

—基于 Python 開發,采用 C/S 架構,相對 puppet 更輕量級,配置語法使用 YMAL,使得配置腳本更簡單

Ansible工作機制

Ansible 在管理節點將 Ansible 模塊通過 SSH 協議(或者 Kerberos、LDAP)推送到被管理端執行,執行完之后自動刪除,可以使用 SVN 等來管理自定義模塊及編排

ansible.png

由上面的圖可以看到 Ansible 的組成由 5 個部分組成:

Ansible:            核心

Modules:          包括 Ansible 自帶的核心模塊及自定義模塊

Plugins:            完成模塊功能的補充,包括連接插件、郵件插件等

Playbooks:       網上很多翻譯為劇本,個人覺得理解為編排更為合理;定義 Ansible 多任務配置文件,有 Ansible 自動執行

Inventory:         定義 Ansible 管理主機的清單

Ansible安裝

使用軟件倉庫安裝

主要的Linux發行版都有自己的軟件包管理系統,能幫你自動解決軟件包的依賴關系。比如:

Fedora、RHEL、CentOS以及兼容的發行版:

$ sudo yum -y install ansible

Ubuntu、Debian,以及兼容發行版:

$ apt-get install ansible

注意:Fedora、RHEL、CentOS要配置epel源倉庫

使用源碼安裝

最時尚的玩法是使用源碼安裝了。你會拿到最新版,但并非穩定版。所以,使用源碼安裝時要留意Bug,積極關注社區和版本更新。請從Github上獲取最新代碼,安裝過程如下:

$ git clone git://github.com/ansible/ansible.git

$ cd ansible && sudo make&&make install

使用pip安裝Ansible

Pip是專門用來管理Python模塊的工具,Ansible會將每次正式發布都更新到pip倉庫中。所以通過pip安裝或更新Ansible,會比較穩妥的拿到最新穩定版。

值得注意的是升級操作系統時,并不會同時升級Ansible。另外,升級操作系統有可能損壞Ansible環境,畢竟它依賴Python。還有如果你已經基于Ansible開發大量模塊,你最好一直使用對應版本。此時不建議你升級到最新版本,以免由于不兼容等問題導致模塊功能異常。Pip的安裝指令為:

$ pip install ansible

Ansible的升級

利用pip升級ansible

$pip install –upgrade ansible

嘗試ansible

配置主機Hosts

Ansible 通過讀取默認的主機清單配置/etc/ansible/hosts,可以同時連接到多個遠程主機上執行任務,默認路徑可以通過修改 ansible.cfg 的 hostfile 參數指定路徑。下面會有詳細介紹

vi /etc/ansible/hosts

[web]

192.168.1.100

192.168.1.101

配置免密鑰登陸

為了避免Ansible下發指令時輸入目標主機密碼,通過證書簽名達到SSH無密碼是一個好的方案,推薦使用ssh-keygen與ssh-copy-id來實現快速證書的生成和公鑰下發,其中ssh-keygen生成一對密鑰,使用ssh-copy-id來下發生成的公鑰。具體操作如下:

ssh-keygen -t rsa -P ''

ssh-copy-id -i .ssh/id_rsa.pub deploy@192.168.1.100

ssh-copy-id -i .ssh/id_rsa.pub deploy@192.168.1.101

注意:在首次連接或者重裝系統之后會出現檢查 keys 的提示

The authenticity of host '192.168.0.5 (192.168.0.5)' can't be established.

ECDSA key fingerprint is 05:51:e5:c4:d4:66:9b:af:5b:c9:ba:e9:e6:a4:2b:fe.

Are you sure you want to continue connecting (yes/no)?

解決辦法:

vim /etc/ansible/ansible.cfg 或者 ~/.ansible.cfg

[defaults]

host_key_checking = False

也可以通過設置系統環境變量來禁止這樣的提示

export ANSIBLE_HOST_KEY_CHECKING=False

測試ping

ansible web -m ping

192.168.1.101 | success >> {

    "changed": false,

    "ping": "pong"

}

 

192.168.1.100 | success >> {

    "changed": false,

    "ping": "pong"

}

Ansible命令參數介紹

-v,–verbose                                   詳細模式,如果命令執行成功,輸出詳細的結果(-vv –vvv -vvvv)

  -i PATH,–inventory=PATH                       指定host文件的路徑,默認是在/etc/ansible/hosts

  -f NUM,–forks=NUM                             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                                     測試此命令執行會改變什么內容,不會真正的去執行

主機清單Hosts介紹

Ansible 通過讀取默認的主機清單配置/etc/ansible/hosts,可以同時連接到多個遠程主機上執行任務,默認路徑可以通過修改 ansible.cfg 的 hostfile 參數指定路徑。

/etc/ansible/hosts 主機清單配置格式如下

[dbservers]                                                     []表示主機的分組名,可以按照功能、系統等進行分類,便于對某些主機或者某一組功能相同的主機進行操作

192.168.1.12

one.example.com

badwolf.example.com:5309                                        支持指定 SSH 端口 5309

jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50     設置主機別名為 jumper

www[01:50].example.com                                         支持通配符匹配 www01 www02 …www50

[databases]

db-[a:f].example.com                                             支持字母匹配 a b c…f

為某主機指定連接類型和連接用戶

[zhao]

Localhost  ansible_connection=local

other1.example.com ansible_connection=ssh ansible_ssh_user=deploy

other2.example.com ansible_connection=ssh ansible_ssh_user=deploy

hosts 文件支持一些特定指令,上面已經使用了其中幾個,所有支持的指令如下:

ansible_ssh_host                       指定主機別名對應的真實 IP,如:100 ansible_ssh_host=192.168.1.100,隨后連接該主機無須指定完整 IP,只需指定 251 就行

ansible_ssh_port                       指定連接到這個主機的 ssh 端口,默認 22

ansible_ssh_user                       連接到該主機的 ssh 用戶

ansible_ssh_pass                       連接到該主機的 ssh 密碼(連-k 選項都省了),安全考慮還是建議使用私鑰或在命令行指定-k 選項輸入

ansible_sudo_pass                      sudo 密碼

ansible_sudo_exe                       sudo 命令路徑

ansible_connection                     連接類型,可以是 localssh paramiko,ansible1.2 之前默認為 paramiko

ansible_ssh_private_key_file           私鑰文件路徑

ansible_shell_type                     目標系統的 shell 類型,默認為 sh,如果設置 csh/fish,那么命令需要遵循它們語法

ansible_python_interpreter             python 解釋器路徑,默認是/usr/bin/python,但是如要要連*BSD系統的話,就需要該指令修改 python 路徑

ansible_*_interpreter                  這里的"*"可以是 ruby perl 或其他語言的解釋器,作用和 ansible_python_interpreter 類似

清單通配模式介紹

在Ansible中,清單一位著要管理哪些機器,在playbook中,意味著哪些主機需要應用特定的配置或者過程。

比如我們的主機列表配置為:

192.168.1.10

[web]

192.168.1.100

192.168.1.101

[db]

192.168.1.102

 

ansible web -m yum -a "name=nginx state=present"

模式通常用主機組來表示,上面的命令就代表web組的所有主機

簡單介紹一下其他的匹配方式:

通配所有主機

all

*

通配具有規則特征的主機或者主機名

one.example.com

*.example.com

192.168.1.100

192.168.1.*

通配兩個組的所有主機,組名之間通過冒號隔開,表示OR的意思

web

web:db

非模式匹配:表示在 web組不在db組的主機

web:!db

交集匹配:表示同時都在 web 和db組的主機

web:&db

匹配一個組的特定編號的主機(先后順序 0 到…)

匹配 web組的第 1 個主機

web[0]

匹配 web組的第 1 個到第 25 個主機

web [0-25]                                                  官網文檔是”:”表示范圍,測試發現應該使用”,注意不要和匹配多個主機組混淆

組合匹配:在 web或者 db組中,必須還存在于test1組中,但是不在test2組中

web:db:&test1:!test2

ansible幾個常用模塊介紹

shell模塊

默認情況下,ansible使用的module 是 command,這個模塊并不支持 shell 變量和管道等,若想使用shell 來執行模塊,請使用-m 參數指定 shell 模塊,但是值得注意的是普通的命令執行模塊是通過python的ssh執行。

使用shell模塊在遠程主機上執行命令:

ansible web -m shell -a ‘echo $TERM’

raw模塊

Raw也是命令執行模塊,而raw模塊則是直接用ssh模塊進行執行,通常用在客戶機還沒有python的環境的時候。

使用raw模塊在遠程主機上執行命令:

ansible web -m raw -a ‘echo $TERM’

copy模塊

實現主控端向目標主機拷貝文件,類似于scp的功能

拷貝本地的/etc/hosts 文件到 web主機組所有主機的/tmp/hosts(空目錄除外)

ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"

file模塊

file模塊稱之為文件屬性模塊,可以做的操作如下:

使用 file 模塊創建文件

ansible web -m file -a "dest=/tmp/zhao/a.txt state=touch"

file 模塊允許更改文件的用戶及權限

ansible web -m file -a "dest=/tmp/zhao/a.txt mode=600"

ansible web -m file -a "dest=/tmp/zhao/b.txt mode=600 owner=deploy group=root"

使用 file 模塊創建目錄,類似 mkdir -p

ansible web -m file -a "dest=/tmp/yong mode=755 owner=deploy group=sa state=directory"

使用 file 模塊刪除文件或者目錄

ansible web -m file -a "dest=/tmp/yong state=absent"

注:state的其他選項:link(鏈接)、hard(硬鏈接)

template模塊

根據官方的翻譯是:template使用了Jinjia2格式作為文件模板,進行文檔內變量的替換的模塊。他的每次使用都會被ansible標記為changed狀態。

stat模塊

獲取遠程文件狀態信息,包含atime、ctime、mtime、md5、uid、gid等

ansible web -m stat -a "path=/tmp/zhao/a.txt"

管理軟件模塊

apt、yum模塊分別用于管理ubuntu系列和redhat系列系統軟件包

安裝nginx軟件包

ansible web -m yum -a "name=nginx state=present"

ansible web -m apt -a "name=nginx state=present"

安裝包到一個特定的版本

ansible web -m yum -a "name=nginx-1.6.2 state=present"

ansible web -m apt -a "name=nginx-1.6.2 state=present"

指定某個源倉庫安裝某軟件包

ansible web -m yum -a "name=php55w enablerepo= remi state=present"

更新一個軟件包是最新版本

ansible web -m yum -a "name=nginx state=latest"

ansible web -m apt -a "name=nginx state=latest"

卸載一個軟件

ansible web -m yum -a "name=nginx state=absent"

ansible web –m apt -a "name=nginx state=absent"

Ansible 支持很多操作系統的軟件包管理,使用時 -m 指定相應的軟件包管理工具模塊,如果沒有這樣的模塊,可以自己定義類似的模塊或者使用 command 模塊來安裝軟件包。

User模塊

使用 user 模塊對于創建新用戶和更改、刪除已存在用戶非常方便

創建一個zhao用戶并更新密碼(密碼必須為加密過的字符串)

ansible all -m user -a "name=zhao password= $6$YyF5qLN8$edF1l.d/xcd9kv4ZQD/VVq5g2Uavlwoo/l.W4YVIQgsNghN4CbJKSEdZ5ihxztkYJ.bZV2PCP6MnGOioSLqUK."

刪除zhao用戶

ansible all -m user -a "name=zhao state=absent"

service模塊

啟動web 組所有主機的 httpd服務

ansible web -m service -a "name=httpd state=started"

重啟 web 組所有主機的 httpd服務

ansible web -m service -a "name=httpd state=restarted"

關閉web組所有主機的 httpd服務

ansible web -m service -a "name=httpd state=stopped"

playbook解析

Playbooks 是 一個不同于使用Ansible命令行執行方式的模式,其功能更強大靈活。簡單來說,playbook是一個非常簡單的配置管理和多主機部署系統,不同于任何已經存在的模式,可作為一個適合部署復雜應用程序的基礎。Playbook可以定制配置,可以按照指定的操作步驟有序執行,支持同步和異步方式。值得注意的是playbook是通過YAML格式來進行描述定義的?;镜腨MAL語法請參考http://docs.ansible.com/YAMLSyntax.html

Playbook組成

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

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

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

Handler section             定義 task 執行完成以后需要調用的任務

 

通過下面這個例子我們來簡單了解一下:

– hosts: web

vars:

worker_processes: 4

max_open_file: 65535

remote_user: deploy

tasks:

– name: ensure nginx is at the latest version

yum: pkg=nginx state=latest

– name: write the nginx config file

template: src=/data/ansible/template/nginx.j2 dest=/etc/nginx.conf

notify:

– restart nginx

– name: ensure nginx is running

service: name=nginx state=started

handlers:

– name: restart nginx

service: name=nginx state=restarted

主機和用戶

在playbook中的每一個play都可以選擇在哪些機器和以什么用戶完成,hosts一行可以是一個主機組或者主機或者主機也可以是多個,中間以冒號分隔,可以參考前面提到的清單通配模式:其中remote_user表示執行的用戶賬號

– hosts: web

remote_user: root

每個任務都可以定義自己的用戶

– hosts: web

remote_user: root

tasks:

– name: test connection

ping:

remote_user: yourname

在 playbook中使用sudo

– hosts: web

remote_user: yourname

sudo: yes

在一個任務中使用sudo

– hosts: web

remote_user: yourname

tasks:

– service: name=nginx state=started

sudo: yes

登陸后 sudo 到其他用戶執行

– hosts: web

remote_user: yourname

sudo: yes

sudo_user: postgres

注釋:在使用 sudo_user 切換到非 root 用戶時,Ansible 會將模塊參數(非密碼選項參數)記錄到/tmp 下的一個臨時隨機文件,命令執行完后會刪除;當 sudo 到 root 或者普通用戶登陸時并不記錄

任務列表

所有定義的任務列表(tasks list),playbook將按照定義的配置文件自上而下的順序執行,定義的主機都將得到相同的任務,但是執行的返回結果不一定保存一致,取決于主機的環境及程序包狀態。建議每個任務事件都要定義一個name標簽,好處是增強可讀性,也便于觀察結果輸出時了解運行的位置。下面就一service模塊為例來定義一個任務,service: key=value參數,具體請參考模塊的詳細介紹

tasks:

– name: ensure nginx is running

service: name=nginx state=started

command 和 shell 模塊不需要增加 key

tasks:

– name: disable selinux

command: setenforce 0

command和shell模塊關注命令或者腳本執行后返回值,如果命令成功執行返回結果不是0的情況下可以使用以下方法:

tasks:

– name: disable selinux

command: setenforce 0

     ignore_errors: True

如果在任務中參數過長可以回車使用空格縮進

tasks:

– name: Copy ansible inventory file to client

copy: src=/etc/ansible/hosts dest=/tmp/hosts

owner=root group=root mode=0644

變量的使用

如何創建一個有效的變量名

變量名應該由字母、數組和下劃線組成,以字母開頭。例如:foo_port、foo5 就是很好的變量名,而 foo-port、foo port、foo.port、12 都是無效的變量名

在 在 playbook  中如何定義變量

– hosts: webservers

vars:

http_port: 80

變量這一塊就不多提了,針對這一塊了解甚微,如有需要請自行查找,這里簡單介紹一下jinja2過濾器中的register關鍵字,register關鍵字的作用是將命令執行的結果保存為變量,結果會因為模塊不同而不同,在運行ansible-playbook時增加-v參數就可以看到results可能的值。比如:

– hosts: local

  remote_user: root

  tasks:

    – name: Get server Time

      shell: date +%Y-%m-%d_%H_%M

      register: Time

      ignore_errors: True

    – name: Create a file

      shell: touch /tmp/zhao{{Time.stdout}}.txt

執行結果如下:

$ ansible-playbook 2.yml -v

 

PLAY [local] ******************************************************************

 

GATHERING FACTS ***************************************************************

ok: [192.168.1.52]

 

TASK: [Get server Time] *******************************************************

changed: [192.168.1.52] => {"changed": true, "cmd": "date +%Y-%m-%d_%H_%M", "delta": "0:00:00.002363", "end": "2015-06-19 11:06:12.359652", "rc": 0, "start": "2015-06-19 11:06:12.357289", "stderr": "", "stdout": "2015-06-19_11_06", "warnings": []}

 

TASK: [Create a file] *********************************************************

changed: [192.168.1.52] => {"changed": true, "cmd": "touch /tmp/zhao2015-06-19_11_06.txt", "delta": "0:00:00.002386", "end": "2015-06-19 11:06:12.631204", "rc": 0, "start": "2015-06-19 11:06:12.628818", "stderr": "", "stdout": "", "warnings": ["Consider using file module with state=touch rather than running touch"]}

 

PLAY RECAP ********************************************************************

192.168.1.52               : ok=3    changed=2    unreachable=0    failed=0  

通過上面這個例子我們可以看到task的執行輸出和facts一樣的,我們可以通過jinja2模板獲取變量值:{{Time.stdout}}、{{Time.cmd}}等等

NotifyHandles

用于當關注的資源發生變化時采取一定的操作。

“notify”這個action可用于在每個play的最后被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,取而代之,僅在所有的變化發生完成后一次性地執行指定操作。在notify中列出的操作稱為handler,也即notify中調用handler中定義的操作。

– name: template configuration file

  template: src=template.j2 dest=/etc/foo.conf

  notify:

     – restart memcached

     – restart apache

handler是task列表,這些task與前述的task并沒有本質上的不同。

 handlers:

    – name: restart memcached

      service:  name=memcached state=restarted

    – name: restart apache

      service: name=apache state=restarted

角色定義使用

Roles在Ansible1.2+版本中所被支持,主要是為了更好的組織playbooks。

舉例說明:

site.yml

webservers.yml

fooservers.yml

roles/

common/

files/

templates/

tasks/

handlers/

vars/

defaults/

meta/

webservers/

files/

templates/

tasks/

handlers/

vars/

defaults/

meta/

在 playbook 中可以這樣使用 roles

– hosts: webservers

roles:

– common

– webservers

roles 目錄結構說明:

taskshandlers、vars(只對當前 role 有效)、meta(定義 role 間的直接依賴關系)目錄內存在

main.yml 文件時會將對應的任務、處理、變量和 meta 添加到 play

files 存放文件,ansible 默認會從這里找文件,對應 task 里面的 copyscript 模塊

template 存放模板,對應 task 里面的 template 模塊

tasks 存放任務,include 默認讀取這里的任務

defaults 默認的變量存放位置,使用/devaults/main.yml,相對其他參數變量設置的優先級最低

注釋:Ansible1.4+以后的版本,可以通過 roles_path 參數配置 roles 路徑,多路徑使用冒號分隔,可以將常見角色集中存放,指定 roles 路徑,這樣多個 playbook 可以共用

運行Playbook

查看模塊執行成功與否的詳細信息

$ansible-playbook playbook.yml –v

查看一個 playbook 中都會對哪些主機產生影響

$ansible-playbook playbook.yml –list-hosts

查看都有哪些任務要執行

$ansible-playbook playbook.yml –list-tasks

原創文章,作者:ZhaoYong,如若轉載,請注明出處:http://www.www58058.com/6014

(1)
ZhaoYongZhaoYong
上一篇 2015-07-03
下一篇 2015-07-03

相關推薦

  • linux中的權限和ACL

    linux中權限詳解和ACL

    2017-11-18
  • 文本處理三劍客之Gawk ?

        AWK可以說是一種語言,他有著自己的語法,可以實現函數定義,變量賦值,條件選擇(循環,判斷,選擇)…總之是值得深入研究一下的。     AWK的起源:是個報告生成器,可以格式化文本輸出內容,它的命名是由Aho,Weinberger,Kernighan三位作者首…

    Linux干貨 2016-09-21
  • LVM原理、創建、擴容、縮減、快照詳解

    LVM是什么?為什么要使用LVM?     LVM(Logical Volume Manager):邏輯卷管理, 在日常使用或生產環境中, 我們可能會因為在規劃存儲時未考慮到未來數據增長的速度超乎我們的預計而措手不及,因為增加一塊硬盤再將源數據移到新硬盤上很麻煩并且提高了成本還浪費硬盤空間。   &…

    Linux干貨 2016-03-09
  • Tomcat基礎及常見使用入門

    Tomcat的簡單介紹,安裝,以及簡單的配置運用

    2017-09-11
  • 創建CA、申請證書和吊銷證書詳解

    創建CA和申請證書、吊銷證書 搭建工具:openssl 服務端:centos7 客戶端:centos6 配置實驗環境: 需要兩臺虛擬機為服務端、客戶端提供運行環境,裝載openssl工具,添加必要文件;通過查看openssl的配置文件/etc/pki/tls/openssl.cnf(圖一),對比服務端的/etc/pki/CA文件內容(圖二),如果第一次搭建服…

    2017-04-11
欧美性久久久久