自动化运维工具Ansible----------5通过playbook安装管理LNMP

1、yum 安装LNMP环境

首先我们可以在ansible服务器上安装LNMP环境,然后再将配置文件通过ansible拷贝到远程主机上

1.1、安装nginx软件

yum -y install nginx      #通过aliyun和epel源安装

systemctl start nginx

测试访问nginx的默认测试页:http://192.168.1.3

1.2、安装mysql

yum -y install mariadb-server mariadb

mkdir -p /data/mysql/data           #创建数据库存放目录

chown -R mysql:mysql /data/mysql/   #修改权限

vim /etc/my.cnf          #修改数据保存目录

 

启动mysql

systemctl start mariadb

1.3、安装PHP和PHP-mysql模块和php-fpm模块

yum -y install php php-mysql php-fpm

systemctl start php-fpm

提供php的测试页

vim /usr/share/nginx/html/index.php

<?php

phpinfo();

?>

修改nginx。conf,支持php访问

vim /etc/nignx/nginx.conf   #在server{}中增加标红部分的内容

user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {

    worker_connections 1024;

}

http {

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;

    tcp_nopush          on;

    tcp_nodelay         on;

    keepalive_timeout   65;

    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;

    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {

        listen       80 default_server;

        listen       [::]:80 default_server;

        server_name  _;

        root         /usr/share/nginx/html;

        index index.php index.html;

        include /etc/nginx/default.d/*.conf;

        location / {

        }

        location ~ .*\.(php|php5)?$ {

            fastcgi_pass 127.0.0.1:9000;

            fastcgi_index index.php;

            include fastcgi.conf;

        }

        error_page 404 /404.html;

            location = /40x.html {

        }

        error_page 500 502 503 504 /50x.html;

            location = /50x.html {

        }

    }

}

重启nginx服务

systemctl restart nginx

测试

2、roles角色

roles相当于我们剧本中的角色,每个角色都有不同的事情要做,也正是分工才体现出了每个角色的不同作用,当你需要做不同的事情时,只需要调用不同的角色即可

总结:

roles角色:以特性的层级目录结构进行组织的tasks、variables、handlers、templates、files、等相当于函数的调用吧各个时间切割成片段来执行

2.1、基于角色的方式部署LNMP

当我们在做一个自动化部署的案例时,往往不会使用默认的配置项以及配置文件,都会单独创建自己的配置文件,也会根据功能的不同,划分出不同的目录,因此,一个成熟的ansible项目会具备自己所需求的结构

ansible.cfg 对于整个项目的配置文件

hosts 定义主机的配置文件

roles 定义角色的目录(名字不能修改)

prepare 角色目录

nginx 角色目录

mysql 角色目录

php 角色目录

role_name/     #在相关角色目录下通常要创建如下目录

files/:存储由copy或script等模块调用的文件,例如存放需要同步到远程服务器的源码文件及配置文件等。

tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;

handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;例如当服务的配置文件发生变化时需要进行的操作,比如:重启服务,重新加载配置文件。

vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;

templates/:存储由template模块调用的模板文本。如用于执行lnmp相关配置文件的模板文件。

meta/:角色定义,可留空。此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;

site.yml 整个项目的入口文件

webserver.yml webserver分支的入口文件

注:这些目录、文件都需要自己创建

2.2、创建相关目录

mkdir -p /ansible/lnmp/roles/{prepare,nginx,mysql,php}/{tasks,files,templates,vars,meta,handlers}

touch /ansible/lnmp/{ansible.cfg,hosts,site.yml,webserver.yml

2.3、设置ssh免密设置

ssh-keygen 

ssh-copy-id root@192.168.1.4

ssh-copy-id root@192.168.1.5

2.4、定义hosts

vim /ansible/lnmp/hosts

说明:

是不是突然发现了一个不一样的组[lnmp:children],它的意思是,lnmp组由别的组成,具体成员是其他组的组名,这样当调用lnmp组时就会调用其他组内的组员了,同时要注意,lnmp组里的组员,要在lnmp之前声明。

测试主机连通性

ansible -m ping  lnmp

       发现出现警告,原因是在执行命令是无法找到lnmp组,因为我们默认是用的是/etc/ansible/hosts文件,这个文件中并没有定义lnmp组,我们的lnmp组存在于我们ansible项目根目录(/ansible/lnmp/)的hosts文件内,如果想使用/ansible/lnmp/路径下的hosts文件,需要修改ansible.cfg配置文件,修改成这样:

vim /ansible/lnmp/ansible.cfg

[defaults]

host_key_checking = True

inventory = ./hosts

       注意,如果要使用相对路径,或者要使用非/etc/ansible/ansible.cfg,则必须要在项目的根目录下执行命令

       然后进行测试:

ansible执行程序时查找文件的顺序是ANSIBLE_CONFIG(环境变量)-》ansible.cfg(当前目录)-》~/.ansible.cfg(家目录中的)-》/etc/ansible/ansible.cfg

2.5、配置site.yml

配置文主机,接下来就要开始写roles以及palybook,斯特。yml文件是一切任务的入口文件,因此我们从site.yml开始写

vim /etc/ansible/lnmp/site.yml

---

- import_playbook: webserver.yml

Import_playbook意为包含webserver.yml这个文件,当执行到site.yml文件中的这一行时,就会跑去执行webserver.yml里面的内容,这样我们的项目将会更加模块化,利于管理

2.7、webserver.yml,创建prepare角色

webserver.yml当中又要写些什么呢?webserver当中写的是要完成对应的模块功能需要的角色,也就是需要什么样的Role。

例如:我们要完成lnmp项目的第一个role,也就是prepare角色(prepare角色主要任务是:远程主机配置yum源,关闭防火墙,关闭selinux),webserver.yml文件内容如下

roles列表中的prepare是指,我们要执行prepare整个role,骂我们就需要在roles整个目录下创建一个叫prepare的文件加,保证我们的role能够执行,我们roles选项下的名称就是我们在roles目录中文件夹的名称

对于图上其他内容说明,gather_facts: True开启收集主机静态信息,如版本号,操作系统内容等,tags: prepare,对当前内容进行标记,也就是打标签,在执行时可以使用标签从指定位置开始向下执行,为测试节省时间

 prepare内容说明,存在两个目录,一个是tasks,执行对应任务的目录,一个是templates,进行模版文件复制的目录

 当执行到对应的Role时,Ansbile就会调用对应Role目下的Playbook,也就是调用我们的tasks,所以我们在对应的Role目录下都会存在一个叫做tasks的目录

tasks目录当中文件说明,main.yml,任务文件的入口文件,执行任务时从此文件开始执行,yum.yml、firewalld.yml、selinux.yml完成对应功能的目录

 文件说明:

main.yml:task执行的入口文件

yum.yml:用于配合yum源

firewalld.yml:关闭防火墙

selinux:关闭selinux

在执行tasks时,Ansible默认会找对应tasks下的main.yml文件,这个文件也就是我们说的tasks的入口文件,所有tasks都是从这个文件开始执行的,所以main.yml文件名不能改变。在main.yml当中我们写入我们要执行的内容即可

在main.yml文件中写以下内容

对于关键字段说明:

import_tasks字段,是在main.yml文件当中导入相关功能文件的内容,来执行相关文件name字段,相当于对执行任务的说明

yum.yml文件要执行的内容

firewalld.yml文件要执行的内容 

selinux.yml文件要执行的内容

       对于关键字段说明:

       template字段,指定模版文件,该文件必须存在于prepare角色目录下的templates目录中,起名需要加上.j2结尾,将templates下的文件复制到对应主机的对应目录下,src指定源文件,dest指定目标目录及复制到目录后改成什么名字。

       生成selinux配置文件的模板,并修改模板文件,永久禁用selinux

      cp /etc/selinux/config /ansible/lnmp/roles/prepare/templates/config.j2

      vim /ansible/lnmp/roles/prepare/templates/config.j2

SELINUX=disabled  #将enforcing改为disabled

       测试结果,需要再次注意,执行ansible-playbook时,需要到ansible项目的根目录下执行

如果上述结果没有红色字体,体现出对应的errors字段,说明我们执行的任务无问题。

到此为止我们对于项目的雏形已经有了,下面就是我们继续完善我们的项目,首先,在webserver.yml文件将我们要干的事情,全部用角色的身份填写完毕,然后注释掉暂时不执行的内容,以便后续修改

3、构建nginx角色

Nginx角色说明,在nginx目录中除了和prepare目录中一样,具备的tasks和templates以外,还多一个目录叫做handlers,该目录使用来执行notify,handler功能的,后续说明该功能。另外还会用到files和vars目录

3.1、配置nginx的tasks

tasks,templates下目录内容和prepare一样,就不再详细说明,只看内容即可,tasks当中的内容查看

目录结构和功能与prepare类似,不在说明,查看文件内容

main.yml文件内容如下:

 install.yml文件内容如下:

 

config.yml文件内容如下

 

说明:

       Ansible的template模块。该模块和copy模块作用基本一样,都是把某个文件复制到远端主机上,但是区别在于template模块可以获取变量的值,而copy则是原封不动的把文件内容复制过去。

       notify模块,在是在做消息通知,notify上面的内容如果执行成功,就会发出消息,通知notify下方的内容执行,如果上面的内容没有执行,就不会通知下面的内容,如何判断是否执行就看执行过程的返回结果,是changed还是ok,changed是执行了,ok是没执行。

 webpage.yml文件内容如下

 3.2、扩展notify和handlers

1、handlers:由特定条件触发的Tasks

- name: TASK_NAME

 module: arguments

 notify: HANDLER_NAME   #notify触发handlers

handlers:

- name: HANDLER_NAME

 module: arguments

 例如:

notify:这个action(行动)可用于在每个play的最后被触发,这样可以避免多次由改变发生时,每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性的执行指定操作

 在notify中列出的操作称为handlers,也即notify中调用handlers中定义的操作。例子:看标红

---

- name: test.yml just for test 

    hosts: testserver 

    vars:   

        region: ap-southeast-1 

    tasks:   

        - name: template configuration

         template: src=template.j2 dest=/etc/foo.conf     

    notify:         

        - restart memcached

   - restart apache 

     handlers:   

         - name: restart memcached     

           service: name=memcached state=restarted   

         - name: restart apache     

           service: name=apache state=restarted

handiers概述:

handlers也是一些task(任务)的列表,通过名字来引用,他们和一般的任务并没有什么区别

handilers是由通知者进行notity。如果没有被notify,handlers不会执行

不管有多少个通知者进行notify,等play中的所有task执行完成之后handiers也只是执行一次

handlers最佳的应用场景来重启服务,或者触发系统重启操纵。除此以外很少用到了
 

3.3、复制相应的安装包和模板到对应目录下

vim /ansible/lnmp/roles/nginx/files/testdb.php

 

 cp /usr/share/nginx/html/index.php /ansible/lnmp/roles/nginx/files/

cp /etc/nginx/nginx.conf /ansible/lnmp/roles/nginx/templates/nginx.conf.j2

3.4、根据需要修改nginx的配置文件模板。

3.5、构建nginx的handlers目录和vars/下的main.yml文件

vim /ansible/lnmp/roles/nginx/handlers/main.yml

vim /ansible/lnmp/roles/nginx/vars/main.yml

 打开wedserver.yml的nginx角色注释

执行测试: cd /ansible/lnmp

ansible-palybook site.yml -t nginx

 4、构建php角色

构建php任务,这里我们只用到了tasks,templates和handlers目录,tasks当中的内容查看

 

 4.1、配置php的tasks

main.yml文件内容

install.yml文件内容

 

 4.2、扩展:循环语句

循环:迭代,需要重复执行的任务;对迭代项的引用,固定变量名为"item”,使用with_items属性给定要迭代的元素。

元素:要迭代的元素可以是字符串、字典

基于字符串列表给出元素示例

- name: install packages

 yum: name={{ item }} state=latest

 with_items:

   - httpd

   - php

   - php-mysql

   - php-mbstring

   - php-gd

基于字典列表给元素示例:

- name: create groups

 group: name={{ item }} state=present

 with_items:

   - groupx1

   - groupx2

   - groupx3

- name: create users

 user: name={{ item.name }} group={{ item.group }} state=present

 with_items:

   - {name: 'userx1', group: 'groupx1'}

   - {name: 'userx2', group: 'groupx2'}

   - {name: 'userx3', group: 'groupx3'}

config.yml文件内容

 4.4、复制相应的安装包和模板到对应目录下

cp /etc/php.ini /ansible/lnmp/roles/php/templates/php.ini.j2

cp /etc/php-fpm.conf /ansible/lnmp/roles/php/templates/php-fpm.conf.j2

cp /etc/php-fpm.d/www.conf /ansible/lnmp/roles/php/templates/www.conf.j2

4.5、创建php的handlers目录下的main.yml文件

打开php角色的注释

然后执行测试

 测试访问页

 

 5、构建MySQL角色

构建mysql任务,这里我们只用到了tasks,templates和handlers目录,tasks当中的内容查看

创建yml文件

 5.1、配置mysql的 tasks

打开webserver.ymli的mysql角色注释

配置main.yml文件内容

 配置install.yml文件

说明:

我们发现在安装数据库的同时,安装了一个叫装MySQL-python的包,这个包是在我们即将配置mysql时使用的,因为我们在配置mysql时调用了Ansible的mysql模块,所以需要由这个包对我们的操作进行支持,没有这个包我们无法使用Ansible的mysql模块。

config.yml文件内容

配置config.yml文件内容

 

说明:

其他模块在前面已经说明过了,不再进行赘述,主要介绍涉及的新模块,分别是mysql_db,mysql_user模块

mysql_db模块,对数据库当中的数据库进行操作,可以帮助我们完成create,drop,show等针对数据库的操作。

mysql_user模块,针对于数据库当中用户进行操作,可以帮助我们完成,create,delete,select,grant等对于用户的操作。

如果我们要操作数据库,那必不可少的过程是要登录数据库,对于这点,如果手动执行登录命令,复杂且不好管理,还好Ansible提供了数据库相关模块,对于数据库的操作,我们只需要调用相关模块即可

在调用mysql_db和mysql_user时,统一会用到的参数login_host,login_user,login_password,login_port都是在指定登录时相关信息。

对于mysql_db模块来说,name指定是数据库名,encoding指定创建数据库或操作数据库时使用的字符集,state是指对数据库进行什么样的操作,persent相当于创建数据库,import的是导入数据库,导入数据时使用的数据库文件由target指定,那么如果你想删除一个数据库,只需要将state由persent改成asbent。

在调用mysql_user模块时,我们除了使用了登录的参数外,还有几个额外的参数,name创建或者操作用户时指定用户名,password指定创建用户的密码,host指定创建的用户能在哪里登录,priv指定创建出来的用户具备什么样的权限,state当中作用就和数据库一样了,persent表示创建,absent表示删除

对mysql_user模块的priv书写方式为 “在哪个数据库上.对哪个表:有什么权限”的方式书写,举例:“*.*:all”表示,对所有数据库当中的所有表具备所有权限

5.3、复制相应的安装包和模板到对应的目录下

cp /etc/my.cnf /ansible/lnmp/roles/mysql/templates/my.cnf.j2

 vim /ansible/lnmp/roles/mysql/templates/my.cnf.j2

[mysqld]

datadir=/data/mysql/data  #修改此行,其他参数保持默认即可

5.4、构建MySQL的handlers目录下的main.yml文件

 

测试:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值