(四)ansible----playbook模板template,角色roles---编排httpd,nginx,memached,mysql

在这里插入图片描述

在这里插入图片描述

也可以是一个字典—

在这里插入图片描述

在这里插入图片描述

#temlnginx2.yml


  • hosts: websrvs

remote_user: root

vars:

nginx_vhosts:

  • 81

  • 82

  • 83

tasks:

  • name: template config

template: src=nginx.conf.j2 dest=/data/nginx.conf

vim templates/nginx.conf2.j2

{% for vhost in nginx_vhosts %}

server {

listen {{ vhost }}

}{% endfor %}

ansible-playbook -C templnginx2.yml --limit 10.0.0.8

#生成的结果:

server {

listen 81

}

server {

listen 82

}

server {

listen 83

}

vim temlnginx3.yml


  • hosts: websrvs

remote_user: root

#嵌套

vars:

nginx_vhosts:

  • listen: 8080

tasks:

  • name: config file

template: src=nginx.conf3.j2 dest=/data/nginx3.conf

vim templates/nginx.conf3.j2

{% for vhost in nginx_vhosts %}

server {

listen {{ vhost.listen }}

}

{% endfor %}

#嵌套

ansible-playbook templnginx3.yml --limit 10.0.0.8

#生成的结果

server {

listen 8080

}

vimtemplnginx4.yml


  • hosts: websrvs

remote_user: root

vars:

nginx_vhosts:

  • listen: 8080

server_name: “web1.magedu.com”

root: “/var/www/nginx/web1/”

  • listen: 8081

server_name: “web2.magedu.com”

root: “/var/www/nginx/web2/”

  • {listen: 8082, server_name: “web3.magedu.com”, root:

“/var/www/nginx/web3/”}

tasks:

  • name: template config

template: src=nginx.conf4.j2 dest=/data/nginx4.conf

vim templates/nginx.conf4.j2

{% for vhost in nginx_vhosts %}

server {

listen {{ vhost.listen }}

server_name {{ vhost.server_name }}

root {{ vhost.root }}

}{% endfor %}

ansible-playbook templnginx4.yml --limit 10.0.0.8

#生成结果:

server {

listen 8080

server_name web1.magedu.com

root /var/www/nginx/web1/

}

server {

listen 8081

server_name web2.magedu.com

root /var/www/nginx/web2/

}

server {

listen 8082

server_name web3.magedu.com

root /var/www/nginx/web3/

}

用 if条件判断,决定是否生成相关的配置信息

vim templnginx5.yml

  • hosts: websrvs

remote_user: root

vars:

nginx_vhosts:

  • web1:

listen: 8080

root: “/var/www/nginx/web1/”

  • web2:

listen: 8080

server_name: “web2.magedu.com”

root: “/var/www/nginx/web2/”

  • web3:

listen: 8080

server_name: “web3.magedu.com”

root: “/var/www/nginx/web3/”

tasks:

  • name: template config to

template: src=nginx.conf5.j2 dest=/data/nginx5.conf

defined 存在,则执行,不存在不执行

vim templates/nginx.conf5.j2

{% for vhost in nginx_vhosts %}

server {

listen {{ vhost.listen }}

{% if vhost.server_name is defined %}

server_name {{ vhost.server_name }}

{% endif %}

root {{ vhost.root }}

}{% endfor %}

#生成的结果

server {

listen 8080

root /var/www/nginx/web1/

}

server {

listen 8080

server_name web2.magedu.com

root /var/www/nginx/web2/

}

server {

listen 8080

server_name web3.magedu.com

root /var/www/nginx/web3/

}

4. 节点过多导致的超时----serial


默认情况下,Ansible将尝试并行管理playbook中所有的机器。对于滚动更新用例,可以使用serial关键字定义Ansible一次应管理多少主机,还可以将serial关键字指定为百分比,表示每次并行执行的主机数占总数的比例

vim test_serial.yml


  • hosts: all

serial: 2 #每次只同时处理2个主机

gather_facts: False

tasks:

  • name: task one

comand: hostname

  • name: task two

command: hostname

  • name: test serail

hosts: all

serial: “20%” #每次只同时处理20%的主机

十二. roles角色

==============================================================================

roles

能够根据层次型结构自动装载变量文件tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

复杂场景:建议使用roles,代码复用度高(相当于shell中的函数)

变更指定主机或主机组

如命名不规范维护和传承成本大

某些功能需多个Playbook,通过includes即可实现

Roles

角色(roles):角色集合

roles/

mysql/

httpd/

nginx/

memcached/

目录编排在这里插入图片描述

roles目录结构


每个角色,以特定的层级目录结构进行组织

roles目录结构

playbook.yml

roles/

project/

tasks/

files/

vars/

templates/

handlers/

default/ 不常用

meta/ 不常用

Roles各目录作用


/roles/project/ :项目名称,有以下子目录

files/ :存放由copy或script模块等调用的文件

templates/:template模块查找所需要模板文件的目录

tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过 - include 文件名 进行包含

meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含

default/:设定默认变量时使用此目录中的main.yml文件

创建role

=========================================================================

创建role的步骤

(1) 创建以roles命名的目录

(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等

(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建

(4) 在playbook文件中,调用各角色

一个简单的例子

实现nginx搭建

在这里插入图片描述

  1. 建目录:

mkdir roles/{nginx,mysql}/{tasks,files,} -pv

  1. 创建任务文件

cd tasks

touch user.yml install.yml config.yml service.yml

写文件

[root@centos7tasks]#cat user.yml

  • name: create user

user: name=nginx shell=/sbin/nologin system=yes create=no

将配置文件拷到file目录下并且修改端口

[root@centos7tasks]#cat config.yml

  • name: config

#这里的src可以自动找到roles/file/nginx.conf

#所以不必在…/file/config.yml文件中指定绝对路径

copy: src=nginx.conf dest=/etc/nginx/nginx.conf

定义man.yml文件(为了制定tasks目录中文件执行的顺序

[root@centos7tasks]#cat main.yml

  • include: user.yml

  • include: install.yml

  • include: config.yml

  • includeL: service.yml

在这里插入图片描述

最后在与roles文件夹统计的目录中创建一个调用nginx角色的yml文件

[root@centos7playbook]#cat nginx_role.yml

  • hosts: webservice

remote_user: root

roles:

#在这里也可以指定多个角色

  • role: nginx

最后检查 ansible-playbook -C nginx_role.yml

执行ansible-playbook nginx_role.yml

也可以在nginx目录下建立一个handlers目录存放handlers触发器信息,比如restarted服务

然后在其中建立一个main.yml文件

[root@centos7 handlers]#cat main.yml

  • name: restart service

service: name=nginx state=restarted

并且tasks目录中的的config.yml

有notify的信息

[root@centos7nginx]#cat tasks/config.yml

  • name: config

copy: src=nginx.conf dest=/etc/nginx/nginx.conf

notify: restart service

检查,执行

在这里插入图片描述

针对大型项目使用Roles进行编排

示例:

nginx-role.yml

roles/

└── nginx

├── files

│ └── main.yml

├── tasks

│ ├── groupadd.yml

│ ├── install.yml

│ ├── main.yml

│ ├── restart.yml

│ └── useradd.yml

└── vars

└── main.yml

playbook调用角色(有多个角色)


调用角色方法1:


  • hosts: websrvs

remote_user: root

roles:

  • mysql

  • memcached

  • nginx

调用角色方法2:

传递变量给角色

  • hosts:

remote_user:

roles:

  • mysql

  • { role: nginx, username: nginx }

键role用于指定角色名称

后续的k/v用于传递变量给角色

调用角色方法3:还可基于条件测试实现角色调用

roles:

  • { role: nginx, when: ansible_distribution_major_version == ‘7’ }

  • { role: httpd, username: httpd, when: ansible_distribution_major_version == ‘6’ }

roles playbook tags使用

roles playbook tags使用

ansible-playbook --tags=“nginx,httpd,mysql” nginx-role.yml

// nginx-role.yml


  • hosts: testweb

remote_user: root

roles:

  • { role: nginx ,tags: [ ‘nginx’, ‘web’ ] ,when: ansible_distribution_major_version == "6“ }

  • { role: httpd ,tags: [ ‘httpd’, ‘web’ ] }

  • { role: mysql ,tags: [ ‘mysql’, ‘db’ ] }

  • { role: marridb ,tags: [ ‘mysql’, ‘db’ ] }

  • { role: php }

memcached缓存服务

端口11211

在这里插入图片描述

内存大小在这里插入图片描述

cp /etc/sysconfig/memcached templtes/memcached.j2

修改内存大小

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在playbook中 写一个调用角色的memcached_role.yml文件

在这里插入图片描述

最后检查-C

执行

实战案例

=======================================================================

1:实现 httpd 角色


#创建角色相关的目录

mkdir -pv /data/ansible/roles/httpd/{tasks,handlers,files}

#创建角色相关的文件

cd /data/ansible/roles/httpd/

#main.yml 是task的入口文件

vim tasks/main.yml

  • include: group.yml

  • include: user.yml

  • include: install.yml

  • include: config.yml

  • include: index.yml

  • include: service.yml

vim tasks/group.yml

  • name: create apache group

group: name=apache system=yes gid=80

vim tasks/user.yml

  • name: create apache user

user: name=apache system=yes shell=/sbin/nologin home=/var/www/ uid=80

group=apache

vim tasks/install.yml

  • name: install httpd package

yum: name=httpd

vim tasks/config.yml

  • name: config file

copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes

notify: restart

vim tasks/index.yml

  • name: index.html

copy: src=index.html dest=/var/www/html/

vim tasks/service.yml

  • name: start service

service: name=httpd state=started enabled=yes

vim handlers/main.yml

  • name: restart

service: name=httpd state=restarted

#在files目录下准备两个文件

ls files/

httpd.conf index.html

tree /data/ansible/roles/httpd/

/data/ansible/roles/httpd/

├── files

│ ├── httpd.conf

│ └── index.html

├── handlers

│ └── main.yml

└── tasks

├── config.yml

├── group.yml

├── index.yml

├── install.yml

├── main.yml

├── service.yml

└── user.yml

#在playbook中调用角色

vim /data/ansible/role_httpd.yml


  • hosts: websrvs

remote_user: root

roles:

  • httpd

#运行playbook

ansible-playbook /data/ansible/role_httpd.yml

2. 实现 nginx 角色


mkdir -pv /data/ansible/roles/nginx/{tasks,handlers,templates,vars}

#创建task文件

cd /data/ansible/roles/nginx/

vim tasks/main.yml

  • include: install.yml

  • include: config.yml

  • include: index.yml

  • include: service.yml

vim tasks/install.yml

  • name: install

yum: name=nginx

vim tasks/config.yml

  • name: config file for centos7

template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf

when: ansible_distribution_major_version==“7”

notify: restart

  • name: config file for centos8

template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf

when: ansible_distribution_major_version==“8”

notify: restart

vim tasks/index.yml

  • name: index.html

copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/

vim tasks/service.yml

  • name: start service

service: name=nginx state=started enabled=yes

#创建handler文件

cat handlers/main.yml

  • name: restart

service: name=nginx state=restarted

#创建两个template文件

cat templates/nginx7.conf.j2

user {{user}};

worker_processes {{ansible_processor_vcpus+3}}; #修改此行

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

pid /run/nginx.pid;

cat templates/nginx8.conf.j2

user nginx;

worker_processes {{ansible_processor_vcpus**3}}; #修改此行

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

pid /run/nginx.pid;

#创建变量文件

vim vars/main.yml

user: daemon

#目录结构如下

tree /data/ansible/roles/nginx/

/data/ansible/roles/nginx/

├── handlers

│ └── main.yml

├── tasks

│ ├── config.yml

│ ├── file.yml

│ ├── install.yml

│ ├── main.yml

│ └── service.yml

├── templates

│ ├── nginx7.conf.j2

│ └── nginx8.conf.j2

└── vars

└── main.yml

#在playbook中调用角色

vim /data/ansible/role_nginx.yml


  • hosts: websrvs

roles:

  • role: nginx

#运行playbook

ansible-playbook /data/ansible/role_nginx.yml

3. 实现 memcached 角色


mkdir -pv /data/ansible/roles/memcached/{tasks,templates}

cd /data/ansible/roles/memcached

vim tasks/main.yml

  • include: install.yml

  • include: config.yml

  • include: service.yml

vim tasks/install.yml

  • name: install

yum: name=memcached

vim tasks/config.yml

  • name: config file

template: src=memcached.j2 dest=/etc/sysconfig/memcached

vim tasks/service.yml

  • name: service

service: name=memcached state=started enabled=yes

vim templates/memcached.j2

PORT=“11211”

USER=“memcached”

MAXCONN=“1024”

CACHESIZE=“{{ansible_memtotal_mb//4}}”

OPTIONS=“”

tree /data/ansible/roles/memcached/

/data/ansible/roles/memcached/

├── tasks

│ ├── config.yml

│ ├── install.yml

│ ├── main.yml

│ └── service.yml

└── templates

└── memcached.j2

vim /data/ansible/role_memcached.yml


  • hosts: appsrvs

roles:

  • role: memcached

ansible-play /data/ansible/role_memcached.yml

4 .实现 mysql 5.6 的角色


cat /data/ansible/roles/mysql/files/my.cnf

[mysqld]

socket=/tmp/mysql.sock

user=mysql

symbolic-links=0

datadir=/data/mysql

innodb_file_per_table=1

log-bin

pid-file=/data/mysql/mysqld.pid

[client]

port=3306

socket=/tmp/mysql.sock

[mysqld_safe]

log-error=/var/log/mysqld.log

[root@ansible ~]#cat /data/ansible/roles/mysql/files/secure_mysql.sh

#!/bin/bash

/usr/local/mysql/bin/mysql_secure_installation <<EOF

y

qcq

qcq

yyyy

EOF

[root@ansible ~]#chmod +x /data/ansible/roles/mysql/files/secure_mysql.sh

[root@ansible ~]#ls /data/ansible/roles/mysql/files/

my.cnf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz secure_mysql.sh

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/main.yml

  • include: install.yml

  • include: group.yml

  • include: user.yml

  • include: unarchive.yml

  • include: link.yml

  • include: data.yml

  • include: config.yml

  • include: service.yml

  • include: path.yml

  • include: secure.yml

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/install.yml

  • name: install packages
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
64.tar.gz secure_mysql.sh

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/main.yml

  • include: install.yml

  • include: group.yml

  • include: user.yml

  • include: unarchive.yml

  • include: link.yml

  • include: data.yml

  • include: config.yml

  • include: service.yml

  • include: path.yml

  • include: secure.yml

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/install.yml

  • name: install packages
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-StIRCD81-1712544635201)]

[外链图片转存中…(img-gFRdrs3L-1712544635201)]

[外链图片转存中…(img-54ANLlJN-1712544635202)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

[外链图片转存中…(img-tjlmk41g-1712544635202)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值