3.playbook剧本二

文章目录

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


相关推荐
编程乐学(Arfan开发工程师)1 小时前
06、基础入门-SpringBoot-依赖管理特性
android·spring boot·后端
androidwork1 小时前
使用 Kotlin 和 Jetpack Compose 开发 Wear OS 应用的完整指南
android·kotlin
繁依Fanyi2 小时前
Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记
android·前端·css·编辑器·codebuddy首席试玩官
奔跑吧 android4 小时前
【android bluetooth 框架分析 02】【Module详解 6】【StorageModule 模块介绍】
android·bluetooth·bt·aosp13·storagemodule
田一一一8 小时前
Android framework 中间件开发(三)
android·中间件·framework·jni
androidwork13 小时前
掌握 Kotlin Android 单元测试:MockK 框架深度实践指南
android·kotlin
田一一一13 小时前
Android framework 中间件开发(二)
android·中间件·framework
追随远方13 小时前
FFmpeg在Android开发中的核心价值是什么?
android·ffmpeg
神探阿航14 小时前
HNUST湖南科技大学-安卓Android期中复习
android·安卓·hnust
千里马-horse16 小时前
android vlc播放rtsp
android·media·rtsp·mediaplayer·vlc