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


相关推荐
Dnelic-29 分钟前
Kotlin | Android Provider 的实现案例
android·数据库·kotlin·provider·自学笔记
walkskyer4 小时前
Golang strconv包详解:高效类型转换实战
android·开发语言·golang
氦客4 小时前
Android Compose 显示底部对话框 (ModalBottomSheet),实现类似BottomSheetDialog的效果
android·dialog·ui·compose·modal·bottomsheet·底部对话框
我命由我123454 小时前
Android Room 构建问题:There are multiple good constructors
android·开发语言·java-ee·android studio·android jetpack·android-studio·android runtime
c小旭4 小时前
Android SystemUI——服务启动流程(二)
android·systemui
zhangphil5 小时前
Android ValueAnimator根据屏幕刷率动态出帧/刷新,Kotlin
android·kotlin
芝士就是力量啊 ೄ೨5 小时前
Kotlin 循环语句详解
android·java·开发语言·kotlin
Alex老夫子5 小时前
kotlin sortedBy 与sortedWith的区别
android·开发语言·kotlin
Android采码蜂5 小时前
SurfaceFlinger07-Layer销毁流程
android
程序员老石10 小时前
ClickHouse-CPU、内存参数设置
android·java·clickhouse