ansible基礎

ansible <host-parttens> [-f forks] [-m module] [-a args] ' args 'php

host-parttens:servername  或者src1:src2 同時src1:&src2html

-f :指定一次運行多少並行的進程node

如今執行以下命令,這個命令中,atlanta是一個組,這個組裏面有不少服務器,」/sbin/reboot」命令會在atlanta組下 的全部機器上執行.這裏ssh-agent會fork出10個子進程(bash),以並行的方式執行reboot命令.如前所說「每次重啓10個」 便是以這種方式實現:python

$ ansible atlanta -a "/sbin/reboot" -f 10

若是想經過 sudo 去執行命令,以下:mysql

$ ansible atlanta -a "/usr/bin/foo" -u username --sudo [--ask-sudo-pass] 

若是你不是以 passwordless 的模式執行 sudo,應加上 --ask-sudo-pass (-K)選項,加上以後會提示你輸入 密碼.使用 passwordless 模式的 sudo, 更容易實現自動化,但不要求必定要使用 passwordless sudo.git

也能夠經過``–sudo-user`` (-U)選項,使用 sudo 切換到其它用戶身份,而不是 root(譯者注:下面命令中好像寫掉了–sudo):web

$ ansible atlanta -a "/usr/bin/foo" -u username -U otheruser [--ask-sudo-pass]
在有些比較罕見的狀況下,一些用戶會受到安全規則的限制,使用 sudo 切換時只能運行指定的命令.
這與 ansible的 no-bootstrapping 思想相悖,並且 ansible 有幾百個模塊,在這種限制下沒法進行正常的工做. 因此執行 ansible 命令時,應使用一個沒有受到這種限制的帳號來執行.

command 模塊不支持 shell 變量,也不支持管道等 shell 相關的東西.若是你想使用 shell相關的這些東西, 請使用’shell’ 模塊.兩個模塊以前的差異請參考 模塊相關 .sql

使用 shell 模塊的示例以下:shell

$ ansible raleigh -m shell -a 'echo $TERM'


File Transfer

這是 /usr/bin/ansible 的另外一種用法.Ansible 可以以並行的方式同時 SCP 大量的文件到多臺機器. 命令以下:apache

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

若你使用 playbooks, 則能夠利用 template 模塊來作到更進一步的事情.(請參見 module 和 playbook 的文檔)

使用 file 模塊能夠作到修改文件的屬主和權限,(在這裏可替換爲 copy 模塊,是等效的):

$ ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600" $ ansible webservers -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan" 

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

$ ansible webservers -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory" 

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

$ ansible webservers -m file -a "dest=/path/to/c state=absent" 

Managing Packages

Ansible 提供對 yum 和 apt 的支持.這裏是關於 yum 的示例.

確認一個軟件包已經安裝,但不去升級它:

$ ansible webservers -m yum -a "name=acme state=present" 

確認一個軟件包的安裝版本:

$ ansible webservers -m yum -a "name=acme-1.5 state=present" 

確認一個軟件包尚未安裝:

$ ansible webservers -m yum -a "name=acme state=absent" 

對於不一樣平臺的軟件包管理工具,Ansible都有對應的模塊.若是沒有,你也可使用 command 模塊去安裝軟件. 或者最好是來爲那個軟件包管理工具貢獻一個相應的模塊.請在 mailing list 中查看相關的信息和詳情.

Users and Groups

使用 ‘user’ 模塊能夠方便的建立帳戶,刪除帳戶,或是管理現有的帳戶:

$ ansible all -m user -a "name=foo password=<crypted password here>" $ ansible all -m user -a "name=foo state=absent" 

更多可用的選項請參考 模塊相關 ,包括對組和組成員關係的操做.

Deploying From Source Control

直接使用 git 部署 webapp:

$ ansible webservers -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD" 

由於Ansible 模塊可通知到 change handlers ,因此當源碼被更新時,咱們能夠告知 Ansible 這個信息,並執行指定的任務, 好比直接經過 git 部署 Perl/Python/PHP/Ruby, 部署完成後重啓 apache.

Managing Services

確認某個服務在全部的webservers上都已經啓動:

$ ansible webservers -m service -a "name=httpd state=started" 

或是在全部的webservers上重啓某個服務(譯者注:多是確認已重啓的狀態?):

$ ansible webservers -m service -a "name=httpd state=restarted" 

確認某個服務已經中止:

$ ansible webservers -m service -a "name=httpd state=stopped" 

Time Limited Background Operations

須要長時間運行的命令能夠放到後臺去,在命令開始運行後咱們也能夠檢查運行的狀態.若是運行命令後,不想獲取返回的信息, 可執行以下命令:

$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff" 

若是你肯定要在命令運行後檢查運行的狀態,可使用 async_status 模塊.前面執行後臺命令後會返回一個 job id, 將這個 id 傳給 async_status 模塊:

$ ansible web1.example.com -m async_status -a "jid=488359678239.2844" 

獲取狀態的命令以下:

$ ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff" 

其中 -B 1800 表示最多運行30分鐘, -P 60 表示每隔60秒獲取一次狀態信息.

Polling 獲取狀態信息的操做會在後臺工做任務啓動以後開始.若你但願全部的工做任務快速啓動, --forks 這個選項的值 要設置得足夠大,這是前面講過的併發進程的個數.在運行指定的時間(由``-B``選項所指定)後,遠程節點上的任務進程便會被終止.

通常你只能在把須要長時間運行的命令或是軟件升級這樣的任務放到後臺去執行.對於 copy 模塊來講,即便按照前面的示例想放到 後臺執行文件傳輸,實際上並不會如你所願.

Gathering Facts

在 playbooks 中有對於 Facts 作描述,它表明的是一個系統中已發現的變量.These can be used to implement conditional execution of tasks but also just to get ad-hoc information about your system. 可經過以下方式查看全部的 facts:

$ ansible all -m setup

咱們也能夠對這個命令的輸出作過濾,只輸出特定的一些 facts,詳情請參考 「setup」 模塊的文檔.

若是你已準備好仔細研究 Playbooks ,能夠繼續讀讀 Variables ,會對 facts有更多瞭解.




Playbook 語言的示例

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

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

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

‘plays’ 好似音符,playbook 好似由 ‘plays’ 構成的樂譜,經過 playbook,能夠編排步驟進行多機器的部署,好比在 webservers 組的全部機器上運行必定的步驟, 而後在 database server 組運行一些步驟,最後回到 webservers 組,再運行一些步驟,諸如此類.

「plays」 算是一個體育方面的類比,你能夠經過多個 plays 告訴你的系統作不一樣的事情,不只是定義一種特定的狀態或模型.你能夠在不一樣時間運行不一樣的 plays.

對初學者,這裏有一個 playbook,其中僅包含一個 play:

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=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
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted


若是 action 行看起來太長,你可使用 space(空格) 或者 indent(縮進) 隔開連續的一行:

tasks:
  - name: Copy ansible inventory file to client
    copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
            owner=root group=root mode=0644

在 action 行中可使用變量.假設在 ‘vars’ 那裏定義了一個變量 ‘vhost’ ,能夠這樣使用它:

tasks:
  - name: create a virtual host file for {{ vhost }}
    template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}

Handlers: 在發生改變時執行的操做

上面咱們曾提到過,module 具備」冪等」性,因此當遠端系統被人改動時,能夠重放 playbooks 達到恢復的目的. playbooks 自己能夠識別這種改動,而且有一個基本的 event system(事件系統),能夠響應這種改動.

(當發生改動時)’notify’ actions 會在 playbook 的每個 task 結束時被觸發,並且即便有多個不一樣的 task 通知改動的發生, ‘notify’ actions 只會被觸發一次.

舉例來講,好比多個 resources 指出由於一個配置文件被改動,因此 apache 須要從新啓動,可是從新啓動的操做只會被執行一次.

這裏有一個例子,當一個文件的內容被改動時,重啓兩個 services:

- name: template configuration file
  template: src=template.j2 dest=/etc/foo.conf
  notify:
     - restart memcached
     - restart apache

‘notify’ 下列出的便是 handlers.

Handlers 也是一些 task 的列表,經過名字來引用,它們和通常的 task 並無什麼區別.Handlers 是由通知者進行 notify, 若是沒有被 notify,handlers 不會執行.無論有多少個通知者進行了 notify,等到 play 中的全部 task 執行完成以後,handlers 也只會被執行一次.

這裏是一個 handlers 的示例:

handlers:
    - name: restart memcached
      service:  name=memcached state=restarted
    - name: restart apache
      service: name=apache state=restarted

Handlers 最佳的應用場景是用來重啓服務,或者觸發系統重啓操做.除此之外不多用到了.

 

 

Ansible之roles介紹

 

本節內容:

  • 什麼場景下會用roles?
  • roles示例

 

1、什麼場景下會用roles?

假如咱們如今有3個被管理主機,第一個要配置成httpd,第二個要配置成php服務器,第三個要配置成MySQL服務器。咱們如何來定義playbook?

第一個play用到第一個主機上,用來構建httpd,第二個play用到第二個主機上,用來構建php,第三個play用到第三個主機上,用來構建MySQL。這些個play定義在playbook中比較麻煩,未來也不利於模塊化調用,不利於屢次調。好比說後來又加進來一個主機,這個第4個主機既是httpd服務器,又是php服務器,咱們只能寫第4個play,上面寫上安裝httpd和php。這樣playbook中的代碼就重複了。

爲了不代碼重複,roles可以實現代碼重複被調用。定義一個角色叫websrvs,第二個角色叫phpappsrvs,第三個角色叫dbsrvs。那麼調用時以下來調用:

複製代碼
hosts: host1
role:
- websrvs

hosts: host2
role:
- phpappsrvs
        
hosts: host3
role:
- dbsrvs
        
hosts: host4
role:
- websrvs
- phpappsrvs
複製代碼

這樣代碼就能夠重複利用了,每一個角色能夠被獨立重複調用。下面舉例說明使用方式。

 

2、roles示例

假設有3臺主機,172.16.7.151主機上安裝MySQL,172.16.7.152上安裝httpd,172.16.7.153上安裝MySQL和httpd。咱們創建兩個角色websrvs和dbsrvs,而後應用到這幾個主機上。

 

1. 建立roles的必需目錄 

[root@node1 opt]# mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}

每一個role下面有個目錄叫meta,在裏面能夠新建文件main.yml,在文件中能夠設置該role和其它role以前的關聯關係。

 

2. 配置角色

(1)配置角色websrvs

[root@node1 opt]# cd ansible_playbooks/roles/
[root@node1 roles]# cd websrvs/
[root@node1 websrvs]# ls
files  handlers  meta  tasks  templates  vars

a. 將httpd配置文件上傳到files目錄下,我這裏假設httpd.conf每臺主機都是同樣的,實際上應該用模板,先用同樣的配置文件舉例

[root@node1 websrvs]# cp /etc/httpd/conf/httpd.conf files/

直接複製的靜態文件都放在files目錄下。打算用模板文件的都放在templates目錄下。

 

b.編寫任務列表tasks

複製代碼
[root@node1 websrvs]# vim tasks/main.yml
- name: install httpd package
  yum: name=httpd
- name: install configuration file
  copy: src=httpd.conf dest=/etc/httpd/conf
  tags:
  - conf
  notify:
  - restart httpd
- name: start httpd
  service: name=httpd state=started
複製代碼

 

c.因爲上面的tasks中定義了notify,因此要定義handlers

[root@node1 websrvs]# vim handlers/main.yml
- name: restart httpd
  service: name=httpd state=restarted

若是須要定義變量,則在vars目錄下建立main.yml文件,在文件中寫入變量,以key:value的形式定義,好比:

http_port: 8080

 

(2)配置角色dbsrvs

[root@node1 roles]# cd dbsrvs/
[root@node1 dbsrvs]# ls
files  handlers  meta  tasks  templates  vars

a.將MySQL配置文件上傳到files目錄下。


b.編寫任務列表tasks

複製代碼
[root@node1 dbsrvs]# vim tasks/main.yml
- name: install mysql-server package
  yum: name=mysql-server state=latest
- name: install configuration file
  copy: src=my.cnf dest/etc/my.cnf
  tags:
  - conf
  notify:
  - restart mysqld
- name:
  service: name=mysqld enabled=true state=started
複製代碼

 

c.定義handlers

[root@node1 dbsrvs]# vim handlers/main.yml
- name: restart mysqld
  service: name=mysqld state=restarted

 

(3)定義playbook

【注意】:要在roles目錄同級建立playbook。

複製代碼
[root@node1 ansible_playbooks]# vim web.yml
- hosts: 172.16.7.152
  roles:
  - websrvs 

[root@node1 ansible_playbooks]# vim db.yml
- hosts: 172.16.7.151
  roles:
  - dbsrvs 

[root@node1 ansible_playbooks]# vim site.yml
- hosts: 172.16.7.153
  roles:
  - websrvs
  - dbsrvs 
複製代碼

運行:

[root@node1 ansible_playbooks]# ansible-playbook web.yml
[root@node1 ansible_playbooks]# ansible-playbook db.yml
[root@node1 ansible_playbooks]# ansible-playbook site.yml

固然也能夠把這些內容寫入同一個playbook中。playbook的名字能夠自定義。

相關文章
相關標籤/搜索