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


相关推荐
烬奇小云3 小时前
认识一下Unicorn
android·python·安全·系统安全
顾北川_野15 小时前
Android 进入浏览器下载应用,下载的是bin文件无法安装,应为apk文件
android
CYRUS STUDIO15 小时前
Android 下内联汇编,Android Studio 汇编开发
android·汇编·arm开发·android studio·arm
右手吉他15 小时前
Android ANR分析总结
android
PenguinLetsGo17 小时前
关于 Android15 GKI2407R40 导致梆梆加固软件崩溃
android·linux
杨武博19 小时前
音频格式转换
android·音视频
音视频牛哥21 小时前
Android音视频直播低延迟探究之:WLAN低延迟模式
android·音视频·实时音视频·大牛直播sdk·rtsp播放器·rtmp播放器·android rtmp
ChangYan.21 小时前
CondaError: Run ‘conda init‘ before ‘conda activate‘解决办法
android·conda
二流小码农21 小时前
鸿蒙开发:ForEach中为什么键值生成函数很重要
android·ios·harmonyos
夏非夏1 天前
Android 生成并加载PDF文件
android