【Ansible】通过role角色部署lnmp架构

目录

一.roles概述

1.roles角色

2.roles的目录层次

2.1.roles 内各目录含义解释

二.实操

1.部署nginx

2.部署MySQL

3.部署php

4.编写测试文件

三.总结


一.roles概述

1.roles角色

可以把playbook剧本里的每个play看作为一个角色,将每个角色要用到的文件、变量、任务列表定

义到对应角色的目录中,需要时可以直接在playbook中调用角色

作用

实现在playbook中代码复用

2.roles的目录层次

cd /etc/ansible/
tree roles/
roles/
├── web/    #相当于 playbook 中的 每一个 play 主题
│   ├── files/       #用来存放由 copy 模块或 script 模块调用的文件。
│   ├── templates/   #用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
│   ├── tasks/       #此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
│   ├── handlers/    #此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
│   ├── vars/        #此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
│   ├── defaults/    #此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。 这些变量具有所有可用变量中最低的优先级,并且可以很容易地被任何其他变量覆盖。所以生产中我们一般不在这里定义变量
│   └── meta/        #此目录应当包含一个 main.yml 文件,用于定义此角色的元数据信息及其依赖关系。 
└── db/
    ├── files/
    ├── templates/
    ├── tasks/
    ├── handlers/
    ├── vars/
    ├── defaults/
    └── meta/

2.1.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 文件,用于定义此角色的元数据信息及其依赖关系

二.实操

1.部署nginx

cd /opt
mkdir nginx
cd nginx/
上传nginx.repo、nginx.conf,并且修改nginx.conf为nginx.conf.j2
vim nginx.conf.j2
37、38行
listen       {{nginx_addr}}:{{nginx_port}};
         server_name  {{nginx_hostname}};
45行
root   {{root_dir}};
68行
fastcgi_pass   {{php_addr}}:{{php_port}};
70行
fastcgi_param  SCRIPT_FILENAME  {{root_dir}}$fastcgi_script_name;

vim lnmp-playbook.yaml
- name: nginx play
  hosts: webservers
  remote_user: root
  gather_facts: false
  vars:
  - nginx_addr: 192.168.80.101
  - nginx_port: 80
  - nginx_hostname: www.xy101.com
  - root_dir: /var/www/html
  - php_addr: 192.168.80.102
  - php_port: 9000
  tasks:
  - name: disable firewalld
    service: name=firewalld state=stopped enabled=no
  - name: disable selinux
    command: 'setenfoce 0'
    ignore_errors: true
  - name: copy nginx repo
    copy: src=/opt/nginx/nginx.repo dest=/etc/yum.repos.d/
  - name: install nginx
    yum: name=nginx state=latest
  - name: create root dir
    file: path={{root_dir}} state=directory
  - name: copy nginx config template file
    template: src=/opt/nginx/nginx.conf.j2 dest=/etc/nginx/nginx.conf
    notify: 'reload nginx'
  - name: create nfs config
    copy: content="{{root_dir}} 192.168.80.0/24(rw,sync,no_root_squash)" dest=/etc/exports
  - name: restart rpcbind,nfs,nginx
    service: name={{item}} state=restarted enabled=yes
    with_items:
    - rpcbind
    - nfs
    - nginx
 
  handlers:
  - name: reload nginx
    service: name=nginx state=reloaded
 
ansible-playbook lnmp-playbook.yaml

2.部署MySQL

- name: mysql play
  hosts: dbservers
  remote_user: root
  gather_facts: false
  tasks:
  - name: disable mysql_server firewalld
    service: name=firewalld  state=stopped  enabled=no
  - name: disable mysql_server selinux
    command: 'setenforce 0'
    ignore_errors: true
  - name: remove mariadb
    yum: name=mariadb*  state=absent
  - name: copy mysql repo
    copy: src=/opt/mysql/mysql-community.repo  dest=/etc/yum.repos.d/
  - name: modify mysql repo
    replace: path=/etc/yum.repos.d/mysql-community.repo  regexp="gpgcheck=1"  replace="gpgcheck=0"
  - name: install mysql
    yum: name=mysql-server state=present
  - name: start mysql
    service: name=mysqld  state=started  enabled=yes
  - name: init mysql
    script: '/opt/mysql/mysql-init.sh'

3.部署php

- name: php play
  hosts: phpservers
  remote_user: root
  gather_facts: false
  vars:
  - php_username: nginx
  - php_addr: 192.168.80.102:9000
  - nginx_addr: 192.168.80.101
  - root_dir: /var/www/html
  tasks:
  - name: disable php_server firewalld
    service: name=firewalld  state=stopped  enabled=no
  - name: disable php_server selinux
    command: 'setenforce 0'
  - name: unarchive php tar pkg
    unarchive: copy=yes  src=/opt/php/php.tar.gz  dest=/mnt/
  - name: copy local repo
    copy: src=/opt/php/local.repo  dest=/etc/yum.repos.d/
  - name: create repo
    shell: 'createrepo /mnt && yum clean all && yum makecache'
  - name: install php
    yum: name=php72w,php72w-cli,php72w-common,php72w-devel,php72w-embedded,php72w-gd,php72w-mbstring,php72w-pdo,php72w-xml,php72w-fpm,php72w-mysqlnd,php72w-opcache,php72w-ldap,php72w-bcmath  state=present
  - name: create php user
    user: name={{php_username}}  shell=/sbin/nologin  create_home=no
  - name: modify php.ini
    replace: path=/etc/php.ini  regexp=";date.timezone ="  replace="date.timezone = Asia/Shanghai"
  - name: modify user and group in www.conf
    replace: path=/etc/php-fpm.d/www.conf  regexp="apache"  replace="{{php_username}}"
    notify: "reload php-fpm"
  - name: modify listen in www.conf
    replace: path=/etc/php-fpm.d/www.conf  regexp="127.0.0.1:9000"  replace="{{php_addr}}"
    notify: "reload php-fpm"
  - name: modify listen.allowed_clients in www.conf
    replace: path=/etc/php-fpm.d/www.conf  regexp="127.0.0.1"  replace="{{nginx_addr}}"
    notify: "reload php-fpm"
  - name: start php-fpm
    service: name=php-fpm  state=started  enabled=yes
  - name: create www root dir
    file: path={{root_dir}}  state=directory
  - name: mount nfs
    mount: src="{{nginx_addr}}:{{root_dir}}"  path={{root_dir}}  fstype=nfs  state=mounted  opts="defaults,_netdev"
  handlers:
  - name: reload php-fpm
    service: name=php-fpm  state=reloaded

4.编写测试文件

cd /var/www/html
vim index.php

<?php
phpinfo();
?>

浏览器访问测试

三.总结

roles目录格式
 

roles/                    #角色总目录,其每个子目录就是一个角色目录
  nginx/                     #角色目录,一个角色相当于playbook中的一个play主题,目录名就是角色名
    files/                       #存放copy、script、unarchive等模块默认调用的文件
	templates/                   #存放template模块默认调用的模板文件
	tasks/mian.yml               #定义此角色的tasks任务列表
	handlers/mian.yml            #定义此角色通过nofity触发执行的handlers任务列表
	vars/mian.yml                #定义此角色使用的自定义变量
	defaults/mian.yml            #定义此角色使用的默认变量(一般不用)
	meta/mian.yml                #定义此角色的元数据信息和依赖关系
  mysql/
    ....
  php/
    ....

vim XXX.yaml
- name:
  hosts:
  remote_user:
  roles:
  - 角色名1
  - 角色名2
  ....

ansible-playbook XXX.yaml
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 安装ansible 在一台主控机上安装ansible,并将需要部署的目标机器的IP地址加入到ansible的hosts文件中。 2. 编写playbook 使用yaml格式编写ansible playbook文件,包括以下任务: - 安装Nginx、MySQL和PHP - 修改Nginx配置文件,配置虚拟主机和反向代理 - 修改MySQL配置文件,设置root密码和字符集 - 部署PHP应用程序文件和配置文件 示例playbook文件如下: ```yaml --- - hosts: webservers become: true tasks: - name: Install packages yum: name: "{{ item }}" state: present with_items: - nginx - mysql - mysql-server - php - php-mysql - php-fpm - name: Start services service: name: "{{ item }}" state: started enabled: true with_items: - nginx - mysqld - php-fpm - name: Configure Nginx copy: src: files/nginx.conf dest: /etc/nginx/nginx.conf notify: - Reload Nginx - name: Configure MySQL copy: src: files/my.cnf dest: /etc/my.cnf notify: - Restart MySQL - name: Deploy PHP application copy: src: files/php_app dest: /usr/share/nginx/html - name: Configure PHP copy: src: files/php.ini dest: /etc/php.ini notify: - Restart PHP-FPM handlers: - name: Reload Nginx service: name: nginx state: reloaded - name: Restart MySQL service: name: mysqld state: restarted - name: Restart PHP-FPM service: name: php-fpm state: restarted ``` 3. 准备文件 将需要部署的应用程序文件和配置文件打包成tar.gz文件,并放置在主控机上。 4. 执行playbook 在主控机上执行ansible-playbook命令,指定playbook文件和目标机器的IP地址,以及需要部署的应用程序文件和配置文件的路径。 ```bash ansible-playbook -i hosts playbook.yml --extra-vars "app_file=/path/to/app.tar.gz" ``` 5. 验证部署 访问Nginx的虚拟主机地址,验证应用程序是否正常运行。同时,使用MySQL客户端连接数据库,验证数据库是否正常运行并包含正确的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值