自動化運維工具ansible怎么用-創(chuàng)新互聯(lián)

自動化運維工具ansible怎么用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)公司從2013年成立,先為寧蒗等服務(wù)建站,寧蒗等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為寧蒗企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

正文

回到頂部

Ansible playbook 簡介

  playbook 是 ansible 用于配置,部署,和管理被控節(jié)點的劇本。
  通過 playbook 的詳細描述,執(zhí)行其中的一系列 tasks ,可以讓遠端主機達到預(yù)期的狀態(tài)。playbook 就像 Ansible 控制器給被控節(jié)點列出的的一系列 to-do-list ,而被控節(jié)點必須要完成。
  也可以這么理解,playbook 字面意思,即劇本,現(xiàn)實中由演員按照劇本表演,在Ansible中,這次由計算機進行表演,由計算機安裝,部署應(yīng)用,提供對外服務(wù),以及組織計算機處理各種各樣的事情。

回到頂部

Ansible playbook使用場景

  執(zhí)行一些簡單的任務(wù),使用ad-hoc命令可以方便的解決問題,但是有時一個設(shè)施過于復(fù)雜,需要大量的操作時候,執(zhí)行的ad-hoc命令是不適合的,這時最好使用playbook。
  就像執(zhí)行shell命令與寫shell腳本一樣,也可以理解為批處理任務(wù),不過playbook有自己的語法格式。
  使用playbook你可以方便的重用這些代碼,可以移植到不同的機器上面,像函數(shù)一樣,大化的利用代碼。在你使用Ansible的過程中,你也會發(fā)現(xiàn),你所處理的大部分操作都是編寫playbook??梢园殉R姷膽?yīng)用都編寫成playbook,之后管理服務(wù)器會變得十分簡單。

回到頂部

Ansible playbook格式

1)格式簡介

  playbook由YMAL語言編寫。YAML( /?j?m?l/ )參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發(fā)表了這種語言,另外Ingy d?t Net與OrenBen-Kiki也是這語言的共同設(shè)計者。
  YMAL格式是類似于JSON的文件格式,便于人理解和閱讀,同時便于書寫。首先學(xué)習(xí)了解一下YMAL的格式,對我們后面書寫playbook很有幫助。以下為playbook常用到的YMAL格式:
  1、文件的第一行應(yīng)該以 "---" (三個連字符)開始,表明YMAL文件的開始。
  2、在同一行中,#之后的內(nèi)容表示注釋,類似于shell,python和ruby。
  3、YMAL中的列表元素以”-”開頭然后緊跟著一個空格,后面為元素內(nèi)容。
  4、同一個列表中的元素應(yīng)該保持相同的縮進。否則會被當做錯誤處理。
  5、play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"后面還要增加一個空格。
  下面是一個舉例:

---#安裝與運行mysql服務(wù)- hosts: node1  remote_user: root  tasks:  
    - name: install mysql-server package      yum: name=mysql-server state=present    - name: starting mysqld service      service: name=mysql state=started

  我們的文件名稱應(yīng)該以.yml結(jié)尾,像我們上面的例子就是mysql.yml。其中,有三個部分組成:

host部分:使用 hosts 指示使用哪個主機或主機組來運行下面的 tasks ,每個 playbook 都必須指定 hosts ,hosts也可以使用通配符格式。主機或主機組在 inventory 清單中指定,可以使用系統(tǒng)默認的/etc/ansible/hosts,也可以自己編輯,在運行的時候加上-i選項,指定清單的位置即可。在運行清單文件的時候,–list-hosts選項會顯示那些主機將會參與執(zhí)行 task 的過程中。
remote_user:指定遠端主機中的哪個用戶來登錄遠端系統(tǒng),在遠端系統(tǒng)執(zhí)行 task 的用戶,可以任意指定,也可以使用 sudo,但是用戶必須要有執(zhí)行相應(yīng) task 的權(quán)限。
tasks:指定遠端主機將要執(zhí)行的一系列動作。tasks 的核心為 ansible 的模塊,前面已經(jīng)提到模塊的用法。tasks 包含 name 和要執(zhí)行的模塊,name 是可選的,只是為了便于用戶閱讀,不過還是建議加上去,模塊是必須的,同時也要給予模塊相應(yīng)的參數(shù)。

  使用ansible-playbook運行playbook文件,得到如下輸出信息,輸出內(nèi)容為JSON格式。并且由不同顏色組成,便于識別。一般而言
| 綠色代表執(zhí)行成功,系統(tǒng)保持原樣
| 黃色代表系統(tǒng)代表系統(tǒng)狀態(tài)發(fā)生改變
| 紅色代表執(zhí)行失敗,顯示錯誤輸出
  執(zhí)行有三個步驟:1、收集facts 2、執(zhí)行tasks 3、報告結(jié)果
自動化運維工具ansible怎么用

2)核心元素

  Playbook的核心元素:

Hosts:主機組;
Tasks:任務(wù)列表;
Variables:變量,設(shè)置方式有四種;
Templates:包含了模板語法的文本文件;
Handlers:由特定條件觸發(fā)的任務(wù);

3)基本組件

  Playbooks配置文件的基礎(chǔ)組件:

Hosts:運行指定任務(wù)的目標主機
remoute_user:在遠程主機上執(zhí)行任務(wù)的用戶;
sudo_user
tasks:任務(wù)列表

  格式:
    tasks:
      – name: TASK_NAME
       module: arguments
       notify: HANDLER_NAME
       handlers:
      – name: HANDLER_NAME
       module: arguments

模塊,模塊參數(shù)

  格式:
    (1) action: module arguments
    (2) module: arguments
    注意:shell和command模塊后面直接跟命令,而非key=value類的參數(shù)列表;

handlers:任務(wù),在特定條件下觸發(fā);接收到其它任務(wù)的通知時被觸發(fā);

  (1) 某任務(wù)的狀態(tài)在運行后為changed時,可通過“notify”通知給相應(yīng)的handlers;
  (2) 任務(wù)可以通過“tags“打標簽,而后可在ansible-playbook命令上使用-t指定進行調(diào)用;

舉例

① 定義playbook

[root@server ~]# cd /etc/ansible[root@server ansible]# vim nginx.yml---- hosts: web  remote_user: root  tasks:    - name: install nginx      yum: name=nginx state=present    - name: copy nginx.conf      copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yes      notify: reload    #當nginx.conf發(fā)生改變時,通知給相應(yīng)的handlers      tags: reloadnginx   #打標簽    - name: start nginx service      service: name=nginx state=started      tags: startnginx   #打標簽  handlers:  #注意,前面沒有-,是兩個空格    - name: reload      service: name=nginx state=restarted  #為了在進程中能看出來

② 測試運行結(jié)果
  寫完了以后,我們就可以運行了:

[root@server ansible]# ansible-playbook nginx.yml

自動化運維工具ansible怎么用
  現(xiàn)在我們可以看看兩臺機器的端口是否開啟:

[root@server ansible]# ansible web -m shell -a 'ss -nutlp |grep nginx'192.168.37.122 | SUCCESS | rc=0 >>
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=8304,fd=6),("nginx",pid=8303,fd=6))192.168.37.133 | SUCCESS | rc=0 >>
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=9671,fd=6),("nginx",pid=9670,fd=6))

③ 測試標簽
  我們在里面已經(jīng)打上了一個標簽,所以可以直接引用標簽。但是我們需要先把服務(wù)關(guān)閉,再來運行劇本并引用標簽:

[root@server ansible]# ansible web -m shell -a 'systemctl stop nginx'
[root@server ansible]# ansible-playbook nginx.yml -t startnginx

自動化運維工具ansible怎么用
④ 測試notify
  我們還做了一個notify,來測試一下:
  首先,它的觸發(fā)條件是配置文件被改變,所以我們?nèi)グ雅渲梦募械亩丝诟囊幌拢?/p>

[root@server ansible]# vim /tmp/nginx.conf    listen       8080;

  然后我們重新加載一下這個劇本:
自動化運維工具ansible怎么用
  發(fā)現(xiàn)我們執(zhí)行的就是reload段以及我們定義的notify部分。
  我們來看一看我們的端口號:

[root@server ansible]# ansible web -m shell -a 'ss -ntlp | grep nginx'192.168.37.122 | SUCCESS | rc=0 >>
LISTEN     0      128          *:8080                     *:*                   users:(("nginx",pid=2097,fd=6),("nginx",pid=2096,fd=6))192.168.37.133 | SUCCESS | rc=0 >>
LISTEN     0      128          *:8080                     *:*                   users:(("nginx",pid=3061,fd=6),("nginx",pid=3060,fd=6))

  可以看出,我們的nginx端口已經(jīng)變成了8080。
  

4)variables 部分

  上文中,我們說到了variables是變量,有四種定義方法,現(xiàn)在我們就來說說這四種定義方法:

① facts :可直接調(diào)用

  上一篇中,我們有說到setup這個模塊,這個模塊就是通過調(diào)用facts組件來實現(xiàn)的。我們這里的variables也可以直接調(diào)用facts組件。
  具體的facters我們可以使用setup模塊來獲取,然后直接放入我們的劇本中調(diào)用即可。

② 用戶自定義變量

  我們也可以直接使用用戶自定義變量,想要自定義變量有以下兩種方式:

通過命令行傳入

  ansible-playbook命令的命令行中的-e VARS, --extra-vars=VARS,這樣就可以直接把自定義的變量傳入。

在playbook中定義變量

  我們也可以直接在playbook中定義我們的變量:

vars:
  - var1: value1
  - - var2: value2
舉例

① 定義劇本
  我們就使用全局替換把我們剛剛編輯的文件修改一下:

[root@server ansible]# vim nginx.yml

自動化運維工具ansible怎么用
自動化運維工具ansible怎么用
  這樣一來,我們的劇本就定義完成了。
② 拷貝配置文件
  我們想要在被監(jiān)管的機器上安裝什么服務(wù)的話,就直接在我們的server端上把該服務(wù)的配置文件拷貝到我們的/tmp/目錄下。這樣我們的劇本才能正常運行。
  我們就以keepalived服務(wù)為例:

[root@server ansible]# cp /etc/keepalived/keepalived.conf /tmp/keepalived.conf

③ 運行劇本,變量由命令行傳入

[root@server ansible]# ansible-playbook nginx.yml -e rpmname=keepalived

自動化運維工具ansible怎么用
④ 修改劇本,直接定義變量
  同樣的,我們可以直接在劇本中把變量定義好,這樣就不需要在通過命令行傳入了。以后想要安裝不同的服務(wù),直接在劇本里把變量修改一下即可。

[root@server ansible]# vim nginx.yml

自動化運維工具ansible怎么用
⑤ 運行定義過變量的劇本
  我們剛剛已經(jīng)把變量定義在劇本里面了?,F(xiàn)在我們來運行一下試試看:

[root@server ansible]# ansible-playbook nginx.yml

自動化運維工具ansible怎么用
  發(fā)現(xiàn)這樣也是可以的~

③ 通過roles傳遞變量

  具體的,我們下文中說到 roles 的時候再詳細說明。這里是 傳送帶
  

④ Host Inventory

  我們也可以直接在主機清單中定義。
  定義的方法如下:

向不同的主機傳遞不同的變量:

  IP/HOSTNAME varaiable=value var2=value2

向組中的主機傳遞相同的變量:

  [groupname:vars]
  variable=value

5)模板 templates

  模板是一個文本文件,嵌套有腳本(使用模板編程語言編寫)。
  Jinja2:Jinja2是python的一種模板語言,以Django的模板語言為原本。
模板支持:

  字符串:使用單引號或雙引號;
  數(shù)字:整數(shù),浮點數(shù);
  列表:[item1, item2, ...]
  元組:(item1, item2, ...)
  字典:{key1:value1, key2:value2, ...}
  布爾型:true/false
  算術(shù)運算:
    +, -, *, /, //, %, **
  比較操作:
    ==, !=, >, >=, <, <=
  邏輯運算:
    and, or, not

  通常來說,模板都是通過引用變量來運用的。

舉例

① 定義模板
  我們直接把之前定義的/tmp/nginx.conf改個名,然后編輯一下,就可以定義成我們的模板文件了:

[root@server ansible]# cd /tmp
[root@server tmp]# mv nginx.conf nginx.conf.j2
[root@server tmp]# vim nginx.conf.j2
    worker_processes  {{ ansible_processor_vcpus }};    listen       {{ nginxport }};

② 修改劇本
  我們現(xiàn)在需要去修改劇本來定義變量:

[root@server ansible]# vim nginx.yml

自動化運維工具ansible怎么用
  需要修改的部分如圖所示。
③ 運行劇本
  上面的準備工作完成后,我們就可以去運行劇本了:

[root@server ansible]# ansible-playbook nginx.yml -t reloadnginx
PLAY [web] *********************************************************************
TASK [setup] *******************************************************************
ok: [192.168.37.122]
ok: [192.168.37.133]
TASK [copy nginx.conf] *********************************************************
ok: [192.168.37.122]
ok: [192.168.37.133]
PLAY RECAP *********************************************************************
192.168.37.122             : ok=2    changed=0    unreachable=0    failed=0   
192.168.37.133             : ok=2    changed=0    unreachable=0    failed=0

6)條件測試

when語句:在task中使用,jinja2的語法格式。
舉例如下:

tasks:
- name: install conf file to centos7  template: src=files/nginx.conf.c7.j2  when: ansible_distribution_major_version == "7"
- name: install conf file to centos6  template: src=files/nginx.conf.c6.j2  when: ansible_distribution_major_version == "6"

循環(huán):迭代,需要重復(fù)執(zhí)行的任務(wù);
  對迭代項的引用,固定變量名為"item",而后,要在task中使用with_items給定要迭代的元素列表;
舉例如下:

tasks:- name: unstall web packages  yum: name={{ item }} state=absent  with_items:  - httpd  - php  - php-mysql

7)字典

  ansible playbook 還支持字典功能。舉例如下:

- name: install some packages
  yum: name={{ item }} state=present
  with_items:
    - nginx
    - memcached
    - php-fpm
- name: add some groups  group: name={{ item }} state=present
  with_items:
    - group11
    - group12
    - group13
- name: add some users  user: name={{ item.name }} group={{ item.group }} state=present
  with_items:
    - { name: 'user11', group: 'group11' }
    - { name: 'user12', group: 'group12' }
    - { name: 'user13', group: 'group13' }

8)角色訂制:roles

① 簡介

  對于以上所有的方式有個弊端就是無法實現(xiàn)復(fù)用假設(shè)在同時部署Web、db、ha 時或不同服務(wù)器組合不同的應(yīng)用就需要寫多個yml文件。很難實現(xiàn)靈活的調(diào)用。
  roles 用于層次性、結(jié)構(gòu)化地組織playbook。roles 能夠根據(jù)層次型結(jié)構(gòu)自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量(vars)、文件(file)、任務(wù)(tasks)、模塊(modules)及處理器(handlers)放置于單獨的目錄中,并可以便捷地include它們的一種機制。角色一般用于基于主機構(gòu)建服務(wù)的場景中,但也可以是用于構(gòu)建守護進程等場景中。

② 角色集合

角色集合:roles/
mysql/
httpd/
nginx/
files/:存儲由copy或script等模塊調(diào)用的文件;
tasks/:此目錄中至少應(yīng)該有一個名為main.yml的文件,用于定義各task;其它的文件需要由main.yml進行“包含”調(diào)用;
handlers/:此目錄中至少應(yīng)該有一個名為main.yml的文件,用于定義各handler;其它的文件需要由main.yml進行“包含”調(diào)用;
vars/:此目錄中至少應(yīng)該有一個名為main.yml的文件,用于定義各variable;其它的文件需要由main.yml進行“包含”調(diào)用;
templates/:存儲由template模塊調(diào)用的模板文本;
meta/:此目錄中至少應(yīng)該有一個名為main.yml的文件,定義當前角色的特殊設(shè)定及其依賴關(guān)系;其它的文件需要由main.yml進行“包含”調(diào)用;
default/:此目錄中至少應(yīng)該有一個名為main.yml的文件,用于設(shè)定默認變量;

③ 角色定制實例

1. 在roles目錄下生成對應(yīng)的目錄結(jié)構(gòu)

[root@server ansible]# cd roles/
[root@server roles]# ls
[root@server roles]# mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
[root@server roles]# tree
.
├── httpd
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
├── mysql
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
└── nginx
    ├── default
    ├── files
    ├── handlers
    ├── meta
    ├── tasks
    ├── templates
    └── vars24 directories, 0 files

2. 定義配置文件
  我們需要修改的配置文件為/tasks/main.yml,下面,我們就來修改一下:

[root@server roles]# vim nginx/tasks/main.yml- name: cp  copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm- name: install  yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest- name: conf  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf  tags: nginxconf  notify: new conf to reload- name: start service  service: name=nginx state=started enabled=true

3. 放置我們所需要的文件到指定目錄
  因為我們定義的角色已經(jīng)有了新的組成方式,所以我們需要把文件都放到指定的位置,這樣,才能讓配置文件找到這些并進行加載。
  rpm包放在files目錄下,模板放在templates目錄下:

[root@server nginx]# cp /tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm ./files/
[root@server nginx]# cp /tmp/nginx.conf.j2 ./templates/
[root@server nginx]# tree
.
├── default
├── files
│   └── nginx-1.10.2-1.el7.ngx.x86_64.rpm
├── handlers
├── meta
├── tasks
│   └── main.yml
├── templates
│   └── nginx.conf.j2
└── vars7 directories, 3 files

4. 修改變量文件
  我們在模板中定義的變量,也要去配置文件中加上:

[root@server nginx]# vim vars/main.yml
nginxprot: 9999

5. 定義handlers文件
  我們在配置文件中定義了notify,所以我么也需要定義handlers,我們來修改配置文件:

[root@server nginx]# vim handlers/main.yml
- name: new conf to reload
  service: name=nginx state=restarted

6. 定義劇本文件
  接下來,我們就來定義劇本文件,由于大部分設(shè)置我們都單獨配置在了roles里面,所以,接下來劇本就只需要寫一點點內(nèi)容即可:

[root@server ansible]# vim roles.yml 
- hosts: web  remote_user: root  roles:    - nginx

7. 啟動服務(wù)
  劇本定義完成以后,我們就可以來啟動服務(wù)了:

[root@server ansible]# ansible-playbook roles.yml
PLAY [web] *********************************************************************
TASK [setup] *******************************************************************
ok: [192.168.37.122]
ok: [192.168.37.133]
TASK [nginx : cp] **************************************************************
ok: [192.168.37.122]
ok: [192.168.37.133]
TASK [nginx : install] *********************************************************
changed: [192.168.37.122]
changed: [192.168.37.133]
TASK [nginx : conf] ************************************************************
changed: [192.168.37.122]
changed: [192.168.37.133]
TASK [nginx : start service] ***************************************************
changed: [192.168.37.122]
changed: [192.168.37.133]
RUNNING HANDLER [nginx : new conf to reload] ***********************************
changed: [192.168.37.122]
changed: [192.168.37.133]
PLAY RECAP *********************************************************************
192.168.37.122             : ok=6    changed=4    unreachable=0    failed=0   
192.168.37.133             : ok=6    changed=4    unreachable=0    failed=0

  啟動過后照例查看端口號:

[root@server ansible]# ansible web -m shell -a "ss -ntulp |grep 9999"192.168.37.122 | SUCCESS | rc=0 >>
tcp    LISTEN     0      128       *:9999                  *:*                   users:(("nginx",pid=7831,fd=6),("nginx",pid=7830,fd=6),("nginx",pid=7829,fd=6))192.168.37.133 | SUCCESS | rc=0 >>
tcp    LISTEN     0      128       *:9999                  *:*                   users:(("nginx",pid=9654,fd=6),("nginx",pid=9653,fd=6),("nginx",pid=9652,fd=6))

  可以看出我們的劇本已經(jīng)執(zhí)行成功。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

網(wǎng)站欄目:自動化運維工具ansible怎么用-創(chuàng)新互聯(lián)
文章地址:http://bm7419.com/article42/cdishc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、用戶體驗、做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、建站公司搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)