Ansible剧本playbook之--------Templates 模块、roles角色详细解读

目录

一、Templates 模块

1.1准备模板文件并设置引用的变量

1.2修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

1.3编写 playbook 

1.4ansible主机远程查看修改参数

1.5验证

二、tags 模块

always应用

三、Roles 模块

3.1roles 的目录结构

3.2roles 内各目录含义解释

3.2.1files

3.2.2templates

3.2.3tasks

3.2.4handlers

3.2.5vars

3.2.6defaults

3.2.7meta

3.3在一个 playbook 中使用 roles 的步骤

3.4Roles模块举例——LAMP

3.4.1创建相应的目录和目录中的main.yml文件

3.4.2编写httpd模块

3.4.2.1编写yml文件

3.4.2.2定义变量

3.4.3编写mysql模块

3.4.3.1编写yml文件

3.4.3.2定义变量 ​编辑

3.4.4编写php模块

3.4.4.1编写yml文件

3.4.4.2定义变量

3.4.5编写roles示例并启动

3.4.6验证查看服务状态

四、使用Playbook编译安装nginx


一、Templates 模块

  • Jinja是基于Python的模板引擎。
  • Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
  • 一定要以.j2 为后缀的 template 模板文件

templates是ansible的一个模块,其功能是根据模板文件动态生成配置文件,templates文件必须存放于templates目录下,且命名为".j2"结尾,yaml/yml文件需要和templates目录平级,这样我们在yml文件中调用模板的时候,就不需要写模板文件的路径,否则需要描述模板文件的路径,因为template模块会自动去找templates目录下的模板文件

环境准备

服务器类型IP地址需要安装的组件
Ansible管理服务器192.168.246.7Ansible
被管理客户端192.168.246.8———
被管理客户端192.168.246.10———

1.1准备模板文件并设置引用的变量

先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量yum install httpd -y
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2   拷贝模板
#注意ansible本身要安装httpd,其他2台被控制的不能安装httpdvim /opt/httpd.conf.j2Listen {{http_port}}                  #42行,修改
ServerName {{server_name}}            #95行,修改
DocumentRoot "{{root_dir}}"           #119行,修改
#修改template配置文件模块的端口和主机名、根目录为变量

1.2修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

[web-z1]
192.168.246.8  http_port=192.168.246.8:80 server_name=www.kgc.com:80 root_dir=/etc/httpd/htdocs[web-z2]
192.168.246.10  http_port=192.168.246.10:8081 server_name=www.benet.com:8081 root_dir=/etc/httpd/htdocs

vim /etc/hosts   #主机添加hosts
192.168.246.8 zz2 www.kgc.com
192.168.246.10 zz3 www.benet.com

1.3编写 playbook 

---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name={{package}} state=latest- name: copy configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: create root dirfile: path=/etc/httpd/htdocs state=directory- name: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted

1.4ansible主机远程查看修改参数

ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf| grep -i "Servername"'
ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf| grep -i "Listen"'
ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf| grep -i "DocumentRoot"'

grep  -i  不区分大小写

1.5验证

查看httpd服务状态

查看域名访问效果

如果想在浏览器检测,在真机修改/etc/hosts文件


二、tags 模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。

playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

---
- name: ceshi tagshosts: web-z1remote_user: roottasks:- name: copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- nihao- name: touch filefile: path=/opt/anhui state=touch

可以看到当指定标签tags就执行到标签为止

always应用

---
- name: ceshi tagshosts: web-z1remote_user: roottasks:- name: copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- nihao- name: touch filefile: path=/opt/anhui state=touchtags:- always

查看添加了always之后,再指定标签执行,无论执行哪一个tags时,定义有always的tags都会执行。


三、Roles 模块

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

3.1roles 的目录结构

要创建才会有这些目录哦(如下图),不然是没有的哦

cd /etc/ansible/tree roles/roles/
├── web/
│   ├── files/
│   ├── templates/
│   ├── tasks/
│   ├── handlers/
│   ├── vars/
│   ├── defaults/
│   └── meta/
└── db/├── files/├── templates/├── tasks/├── handlers/├── vars/├── defaults/└── meta/

3.2roles 内各目录含义解释

3.2.1files

用来存放由 copy 模块或 script 模块调用的文件。

3.2.2templates

用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。

3.2.3tasks

此目录应当包含一个main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。

3.2.4handlers

此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。

3.2.5vars

此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。

3.2.6defaults

此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。

3.2.7meta

此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。

3.3在一个 playbook 中使用 roles 的步骤

(1)创建以 roles 命名的目录
mkdir /etc/ansible/roles/ -p    #yum装完默认就有(2)创建全局变量目录(可选)
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all     #文件名自己定义,引用的时候注意(3)在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql(4)在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml(6)修改 site.yml 文件,针对不同主机去调用不同的角色·2
vim /etc/ansible/site.yml·
---
- hosts: webserversremote_user: rootroles:- httpd
- hosts: dbserversremoteroles:- mysql(7)运行 ansible-playbook
cd /etc/ansible
ansible-playbook site.yml

3.4Roles模块举例——LAMP

在Linux上面安装apache(httpd)、mysql和php服务

3.4.1创建相应的目录和目录中的main.yml文件

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -ptouch /etc/ansible/roles/httpd/{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

3.4.2编写httpd模块

3.4.2.1编写yml文件

写一个简单的tasks/main.yml

vim /etc/ansible/roles/httpd/tasks/main.yml---
- name: install apacheyum: name={{pkg}} state=latest
- name: start apacheservice: enabled=true name={{svc}} state=started

3.4.2.2定义变量

定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中

vim /etc/ansible/roles/httpd/vars/main.ymlpkg: httpd
svc: httpd

3.4.3编写mysql模块

3.4.3.1编写yml文件
vim /etc/ansible/roles/mysql/tasks/main.yml---
- name: install mysqlyum: name={{pkg}} state=latest
- name: start mysqlservice: enabled=true name={{svc}} state=started

3.4.3.2定义变量
 
vim /etc/ansible/roles/mysql/vars/main.yml
pkg:- mariadb- mariadb-server
svc: mariadb

3.4.4编写php模块

3.4.4.1编写yml文件
vim /etc/ansible/roles/php/tasks/main.yml
- name: install phpyum: name={{pkg}} state=latest
- name: start php-fpmservice: enabled=true name={{svc}} state=started

3.4.4.2定义变量
vim /etc/ansible/roles/php/vars/main.yml
pkg:- php- php-fpm
svc: php-fpm

3.4.5编写roles示例并启动

vim /etc/ansible/site.yml
---
- hosts: allremote_user: rootroles:- httpd- mysql- phpcd /etc/ansible
ansible-playbook site.yml

3.4.6验证查看服务状态

查看apache状态(httpd)

查看数据库状态

查看php服务状态

四、使用Playbook编译安装nginx

准备nginx安装包与安装脚本文件

[root@zz1 opt]#ls
nginx-1.18.0.tar.gz  nginx.sh
[root@zz1 opt]#chmod +x nginx.sh
#给脚本文件添加执行权限

查看脚本内容

#/bin/bash
systemctl  start  nginx  >>/dev/null
if [ $? -eq 0 ];then 
echo  "nginx服务已安装"
else
useradd -M -s /sbin/nologin nginx
cd  /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz >>/dev/null
echo "正在安装,请耐心等待"
tar xf   nginx-1.18.0.tar.gz
cd  /opt/nginx-1.18.0
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-devel  &>>/dev/null
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
make -j `lscpu|sed -n '4p'|awk '{print $2}'`&>>/dev/null
make  install  &>>/dev/null
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
cat >  /usr/lib/systemd/system/nginx.service  <<EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -1 $MAINPID
ExecStop=/bin/kill -3 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
chown -R nginx.nginx  /usr/local/nginx
systemctl  daemon-reload  &>>/dev/null
systemctl  enable --now nginx
echo  "nginx服务已开启"
fi

编写playbook脚本

unarchive模块可以把安装包拷贝到远程主机,并在拷贝过程中自动解压

---
- name: install nginxhosts: allremote_user: roottasks:- name: firewalld stopservice: name=firewalld  state=stopped- name: packageunarchive:  copy=yes src=/opt/nginx-1.18.0.tar.gz dest=/opt owner=root group=root- name: Execute scriptscript: /opt/nginx.sh

nginx服务安装好了,查看nginx服务状态

开启nginx服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在国企分公司做信息宣传新闻投稿的经验分享

作为一名国企分公司的信息宣传工作者,我亲历了从传统投稿方式到数字化转型的全过程,这段经历既充满了挑战,也收获了成长。回首最初的日子,那些用邮箱投稿的时光,至今仍让我感慨万千。 初尝辛酸,邮箱投稿的艰难岁月 刚接手信息宣传工作时,我满腔热情,却很快被现实的冷水浇了个透…

RabbitMQ的五种模式

一、简单模式 简单模式&#xff08;Simple&#xff09;&#xff1a;一个生产者&#xff0c;一个消费者 package com.qiangesoft.rabbitmq.mode.simple;import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.Queue; import org.springframe…

事业单位向媒体投稿发文章上级领导交给了我投稿方法

作为一名事业单位的普通职员,负责信息宣传工作,我见证了从传统投稿方式到智能化转型的全过程,这段旅程既是一次挑战,也是一次宝贵的成长。回想起初涉此领域的日子,那些通过邮箱投稿的时光,至今仍然历历在目,其中的酸甜苦辣,构成了我职业生涯中一段难忘的经历。 邮箱投稿:费时费…

C++从入门到精通---模版

文章目录 泛型编程函数模版模版参数的匹配原则类模版类模版的定义格式类模版的实例化 总结 泛型编程 泛型编程是一种编程范式&#xff0c;旨在实现通用性和灵活性。它允许在编写代码时使用参数化类型&#xff0c;而不是具体的类型&#xff0c;从而使代码更加灵活和可重用。 在…

spring ioc 容器加载过程 refresh() 方法详解

IOC 加载过程 从 new ClassPathXmlApplicationContext开始 ApplicationContext context new ClassPathXmlApplicationContext("classpath:application.xml");ClassPathXmlApplicationContext类构造方法 public ClassPathXmlApplicationContext(String[] configLo…

Redis集群分片

什么是集群 集群是由多个复制集组成的,能提供在多个redis节点间共享数据的程序集 简而言之就是将原来的单master主机拆分为多个master主机,将整个数据集分配到各主机上 集群的作用 集群中可以存在多个master,而每个master可以挂载多个slave自带哨兵的故障转移机制,不需要再去…

Python解释器3.8.2版本安装详细教程

Python解释器提取链接链接&#xff1a; https://pan.baidu.com/s/1eDvwYmUJ4l7kIBXewtN4EA?pwd1111 提取码&#xff1a;1111 演示版本为3.6.8&#xff0c;链接安装包为3.8.2版&#xff0c;包中附加pytharm安装包。 1.双击提取好的python-exe安装文件&#xff0c;会…

外企接受大龄程序员吗?

本人知乎账号同公众号&#xff1a;老胡聊Java&#xff0c;欢迎留言并咨询 亲身体会外企经历所见所闻&#xff0c;外企能接受大龄程序员。 1 大概是10年的时候&#xff0c;进一家知名外企&#xff0c;和我一起进的一位manager&#xff0c;后来听下来&#xff0c;年龄35&#xf…

0508_IO3

练习1&#xff1a; 1&#xff1a;使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能&#xff0c;注意&#xff0c;代码中所有函数后面&#xff0c;紧跟perror输出错误信息&#xff0c;要求这些错误信息重定向到错误日志 err.txt 中去 1 #include <stdio.h…

【matlab基础知识代码】(十二)逆矩阵与广义逆矩阵

>> Hhilb(4);H1inv(H),norm(H*H1-eye(4))H1 1.0e03 *0.0160 -0.1200 0.2400 -0.1400-0.1200 1.2000 -2.7000 1.68000.2400 -2.7000 6.4800 -4.2000-0.1400 1.6800 -4.2000 2.8000ans 2.8455e-13 矩阵维数较大&#xff0c;警告: 矩阵接近奇…

svg画扇形进度动画

有人问下面这种图好怎么画&#xff1f;svg 想了下&#xff0c;确实用svg可以&#xff0c;可以这么设计 外层是一个容器放置内容&#xff0c;并且设置overflow:hidden&#xff0c; 内层放一个半径大于容器宽高一半的svg&#xff0c;并定位居中&#xff0c;然后svg画扇形&#x…

线程的组成、执行特点、创建的两种方式

线程的组成&#xff1a; cpu时间片 运行内存&#xff1a;栈、堆 线程的逻辑代码 线程执行的特点&#xff1a; 抢占式执行&#xff0c;结果随机&#xff0c;效率高&#xff0c;可以防止单一线程长时间独占CPU 在单核cpu中&#xff0c;宏观上同时执行&#xff0c;微观上顺序…

C++青少年简明教程之一:基础知识

C青少年简明教程之一&#xff1a;基础知识 电脑程序设计&#xff08;Computer programming&#xff09;&#xff0c;或称程序设计&#xff08;programming&#xff09;&#xff0c;是给出解决特定问题程序的过程&#xff0c;程序设计往往以某种程序设计语言为工具&#xff0c;给…

【软件测试】用例篇 -- 详解

一、测试用例的基本要素 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。&#xff08;注意&#xff1a;不需要执行结果&#xff0c;因为执行结果…

IO 5.8日

1&#xff1a;使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能&#xff0c;注意&#xff0c;代码中所有函数后面&#xff0c;紧跟perror输出错误信息&#xff0c;要求这些错误信息重定向到错误日志 err.txt 中去 2&#xff1a;判断一个文件是否拥有用户可写…

Android单行字符串末尾省略号加icon,图标可点击

如图 设置仅显示单行字符串&#xff0c;末尾用省略号&#xff0c;加跟一个icon&#xff0c;icon可点击 tvName.text "test"val drawable ResourcesCompat.getDrawable(resources, R.mipmap.icon_edit, null)tvName.setCompoundDrawablesWithIntrinsicBounds(null,…

【如此简单!数据库入门系列】之无序不代表混乱 -- 堆文件

文章目录 前言堆文件链表实现页目录实现总结系列文章 前言 还记得上次遗留的问题吗&#xff1f; 以什么组织方式将数据保存在磁盘中&#xff1f; 今天我们接着讨论这个问题。 首先想一个问题&#xff1a;有一天&#xff0c;你开着自己心爱的大型SUV去超市购物。在停车场入口看…

威客网上招标系统(五)

目录 5 详细设计 5.1 系统首页 5.1.1系统首页&#xff08;网站首页index.jsp&#xff09; 5.1.2 下沙派威客网首页界面说明 5.2 站内新闻信息 5.2.1站内新闻操作界面 5.2.2系统主操作界面说明 5.3威客在线操作界面 5.3.1 威客在线操作界面 5.3.2威客在线说明 5.4系统…

文件IO-使用dup2实现错误日志功能及判断文件权限,并终端输出

1&#xff1a;使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能&#xff0c;注意&#xff0c;代码中所有函数后面&#xff0c;紧跟perror输出错误信息&#xff0c;要求这些错误信息重定向到错误日志 err.txt 中去 代码&#xff1a; #incl…

kubectl_入门_Pod控制器

Pod控制器 在k8s中&#xff0c;按照pod的创建方式可以将其分为两类 自主式pod&#xff1a;k8s直接创建出来的pod&#xff0c;这种pod删除后就没有了&#xff0c;也不会重建控制器创建的pod&#xff1a;通过控制器创建的pod&#xff0c;这种pod删除了之后还会自动重建 1. 什么…