Ansible脚本使用roles模块编写lnmp

Roles 模块

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

roles的作用

●角色允许将复杂的剧本组织成独立的、更小的剧本和文件

●角色提供了一种从外部文件加载任务、处理程序和变量的方法

●角色也可关联和引用静态的文件和模板。

●角色可以编写成满足普通用途需求,并且能被重复利用

●定义角色的文件具有特定的名称,并以严格的目录结构进行组织。

roles的目录结构

cd /etc/ansible/

tree roles/

roles/

├── web/

│   ├── 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 文件,用于定义此角色的特殊设定及其依赖关系。

在一个 playbook 中使用 roles 的步骤

(1)创建以 roles 命名的目录

mkdir /etc/ansible/roles/ -p             #yum装完默认就有

 

(2)创建全局变量目录(可选)

mkdir /etc/ansible/group_vars/ -p

touch /etc/ansible/group_vars/all      #文件名自己定义,引用的时候注意

 

(3)在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql

mkdir /etc/ansible/roles/httpd

mkdir /etc/ansible/roles/mysql

 

(4)在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}

mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}

 

(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml

touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml

 

(6)修改 site.yml 文件,针对不同主机去调用不同的角色

vim /etc/ansible/site.yml

---

- hosts: webservers

  remote_user: root

  roles:

     - httpd

- hosts: dbservers

  remote_user: root

  roles:

     - mysql

 

(7)运行 ansible-playbook

cd /etc/ansible

ansible-playbook site.yml

示例使用roles安装lnmp

#首先创建roles的文件目录结构和文件

mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta} -p

mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p

mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p

 

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模块

写一个简单的tasks/main.yml

vim /etc/ansible/roles/nginx/tasks/main.yml
- name: set yum
  copy: src=/etc/ansible/roles/nginx/files/nginx.repo dest=/etc/yum.repos.d/nginx.repo
- name: yum nginx
  yum: name={{pkg}} state=latest
- name: set conf
  copy: src=/etc/ansible/roles/nginx/files/default.conf dest=/etc/nginx/conf.d/default.conf
- name: start nginx service
  service: name={{svc}} state=started enabled=yes                                          

定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: nginx
svc: nginx
 

在/etc/ansible/roles/nginx/files中准备nginx的yum文件和 default.conf配置文件(在别的主机安装复制过来)              
vim /etc/ansible/roles/nginx/files/nginx.repo                             #提前准备好nginx的yum源
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

Ansible脚本使用roles模块编写lnmp

Ansible脚本使用roles模块编写lnmp

Ansible脚本使用roles模块编写lnmp

编写mysql模块
vim /etc/ansible/roles/mysql/tasks/main.yml
- name: remove mariadb
  yum: name=mariadb* state=absent
- name: wget
  command: wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
- name: install mysql
  yum: name=mysql57-community-release-el7-10.noarch.rpm
- name: install mysql
  yum: name=mysql-community-server state=latest
- name: start mysqld service
  service: name=mysqld state=started enabled=yes
- name: genggai mima
  shell: mysqladmin -u root -p"$(grep "password" /var/log/mysqld.log | awk 'NR==1{print $NF}')" password 'Admin@123'
- name: shouquan
  shell: mysql -uroot -p'Admin@123' -e "grant all privileges on *.* to 'root'@'%' IDENTIFIED BY 'Admin@123';" -e "flush privileges;"
- name: remove mysql57
  yum: name=mysql57-community-release-el7-10.noarch state=absent

Ansible脚本使用roles模块编写lnmp

编写php模块
vim /etc/ansible/roles/php/tasks/main.yml
- name: download libargon2 epel epel
  shell: rpm -Uvh http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libargon2-20161029-3.el7.x86_64.rpm
  ignore_errors: true
- name: download libargon2 epel epel(1)
  shell: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  ignore_errors: true
- name: download libargon2 epel epel(2)
  shell: rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
  ignore_errors: true
- name: install php
  shell: yum -y install php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-pdo php72w-xml php72w-fpm php72w-mysqlnd php72w-opcache php72w-redis
  ignore_errors: true
- name: start php
  service: name=php-fpm state=started enabled=yes
- name: modify index.php
  copy: src=/etc/ansible/roles/php/files/index.php dest=/usr/share/nginx/html/index.php
vim /etc/ansible/roles/php/files/index.php                                         #编写首页文件
<?php
$link=mysqli_connect('192.168.150.5','root','Admin@123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>

Ansible脚本使用roles模块编写lnmp

编写roles示例
vim /etc/ansible/lnmp.yml
- hosts: lnmpservers
  remote_user: root
  roles:
    - nginx
    - mysql
    - php

cd /etc/ansible
ansible-playbook site.yml
web页面访问192.168.150.5/index.php

Ansible脚本使用roles模块编写lnmp

 

上一篇:Ansible playbook


下一篇:自动化运维管理工具 Ansible(姑娘常说:我想好好的可不可以,把我放在心尖上,可不可以我是你最在乎的人。)