1、rolesphp
ansilbe自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles可以根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只須要在playbook中使用include指令便可。簡單來說,roles就是經過分別將變量、文件、任務、模塊及處理器放置於單獨的目錄中,並能夠便捷地include它們的一種機制。角色通常用於基於主機構建服務的場景中,但也能夠是用於構建守護進程等場景中。
一個roles的案例以下所示:
site.yml
webservers.yml
fooservers.yml
roles/
common/ 一級目錄角色名
files/
templates/
tasks/
handlers/
vars/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
meta/
而在playbook中,能夠這樣使用roles:
---
- hosts: webservers
roles:
- common
- webservers
也能夠向roles傳遞參數,例如:
---
- hosts: webservers
roles:
- common
- { role: foo_app_instance, dir: '/opt/a', port: 5000 }
- { role: foo_app_instance, dir: '/opt/b', port: 5001 }
甚至也能夠條件式地使用roles,例如:
---
- hosts: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'" }
1.1 建立role的步驟
(1) 建立以roles命名的目錄;
(2) 在roles目錄中分別建立以各角色名稱命名的目錄,如webservers等;
(3) 在每一個角色命名的目錄中分別建立files、handlers、meta、tasks、templates和vars目錄;用不到的目錄能夠建立爲空目錄,也能夠不建立;
(4) 在playbook文件中,調用各角色;
1.2 role內各目錄中可用的文件
tasks目錄:至少應該包含一個名爲main.yml的文件,其定義了此角色的任務列表;此文件能夠使用include包含其它的位於此目錄中的task文件;
files目錄:存放由copy或script等模塊調用的文件;
templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件;
handlers目錄:此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler中使用include包含的其它的handler文件也應該位於此目錄中;
vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量;
meta目錄:應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係;ansible 1.3及其之後的版本才支持;
default目錄:爲當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;
2、Tags
tags用於讓用戶選擇運行或路過playbook中的部分代碼。ansible具備冪等性,所以會自動跳過沒有變化的部分,即使如此,有些代碼爲測試其確實沒有發生變化的時間依然會很是地長。此時,若是確信其沒有變化,就能夠經過tags跳過此些代碼片段。html
建立一個httpd角色,其中的任務有安裝httpd,開機啓動和啓動它,當本地httpd配置文件發生改變後,把本地的httpd配置文件複製到遠程主機上,經過指定tags,若是安裝了httpd,則先讓其開機不啓動和關閉服務後再刪除。node
建立一個httpd目錄
mysql
[root@node1 ~]# mkdir httpd
[root@node1 ~]# cp /etc/httpd/conf/httpd.conf httpd/ 提供要複製到遠程主機的配置文件
[root@node1 httpd]# ls -l
total 8
-rw-r--r-- 1 root root 75 Mar 30 06:29 apache.yml
drwxr-xr-x 3 root root 4096 Mar 30 06:26 rolesweb
建立角色須要的目錄
[root@node1 ~]# mkdir httpd/roles/web/{files,handles,tasks} -pv
mkdir: created directory `httpd/roles'
mkdir: created directory `httpd/roles/web'
mkdir: created directory `httpd/roles/web/files'
mkdir: created directory `httpd/roles/web/handles'
mkdir: created directory `httpd/roles/web/tasks'
[root@node1 ~]# cd httpd/
[root@node1 httpd]# yum install -y tree 安裝tree
[root@node1 httpd]# vim apache.ymlsql
編輯apache.yml添加角色,這裏須要注意的是路徑問題,apache.yml是在和roles在同一個目錄層級的
[root@node1 httpd]# cat apache.yml
- hosts: constrol
remote_user: root
hosts: constrol
roles:
- web
[root@node1 httpd]# pwd
/root/httpd
[root@node1 httpd]# tree . 查看提供的目錄樹
.
├── apache.yml
├── httpd.conf
└── roles
└── web
├── files
├── handles
└── tasks
5 directories, 2 filesshell
[root@node1 httpd]# mv httpd.conf roles/web/files/apache
[root@node1 httpd]# vim roles/web/handles/main.yml
[root@node1 httpd]# cat roles/web/handles/main.yml 提供handlers
- name: restart httpd
service: name=httpd state=restarted
[root@node1 httpd]# vim roles/web/tasks/main.yml
[root@node1 httpd]# cat roles/web/tasks/main.yml 提供任務tasks
- name: Install httpd 安裝httpd
yum: name=httpd
tags: install 提供的一個標籤
- name: start httpd 啓動httpd
service: name=httpd enabled=yes state=started
- name: copy configuration file 複製配置文件
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: copy
notify: restart httpd
- command: /bin/false 下面是判斷httpd是否安裝了,如已經安裝則先中止後卸載,這裏存在問題沒有考慮到冪等性,後面會修正
register: result
ignore_errors: True
tags: remove
- name: reinstall httpd
yum: name=httpd
when: result|failed
- name: stop httpd
service: name=httpd enabled=no state=stopped
- name: remove httpd
yum: name=httpd state=absent
[root@node1 httpd]# ansible constrol -m ping ping後面顯示爲pong,說明他們都在線
192.168.21.230 | success >> {
"changed": false,
"ping": "pong"
}
192.168.21.234 | success >> {
"changed": false,
"ping": "pong"
}
[root@node1 httpd]# ansible constrol -m command -a 'service httpd status' 正常啓動了
192.168.21.230 | success | rc=0 >>
httpd (pid 27646) is running...
192.168.21.234 | success | rc=0 >>
httpd (pid 10379) is running...
[root@node1 httpd]# ansible-playbook apache.yml -t remove 指定remove標籤出執行,這裏也是存在問題的,指定tags後,只會對和tags在同一級別的任務最近的任務作執行,這裏只執行了- command: /bin/false任務,下面都沒執行
PLAY [constrol] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.230]
ok: [192.168.21.234]
TASK: [web | command /bin/false] **********************************************
failed: [192.168.21.234] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001795", "end": "2015-04-15 09:54:11.437250", "rc": 1, "start": "2015-04-15 09:54:11.435455", "warnings": []}
...ignoring
failed: [192.168.21.230] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001614", "end": "2015-04-15 09:54:11.487340", "rc": 1, "start": "2015-04-15 09:54:11.485726", "warnings": []}
...ignoring
PLAY RECAP ********************************************************************
192.168.21.230 : ok=2 changed=1 unreachable=0 failed=0
192.168.21.234 : ok=2 changed=1 unreachable=0 failed=0
[root@node1 httpd]# ansible constrol -m command -a 'service httpd status'這裏就能夠發現httpd沒有被中止的
192.168.21.234 | success | rc=0 >>
httpd (pid 10379) is running...
192.168.21.230 | success | rc=0 >>
httpd (pid 27646) is running...
[root@node1 httpd]# ansible constrol -m command -a 'chkconfig --list httpd'
192.168.21.230 | success | rc=0 >>
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
192.168.21.234 | success | rc=0 >>
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@node1 httpd]# vim /etc/ansible/ansible.cfg 這裏是經過修改配置查看一下錯誤緣由,剛開始瞭解的是不很詳細,因此想經過生成日誌看看上面執行的過程
# logging is off by default unless this path is defined
# if so defined, consider logrotate
#log_path = /var/log/ansible.log
改成
log_path = /var/log/ansible.log
[root@node1 httpd]# ansible-playbook apache.yml -t remove 從新執行生成日誌,其實也能夠經過使用選項-vvv查看詳細的執行過程的
PLAY [constrol] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.230]
ok: [192.168.21.234]
TASK: [web | command /bin/false] **********************************************
failed: [192.168.21.234] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001798", "end": "2015-04-15 10:16:08.181279", "rc": 1, "start": "2015-04-15 10:16:08.179481", "warnings": []}
...ignoring
failed: [192.168.21.230] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.002055", "end": "2015-04-15 10:16:08.295655", "rc": 1, "start": "2015-04-15 10:16:08.293600", "warnings": []}
...ignoring
PLAY RECAP ********************************************************************
192.168.21.230 : ok=2 changed=1 unreachable=0 failed=0
192.168.21.234 : ok=2 changed=1 unreachable=0 failed=0
[root@node1 httpd]# cat /var/log/ansible.log 查看日誌發現這裏找不到什麼有用的信息
2015-03-30 07:19:18,577 p=31389 u=root |
2015-03-30 07:19:18,578 p=31389 u=root | /usr/bin/ansible-playbook apache.yml -t remove
2015-03-30 07:19:18,578 p=31389 u=root |
2015-03-30 07:19:18,631 p=31389 u=root | PLAY [constrol] ***************************************************************
2015-03-30 07:19:18,638 p=31389 u=root | GATHERING FACTS ***************************************************************
2015-03-30 07:19:29,839 p=31389 u=root | ok: [192.168.21.230]
2015-03-30 07:19:30,007 p=31389 u=root | ok: [192.168.21.234]
2015-03-30 07:19:30,021 p=31389 u=root | TASK: [web | command /bin/false] **********************************************
2015-03-30 07:19:30,991 p=31389 u=root | failed: [192.168.21.234] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001798", "end": "2015-04-15 10:16:08.181279", "rc": 1, "start": "2015-04-15 10:16:08.179481", "warnings": []}
2015-03-30 07:19:30,991 p=31389 u=root | ...ignoring
2015-03-30 07:19:31,009 p=31389 u=root | failed: [192.168.21.230] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.002055", "end": "2015-04-15 10:16:08.295655", "rc": 1, "start": "2015-04-15 10:16:08.293600", "warnings": []}
2015-03-30 07:19:31,010 p=31389 u=root | ...ignoring
2015-03-30 07:19:31,023 p=31389 u=root | PLAY RECAP ********************************************************************
2015-03-30 07:19:31,024 p=31389 u=root | 192.168.21.230 : ok=2 changed=1 unreachable=0 failed=0
2015-03-30 07:19:31,024 p=31389 u=root | 192.168.21.234 : ok=2 changed=1 unreachable=0 failed=0
[root@node1 ~]# cat web.yaml 這個是上次使用過的yaml,由於上次正常執行了,沒考慮到這裏是沒有指定標籤的,因此會按順序所有執行完
- name: web server
remote_user: root
hosts: constrol
tasks:
- command: /bin/false
register: result
ignore_errors: True
- name: reinstall httpd
yum: name=httpd
when: result|failed
- name: stop httpd
service: name=httpd enabled=no state=stopped
- name: remove httpd
yum: name=httpd state=absent
[root@node1 ~]# ansible-playbook web.yaml 執行yaml
PLAY [web server] *************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.230]
ok: [192.168.21.234]
TASK: [command /bin/false] ****************************************************
failed: [192.168.21.230] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001673", "end": "2015-04-15 10:21:59.205132", "rc": 1, "start": "2015-04-15 10:21:59.203459", "warnings": []}
...ignoring
failed: [192.168.21.234] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.002264", "end": "2015-04-15 10:22:04.076287", "rc": 1, "start": "2015-04-15 10:22:04.074023", "warnings": []}
...ignoring
TASK: [reinstall httpd] *******************************************************
ok: [192.168.21.230]
ok: [192.168.21.234]
TASK: [stop httpd] ************************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
TASK: [remove httpd] **********************************************************
changed: [192.168.21.230]
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.230 : ok=5 changed=3 unreachable=0 failed=0
192.168.21.234 : ok=5 changed=3 unreachable=0 failed=0
[root@node1 ~]# ansible constrol -m command -a 'service httpd status' 是正常執行的,因此httpd被卸載了
192.168.21.234 | FAILED | rc=1 >>
httpd: unrecognized service
192.168.21.230 | FAILED | rc=1 >>
httpd: unrecognized service
[root@node1 ~]# ansible constrol -m command -a 'rpm -q httpd'
192.168.21.234 | FAILED | rc=1 >>
package httpd is not installed
192.168.21.230 | FAILED | rc=1 >>
package httpd is not installed
vim
--skip-tags這個選項是跳過哪些標籤,查看經過ansible-playbook --help|less查看幫助信息,這裏就是安裝httpd了
[root@node1 httpd]# ansible-playbook apache.yml --skip-tags=copy,remove
PLAY [constrol] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
ok: [192.168.21.230]
TASK: [web | Install httpd] ***************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
TASK: [web | start httpd] *****************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
TASK: [web | reinstall httpd] *************************************************
fatal: [192.168.21.230] => |failed expects a dictionary
fatal: [192.168.21.234] => |failed expects a dictionary
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/root/apache.retry
192.168.21.230 : ok=3 changed=2 unreachable=1 failed=0
192.168.21.234 : ok=3 changed=2 unreachable=1 failed=0
[root@node1 httpd]# ansible constrol -m command -a 'service httpd status' 查看信息,安裝和啓動都ok
192.168.21.230 | success | rc=0 >>
httpd (pid 29495) is running...
192.168.21.234 | success | rc=0 >>
httpd (pid 13317) is running...
[root@node1 httpd]# ansible constrol -m command -a 'rpm -q httpd'
192.168.21.230 | success | rc=0 >>
httpd-2.2.15-39.el6.centos.x86_64
192.168.21.234 | success | rc=0 >>
httpd-2.2.15-39.el6.centos.x86_64
[root@node1 ~]# cat web.yaml 修改web.yaml後的內容以下,仍是存在冪等性問題
- name: web server
remote_user: root
hosts: constrol
tasks:
- name: reinstall httpd
yum: name=httpd state=present
register: result
- name: stop httpd
service: name=httpd enabled=no state=stopped
when: result|failed
- name: remove httpd
yum: name=httpd state=absent
[root@node1 ~]# ansible-playbook web.yaml
PLAY [web server] *************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
ok: [192.168.21.230]
TASK: [reinstall httpd] *******************************************************
ok: [192.168.21.230]
ok: [192.168.21.234]
TASK: [stop httpd] ************************************************************
skipping: [192.168.21.234]
skipping: [192.168.21.230]
TASK: [remove httpd] **********************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
PLAY RECAP ********************************************************************
192.168.21.230 : ok=3 changed=1 unreachable=0 failed=0
192.168.21.234 : ok=3 changed=1 unreachable=0 failed=0
[root@node1 ~]# ansible constrol -m command -a 'rpm -q httpd'
192.168.21.234 | FAILED | rc=1 >>
package httpd is not installed
192.168.21.230 | FAILED | rc=1 >>
package httpd is not installed
[root@node1 ~]# ansible constrol -m command -a 'service httpd status'
192.168.21.234 | FAILED | rc=1 >>
httpd: unrecognized service
192.168.21.230 | FAILED | rc=1 >>
httpd: unrecognized service
[root@node1 httpd]# cat roles/web/tasks/main.yml 修改main.yml也是存在冪等性問題
- name: Install httpd
yum: name=httpd
tags: install
- name: start httpd
service: name=httpd enabled=yes state=started
- name: copy configuration file
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: copy
notify: restart httpd
- name: reinstall httpd
yum: name=httpd
register: result
tags: remove
- name: stop httpd
service: name=httpd enabled=no state=stopped
when: result|failed
- name: remove httpd
yum: name=httpd state=absent
[root@node1 httpd]# ansible-playbook apache.yml --skip-tags=copy,remove
PLAY [constrol] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.230]
ok: [192.168.21.234]
TASK: [web | Install httpd] ***************************************************
changed: [192.168.21.230]
changed: [192.168.21.234]
TASK: [web | start httpd] *****************************************************
changed: [192.168.21.230]
changed: [192.168.21.234]
TASK: [web | stop httpd] ******************************************************
fatal: [192.168.21.230] => |failed expects a dictionary
fatal: [192.168.21.234] => |failed expects a dictionary
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/root/apache.retry
192.168.21.230 : ok=3 changed=2 unreachable=1 failed=0
192.168.21.234 : ok=3 changed=2 unreachable=1 failed=0
[root@node1 httpd]# ansible constrol -m command -a 'service httpd status'
192.168.21.230 | success | rc=0 >>
httpd (pid 30191) is running...
192.168.21.234 | success | rc=0 >>
httpd (pid 14020) is running...
[root@node1 httpd]# cat roles/web/tasks/main.yml 修改仍是同樣存在問題
- name: Install httpd
yum: name=httpd
tags: install
- name: start httpd
service: name=httpd enabled=yes state=started
- name: copy configuration file
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: copy
notify: restart httpd
- name: reinstall httpd
yum: name=httpd
register: result
- name: stop httpd
service: name=httpd enabled=no state=stopped
when: result|failed
- name: remove httpd
yum: name=httpd state=absent
tags: remove
[root@node1 httpd]# ansible-playbook apache.yml -t remove
PLAY [constrol] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
ok: [192.168.21.230]
TASK: [web | remove httpd] ****************************************************
changed: [192.168.21.230]
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.230 : ok=2 changed=1 unreachable=0 failed=0
192.168.21.234 : ok=2 changed=1 unreachable=0 failed=0
[root@node1 httpd]# ansible constrol -m command -a 'rpm -q httpd'
192.168.21.230 | FAILED | rc=1 >>
package httpd is not installed
192.168.21.234 | FAILED | rc=1 >>
package httpd is not installed
這裏還有一個選項能夠用來測試語法的--syntax-check
[root@node1 ~]# ansible-playbook web.yaml --syntax-check
playbook: web.yaml
ERROR: multiple actions specified in task: 'service' and 'stop httpd'
[root@node1 ~]# cat web.yaml 再次修改web.yml
- name: web server
remote_user: root
hosts: constrol
tasks:
- name: reinstall httpd
yum: name=httpd state=present
register: result
- name: stop httpd
service: name=httpd enabled=no state=stopped
yum: name=httpd state=absent
when: result|failed
[root@node1 ~]# cat web.yaml 修改都提供了標籤,進行測試,執行多個任務就能夠把tags和任務對齊
- name: web server
remote_user: root
hosts: constrol
tasks:
- name: stop httpd
service: name=httpd enabled=no state=stopped
- name: remove httpd
yum: name=httpd state=absent
tags: remove
tasks:
- name: Install httpd
yum: name=httpd
- name: start httpd
service: name=httpd enabled=yes state=started
tags: install
[root@node1 ~]# ansible constrol -m command -a 'service httpd status'
192.168.21.234 | FAILED | rc=1 >>
httpd: unrecognized service
192.168.21.230 | FAILED | rc=1 >>
httpd: unrecognized service
[root@node1 ~]# ansible-playbook web.yaml --syntax-check
playbook: web.yaml
[root@node1 ~]# ansible-playbook web.yaml -t install
PLAY [web server] *************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.230]
ok: [192.168.21.234]
TASK: [Install httpd] *********************************************************
changed: [192.168.21.230]
changed: [192.168.21.234]
TASK: [start httpd] ***********************************************************
changed: [192.168.21.230]
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.230 : ok=3 changed=2 unreachable=0 failed=0
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
[root@node1 ~]# ansible constrol -m command -a 'service httpd status'
192.168.21.230 | success | rc=0 >>
httpd (pid 30814) is running...
192.168.21.234 | success | rc=0 >>
httpd (pid 14670) is running...
http://docs.ansible.com/YAMLSyntax.html下面有yaml語法,能夠查看一下
對roles/web/tasks/main.yml作切分,其餘內容未修改,以下:
roles/web/tasks/main.yml內容以下:
---
#file: main.yml
- include: install.yml
tags: install 經過在包含的yml文件處指定tags,這樣tags就能夠在前一個include包含的文件中的內容都生效
- include: remove.yml
tags: remove
- include: copy.yml
tags: copy
目錄爲:roles/web/tasks/
文件install.yml內容以下:
---
#file: install.yml
- name: install httpd
yum: name=httpd
- name: start httpd
service: name=httpd enabled=yes state=started
文件remove.yml內容以下: 冪等性問題已經剔除了
---
#file remove.yml
- name: stop httpd
service: name=httpd enabled=no state=stopped
- name: remove httpd
yum: name=httpd state=absent
文件copy.yml內容以下:
---
#file copy.yml
- name: copy configuration file
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
[root@node1 httpd]# ansible-playbook apache.yml -t remove 執行刪除httpd
PLAY [constrol] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
ok: [192.168.21.230]
TASK: [web | stop httpd] ******************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
TASK: [web | remove httpd] ****************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
PLAY RECAP ********************************************************************
192.168.21.230 : ok=3 changed=2 unreachable=0 failed=0
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
centos
修改一下配置文件httpd.conf端口進行測試有80到8080
[root@node1 httpd]# vim roles/web/files/httpd.conf
[root@node1 httpd]# ansible-playbook apache.yml -t copy
PLAY [constrol] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
ok: [192.168.21.230]
TASK: [web | copy cofiguration file] ******************************************
changed: [192.168.21.234] 這裏只把文件複製過去了
changed: [192.168.21.230]
ERROR: change handler (restart httpd) is not defined
[root@node1 httpd]# mv roles/web/handles roles/web/handlers 緣由是少了一handles少了一個r是handlers
[root@node1 httpd]# cat roles/web/handlers/main.yml
---
#file: handlers.yml
- name: restart httpd
service: name=httpd state=restarted
[root@node1 httpd]# ansible-playbook apache.yml -t copy 須要修改一下httpd.conf文件然後再執行
PLAY [constrol] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.230]
ok: [192.168.21.234]
TASK: [web | copy cofiguration file] ******************************************
changed: [192.168.21.230]
changed: [192.168.21.234]
NOTIFIED: [web | restart httpd] ***********************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
PLAY RECAP ********************************************************************
192.168.21.230 : ok=3 changed=2 unreachable=0 failed=0
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
發現ok了
案列經過role的方式定義安裝配置LAMP平臺,一個部署web和php,一臺部署db,而且經過腳本測試能夠連上mysql服務器。架構圖以下所示:
在node1上,建立3個角色httpd、mysql、php,在/etc/ansible/hosts文件中定義兩個組,內容以下所示:
[root@node1 ~]# cat /etc/ansible/hosts 修改hosts內容
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
# - Comments begin with the '#' character
# - Blank lines are ignored
# - Groups of hosts are delimited by [header] elements
# - You can enter hostnames or ip addresses
# - A hostname/ip can be a member of multiple groups
# Ex 1: Ungrouped hosts, specify before any group headers.
[lamp]
192.168.21.234
[dbserver]
192.168.21.234
192.168.21.230
[root@node1 ~]# mkdir program 建立項目目錄
[root@node1 ~]# mkdir -pv program/roles/{httpd/{handlers,tasks},mysql/{handlers,tasks},php/{handlers,tasks}}建立須要使用的目錄
mkdir: created directory `program/roles'
mkdir: created directory `program/roles/httpd'
mkdir: created directory `program/roles/httpd/handlers'
mkdir: created directory `program/roles/httpd/tasks'
mkdir: created directory `program/roles/mysql'
mkdir: created directory `program/roles/mysql/handlers'
mkdir: created directory `program/roles/mysql/tasks'
mkdir: created directory `program/roles/php'
mkdir: created directory `program/roles/php/handlers'
mkdir: created directory `program/roles/php/tasks'
[root@node1 ~]# tree program/ 查看建立的目錄樹
program/
└── roles
├── httpd
│?? ├── handlers
│?? └── tasks
├── mysql
│?? ├── handlers
│?? └── tasks
└── php
├── handlers
└── tasks
10 directories, 0 files
[root@node1 ~]# cd program/
[root@node1 program]# vim program.yml
[root@node1 program]# cat program.yml 建立program.yml,提供了3個角色,用了2個hosts
---
#file: program.yml
- hosts: lamp
remote_user: root
roles:
- apache
- php
- hosts: dbserver
remote_user: root
roles:
- mysql
[root@node1 program]# vim roles/httpd/tasks/main.yml
[root@node1 program]# cat roles/httpd/tasks/main.yml 提供各角色所需的文件,在此不解釋了,前面也有相關的內容
---
#file main.yml
- include: install.yml
tags: inshttpd
- include: copy.yml
tags: cyhttpd
- include: remove.yml
tags: remhttpd
[root@node1 program]# vim roles/httpd/tasks/install.yml
[root@node1 program]# cat roles/httpd/tasks/install.yml
---
#file: install.yml
- name: Install httpd
yum: name=httpd
- name: start httpd
service: name=httpd enabled=yes state=started
[root@node1 program]# cat roles/httpd/tasks/copy.yml
---
#file: copy.yml
- name: copy configuration file
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
[root@node1 program]# vim roles/httpd/tasks/remove.yml
[root@node1 program]# cat roles/httpd/tasks/remove.yml
---
#file: remove.yml
- name: httpd stop
service: name=httpd enabled=no state=stopped
- name: remove httpd
yum: name=httpd state=absent
[root@node1 program]# vim roles/mysql/tasks/main.yml
[root@node1 program]# cat roles/mysql/tasks/main.yml
---
#file: main.yml
- include: install.yml
tags: insmysql
- include: remove.yml
tags: remmysql
[root@node1 program]# vim roles/mysql/tasks/install.yml
[root@node1 program]# cat roles/mysql/tasks/install.yml
---
#file: install.yml
- name: Install mysql
yum: name=mysql-server
- name: start mysql
service: name=mysqld enabled=yes state=started
[root@node1 program]# vim roles/mysql/tasks/remove.yml
[root@node1 program]# cat roles/mysql/tasks/remove.yml
---
#file: remove.yml
- name: stopped mysql
service: name=mysqld enabled=no state=stopped
- name: remove mysql
yum: name=mysql-server state=absent
[root@node1 program]# vim roles/httpd/handlers/main.yml
[root@node1 program]# cat roles/httpd/handlers/main.yml
---
#file: main.yml
- name: restart httpd
service: name=httpd state=restarted
[root@node1 program]# vim roles/php/tasks/main.yml
[root@node1 program]# cat roles/php/tasks/main.yml
---
#file: main.yml
- include: install.yml
tags: insphp
- include: remove.yml
tags: remphp
[root@node1 program]# vim roles/php/tasks/install.yml
[root@node1 program]# cat roles/php/tasks/install.yml
---
#file: install.yml
- name: Install php
yum: name=php
- name: Install php-mysql
yum: name=php-mysql
[root@node1 program]# vim roles/php/tasks/remove.yml
[root@node1 program]# cat roles/php/tasks/remove.yml
---
#file: remove.yml
- name: remove php
yum: name=php state=absent
- name: remove php-mysql
yum: name=php-mysql state=absent
[root@node1 program]# tree .
.
├── program.yml
└── roles
├── httpd
│?? ├── handlers
│?? │?? └── main.yml
│?? └── tasks
│?? ├── copy.yml
│?? ├── install.yml
│?? ├── main.yml
│?? └── remove.yml
├── mysql
│?? ├── handlers
│?? └── tasks
│?? ├── install.yml
│?? ├── main.yml
│?? └── remove.yml
└── php
├── handlers
└── tasks
├── install.yml
├── main.yml
└── remove.yml
10 directories, 12 files
[root@node1 program]# mkdir roles/httpd/files
[root@node1 program]# cp /etc/httpd/conf/httpd.conf roles/httpd/files
最近的目錄和文件樹以下:
[root@node1 program]# tree .
.
├── program.yml
└── roles
├── httpd
│?? ├── files
│?? │?? └── httpd.conf
│?? ├── handlers
│?? │?? └── main.yml
│?? └── tasks
│?? ├── copy.yml
│?? ├── install.yml
│?? ├── main.yml
│?? └── remove.yml
├── mysql
│?? ├── handlers
│?? └── tasks
│?? ├── install.yml
│?? ├── main.yml
│?? └── remove.yml
└── php
├── handlers
└── tasks
├── install.yml
├── main.yml
└── remove.yml
11 directories, 13 files
[root@node1 program]# ansible-playbook program.yml --syntax-check 測試語法是否有誤
playbook: program.yml
ERROR: cannot find role in /root/program/roles/apache or /root/program/apache or /etc/ansible/roles/apache
[root@node1 program]# vim program.yml
[root@node1 program]# cat program.yml
---
#file: program.yml
- hosts: lamp
remote_user: root
roles:
- httpd 修改此處有原來的apache -> httpd,由於沒有apache角色
- php
- hosts: dbserver
remote_user: root
roles:
- mysql
[root@node1 program]# ansible-playbook program.yml --syntax-check 再次進行測試語法ok了
playbook: program.yml
清楚node3上的httpd
[root@node1 program]# ansible-playbook program.yml -t remhttpd
PLAY [lamp] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
TASK: [httpd | httpd stop] ****************************************************
changed: [192.168.21.234]
TASK: [httpd | remove httpd] **************************************************
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
安裝httpd
[root@node1 program]# ansible-playbook program.yml -t inshttpd
PLAY [lamp] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
TASK: [httpd | Install httpd] *************************************************
changed: [192.168.21.234]
TASK: [httpd | start httpd] ***************************************************
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
安裝php
[root@node1 program]# ansible-playbook program.yml -t insphp
PLAY [lamp] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
TASK: [php | Install php] *****************************************************
changed: [192.168.21.234]
TASK: [php | Install php-mysql] ***********************************************
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
安裝mysql
[root@node1 program]# ansible-playbook program.yml -t insmysql
PLAY [dbserver] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
ok: [192.168.21.230]
TASK: [mysql | Install mysql] *************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
TASK: [mysql | start mysql] ***************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
PLAY RECAP ********************************************************************
192.168.21.230 : ok=3 changed=2 unreachable=0 failed=0
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
查看端口啓用正常與否
[root@node1 program]# ansible lamp -m shell -a 'ss -tnlp|grep -E "80|3306"'
192.168.21.234 | success | rc=0 >>
LISTEN 0 50 *:3306 *:* users:(("mysqld",17964,11))
LISTEN 0 128 :::80 :::* users:(("httpd",17433,5),("httpd",17436,5),("httpd",17437,5),("httpd",17438,5),("httpd",17439,5),("httpd",17440,5),("httpd",17441,5),("httpd",17442,5),("httpd",17443,5))
[root@node1 program]# ansible dbserver -m shell -a 'ss -tnlp|grep 3306'
192.168.21.234 | success | rc=0 >>
LISTEN 0 50 *:3306 *:* users:(("mysqld",17964,11))
192.168.21.230 | success | rc=0 >>
LISTEN 0 50 *:3306 *:* users:(("mysqld",33420,11))
清除兩臺機器上剛安裝的服務
[root@node1 program]# ansible-playbook program.yml -t remhttpd
PLAY [lamp] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
TASK: [httpd | httpd stop] ****************************************************
changed: [192.168.21.234]
TASK: [httpd | remove httpd] **************************************************
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
[root@node1 program]# ansible-playbook program.yml -t remphp
PLAY [lamp] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
TASK: [php | remove php] ******************************************************
ok: [192.168.21.234]
TASK: [php | remove php-mysql] ************************************************
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.234 : ok=3 changed=1 unreachable=0 failed=0
[root@node1 program]# ansible-playbook program.yml -t remmysql
PLAY [dbserver] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.21.234]
ok: [192.168.21.230]
TASK: [mysql | stopped mysql] *************************************************
changed: [192.168.21.234]
changed: [192.168.21.230]
TASK: [mysql | remove mysql] **************************************************
changed: [192.168.21.230]
changed: [192.168.21.234]
PLAY RECAP ********************************************************************
192.168.21.230 : ok=3 changed=2 unreachable=0 failed=0
192.168.21.234 : ok=3 changed=2 unreachable=0 failed=0
發現都ok
安裝和啓動各遠程節點的服務,此處再也不演示
[root@node1 program]# vim index.php
[root@node1 program]# cat index.php
<?php
phpinfo();
?>
[root@node1 program]# ansible lamp -m copy -a 'src=index.php dest=/var/www/html/'
192.168.21.234 | success >> {
"changed": true,
"checksum": "26af88945e23289d15e128606a29932b3d78787c",
"dest": "/var/www/html/index.php",
"gid": 0,
"group": "root",
"md5sum": "62210a938d0199092c2d3976a45bf86d",
"mode": "0644",
"owner": "root",
"size": 22,
"src": "/root/.ansible/tmp/ansible-tmp-1427707616.78-214058087338938/source",
"state": "file",
"uid": 0
}
重啓一下httpd,在客戶端訪問192.168.21.234/index.php顯示