roles(⻆⾊)
就是通過分別將variables, tasks及handlers等放置於單獨的⽬錄中,並可以便捷地調⽤它們的⼀種機制。假設我們要寫⼀個playbook來安裝管理lamp環境,那麼這個playbook就會寫很⻓。所以我們希望把這個很⼤的⽂件分成多個功能拆分, 分成apache管理,php管理,mysql管理,然後在需要使⽤的時候直接調⽤就可以了,以免重複寫。就類似編程⾥的模塊化的概念,以達到代碼復⽤的效果。如果以後要部署lnmp,那麼我們只需要再寫個nginx就好了。
roles目錄結構介紹
files:⽤來存放由copy模塊或script模塊調⽤的⽂件。
tasks:⾄少有⼀個main.yml⽂件,定義各tasks。
handlers:有⼀個main.yml⽂件,定義各handlers。
templates:⽤來存放jinjia2模板。
vars:有⼀個main.yml⽂件,定義變量。
meta:有⼀個main.yml⽂件,定義此⻆⾊的特殊設定及其依賴關係。
roles+playbook搭建lamp
#環境
centos7系統,VM虛擬機
#創建roles目錄結構
[root@manage01 ansible]# cd /etc/ansible/
[root@manage01 ansible]# mkdir -p roles/{httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
[root@manage01 ansible]# touch roles/{httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
#準備好需要替換的http配置文件和php主頁文件
#httpd.conf修改apache用戶爲lampuser phpinfo.php爲新創建<?php phpinfo();?>
[root@manage01 /]# scp -r [email protected]:/root/httpd.conf phpinfo.php /etc/ansible/roles/httpd/files/
#配置http角色
1、配置http變量
[root@manage01 vars]# cat /etc/ansible/roles/httpd/vars/main.yml
user: lampuser
2、配置調用模塊(常用於重啓服務,可被notify調用,類似java的方法)
[root@manage01 vars]# cat /etc/ansible/roles/httpd/handlers/main.yml
- name: restart apache
service: name=httpd state=restarted
3、配置httpd主模塊方法
- name: httpd軟件包安裝
yum: name={{item}} state=latest
with_items:
- httpd
- httpd-devel
- httpd-manual
- name: 創建apache管理賬戶lampuser
user: name={{user}} state=present
- name: 設置apache開機啓動,並啓動服務
service: name=httpd enabled=yes state=started
- name: 替換配置文件,初始化業務
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
#定義通知調用,當配置文件更新,需要重啓服務
notify:
- restart apache
- name: 拷貝php測試頁
copy: src=/etc/ansible/roles/httpd/files/phpinfo.php dest=/var/www/html/
#配置mysql角色
1、配置http變量
[root@manage01 vars]# cat /etc/ansible/roles/mysql/vars/main.yml
user: mysql
2、配置mysql主模塊方法
- name: mysql用戶創建
user: name={{user}} state=present
- name: mysql 軟件安裝
yum: name={{item}} state=latest
with_items:
- mariadb
- mariadb-server
- name: 啓動服務,並設置開機啓動
service: name=mariadb enabled=yes state=started
- name: 改變mysql文件的所有者爲mysql
file: path='/var/lib/mysql' owner={{user}} group={{user}} recurse=yes
#配置php角色
1、準備php-fpm配置文件(如有修改)
[root@manage01 files]# ls /etc/ansible/roles/php/files
www.conf
2、配置調用模塊
[root@manage01 handlers]# cat /etc/ansible/roles/php/handlers/main.yml
- name: restart php-fpm
service: name=php-fpm state=restarted
3、配置php主模塊方法
[root@manage01 php]# cat /etc/ansible/roles/php/tasks/main.yml
- name: 安裝php
yum: name={{item}} state=latest
with_items:
- php
- php-mysql
- php-gd
- php-ldap
- php-odbc
- php-pear
- php-xml
- php-xmlrpc
- php-mbstring
- php-snmp
- php-soap
- curl
- curl-devel
- php-bcmath
- php-fpm
- name: copy www.conf to /etc/php-fpm.d
copy: src=/etc/ansible/roles/php/files/www.conf dest=/etc/php-fpm.d force=yes
notify:
- restart php-fpm
#配置playbook調用roles
[root@manage01 web]# cat /opt/ansible/playbook/web/lamp.yaml
---
- hosts: group1
remote_user: root
roles:
- httpd
- mysql
- php
#執行
[root@manage01 yaml]# ansible-playbook -C lamp.yml
[root@manage01 yaml]# ansible-playbook lamp.yml
FAQ:
1、空格格式問題一定要注意,規範很嚴格
ERROR! A malformed block was encountered while loading a block
2、雖然提示user: name={{user}} 這個報錯,但是實際沒半毛關係,所以需要檢查全文。
[root@manage01 web]# ansible-playbook -C lamp.yaml
ERROR! conflicting action statements: yum, service
The error appears to be in '/etc/ansible/roles/mysql/tasks/main.yml': line 2, column 13, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
user: name={{user}} state=present
^ here
There appears to be both 'k=v' shorthand syntax and YAML in this task. Only one syntax may be used.
3、部署完成後訪問192.168.192.130/phpinfo.php沒有出現頁面,出現了文件內容
原因爲php-fpm配置文件/etc/php-fpm.d/www.conf所屬用戶和用戶組配置成apache了,應該是mysql的用戶,修改後重啓服務。
[root@node03 php-fpm.d]# systemctl restart httpd
[root@node03 php-fpm.d]# systemctl restart mysql
[root@node03 php-fpm.d]# systemctl restart mariadb