文章目录
playbook二
Roles模块
-
角色的作用:把playbook剧本中的各个play看作为角色,将各个角色的task任务、vars变量、templates模板、files文件等内容放置到角色的目录中统一管理,需要的时候可在playbook中直接使用roles调用,所以roles可以实现playbook代码的复用
-
roles用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include它们的一种机制。roles一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。 -
假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成haproxy服务器,第三个要配置成MySQL(mariadb)服务器。我们如何来定义playbook?
第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建haproxy。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调用。比如说后来又加进来一个主机,这第3个主机既是httpd服务器,又是haproxy服务器,我们只能写第3个play,上面写上安装httpd和haproxy。这样playbook中的代码就重复了。
为了避免代码重复,可以定义一个角色叫httpd,第二个角色叫haproxy,并使用roles实现代码重复被调用。//roles 的目录结构:
cd /etc/ansible/
tree roles/
roles/
├── web/ #相当于 playbook 中的 每一个 play 主题
│ ├── files/
│ ├── templates/
│ ├── tasks/
│ ├── handlers/
│ ├── vars/
│ ├── defaults/
│ └── meta/
└── db/
├── files/
├── templates/
├── tasks/
├── handlers/
├── vars/
├── defaults/
└── meta/roles 内各目录含义解释
●files
用来存放由 copy 模块或 script 模块调用的文件。●templates
用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。●tasks
此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。●handlers
此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。●vars
此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。●defaults
此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。 这些变量具有所有可用变量中最低的优先级,并且可以很容易地被任何其他变量覆盖。所以生产中我们一般不在这里定义变量●meta
此目录应当包含一个 main.yml 文件,用于定义此角色的元数据信息及其依赖关系。
roles模式安装LNMP
###在 roles 目录中分别创建以各角色名称命名的目录,如 httpd、mysql
mkdir /etc/ansible/roles/nginx
mkdir /etc/ansible/roles/mysql
mkdir /etc/ansible/roles/php
###在每个角色命名的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建
mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta}
###在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名
touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
创建nginx
files目录
###files 目录中,准备需要的文件
index.php
nginx.repo
### index.php
<?php
phpinfo();
?>
# nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
handlers目录
### handlers目录中
修改 main.yml 配置文件
- name: reload nginx
service: name={{service}} state=reloaded
tasks目录
###在 tasks 目录中
##有两个 yml 文件
main.yml 和 init.yml (关闭防火墙的yum文件)
### init.yml
- name: disable firewalld
service: name=firewalld state=stopped enabled=no
- name: disable selinux
shell: "/usr/sbin/setenforce 0"
ignore_errors: true
### main.yml
- include: "init.yml"
- name: copy nginx.repo
copy: src=nginx.repo dest=/etc/yum.repos.d/
- name: install nginx
yum: name={{service}} state=latest
- name: copy index.php
copy: src=index.php dest={{root_dir}}
- name: copy nginx.conf
template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
notify: reload nginx
- name: start nginx
service: name={{service}} state=started enabled=yes
templates目录
##templates目录 中存放 nginx 的 j2 的配置文件模板
##修改几行
listen {{http_port}};
server_name {{http_hostname}};
root {{root_dir}};
location ~ \.php$ {
root {{root_dir}};
fastcgi_pass {{http_remote}};
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME {{root_dir}}$fastcgi_script_name;
include fastcgi_params;
}
vars目录
## 在 vars目录中定义模板文件的变量值
vim main.yml
http_port: 192.168.242.67:80
http_hostname: www.ggl.com
root_dir: /usr/share/nginx/html
http_remote: 192.168.242.69:9000
service: nginx
创建mysql
tasks目录
##在目录中创建 init.yml 和 main.yml 文件
### init.yml
- name: disable firewalld
service: name=firewalld state=stopped enabled=no
- name: disable selinux
shell: "/usr/sbin/setenforce 0"
ignore_errors: true
### main.yml
- include: "init.yml"
- name: yum remove mariadb
yum: name=mariadb* state=absent
- name: install rpm
shell: wget -P /etc/yum.repos.d/ http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
ignore_errors: true
- name: install noarch.rpm
shell: yum -y install /etc/yum.repos.d/mysql57-community-release-el7-10.noarch.rpm
ignore_errors: true
- name: replace wprd
replace: path=/etc/yum.repos.d/mysql-community.repo regexp='gpgcheck=1' replace='gpgcheck=0'
ignore_errors: true
- name: install mysql
yum: name="mysql-server"
- name: start mysqld
service: name=mysqld state=started enabled=yes
- name: login
shell: mysql -uroot -p"$(grep "password" /var/log/mysqld.log | awk 'NR==1 {print $NF}')" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123';"
ignore_errors: true
- name: grantmysql
shell: mysql -uroot -pAdmin@123 -e "grant all privileges on *.* to root@'%' identified by 'Admin@123' with grant option;"
ignore_errors: true
创建php
files目录
##准备 index.php文件和www.conf文件
###index.php文件
#在验证php的创建结果时,使用
<?php
phpinfo();
?>
##在验证数据库连接时,使用
<?php
$link=mysqli_connect('192.168.242.68','root','Admin@123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
###修改www.conf文件
##主要修改几行配置文件
user = php
group = php
listen = 192.168.242.69:9000
listen.allowed_clients = 192.168.242.67
handlers目录
##修改配置文件
vim main.yml
- name: reload php
service: name={{service}} state=reloaded
tasks目录
##创建 init.yml和main.yml文件
## 修改 init.yml文件
- name: disable firewalld
service: name=firewalld state=stopped enabled=no
- name: disable selinux
shell: "/usr/sbin/setenforce 0"
ignore_errors: true
### main.yml 文件
- include: "init.yml"
- name: install yum repo
shell: "rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm"
ignore_errors: true
- name: install php
with_items:
- php72w
- php72w-cli
- php72w-common
- php72w-devel
- php72w-embedded
- php72w-gd
- php72w-mbstring
- php72w-pdo
- php72w-xml
- php72w-fpm
- php72w-mysqlnd
- php72w-opcache
yum: name={{item}}
- name: create php user
user: name={{user_name}}
- name: create php group
group: name={{user_name}}
- name: create web dir
file: name={{root_dir}} state=directory
- name: copy index.php
copy: src=index.php dest={{root_dir}}
- name: modify php.ini
template: src=php.ini.j2 dest=/etc/php.ini
notify: reload php
- name: copy www.conf
copy: src=www.conf dest=/etc/php-fpm.d/www.conf
#- name: modify www.conf
# template: src=www.conf.j2 dest=/etc/php-fpm.d/www.conf
# notify: reload php
- name: start php
service: name={{service}} state=started enabled=yes
templates目录
## php.ini.j2 配置文件模板
###修改几行
1097行
mysqli.default_socket = {{mysql_dir}}
877行
date.timezone = {{timezone}}
vars目录
vim main.yml
service: php-fpm
timezone: Asia/Shanghai
user_name: php
http_port: 192.168.242.69:9000
remote_addr: 192.168.242.67
root_dir: /usr/share/nginx/html
mysql_dir: /var/lib/mysql/mysql.sock
创建LNMP剧本文件
vim lnmp.yaml
- name: nginx play
hosts: webservers
remote_user: root
roles:
- nginx
- name: mysqp play
hosts: dbservers
remote_user: root
roles:
- mysql
- name: php play
hosts: phpservers
remote_user: root
roles:
- php