自动化运维工具——Ansible学习(二)

news2024/11/25 1:04:14

目录

一、handlers和notify结合使用触发条件

1.新建httpd.yml文件

2.复制配置文件到ansible的files目录中

3.卸载被控机已安装的httpd

4.执行httpd.yml脚本

5.更改httpd.conf配置文件

6.使用handlers

7.重新执行httpd.yml脚本

8.检查被控机的端口号是否改变

9.handlers也可以触发多个

二、tags

1.通过指定标签来执行特定的动作

2.停止httpd服务

3.检查是否成功停止

4.执行启动服务的tags

5.重新检查服务是否启动

6.也可以针对多个标签执行脚本

7.多个动作对应一个标签tags

三、playbook中变量的使用

1.定义1个变量

(1)编写脚本

(2)启动脚本时对脚本中的变量进行赋值

(3)检查程序是否成功安装、服务是否成功开启

2.定义2个变量

(1)编写脚本

(2)执行脚本

(3)查看程序是否安装成功

(4)卸载程序

3.在脚本内部给变量赋值

(1)编写脚本

(2)执行脚本

(3)检查程序是否成功安装

(4)卸载程序

4.在主机清单中给脚本定义变量


一、handlers和notify结合使用触发条件

Handlers

        是task列表,这些task与前述的task的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。

        Notify此action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作成为handler,也即notify中调用handler中定义的操作。

例如:更新配置文件,重新启动playbook,系统不会重启服务。

1.新建httpd.yml文件

[root@ansible145 ansible]# vim httpd.yml

---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd package
      yum: name=httpd
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
    - name: start service
      service: name=httpd state=started enabled=yes

2.复制配置文件到ansible的files目录中

[root@ansible145 ansible]# ll /etc/httpd/conf/httpd.conf 
-rw-r--r--. 1 root root 11753 May 30 21:49 /etc/httpd/conf/httpd.conf

[root@ansible145 ansible]# cp /etc/httpd/conf/httpd.conf files/

[root@ansible145 ansible]# tree
.
├── files
│   ├── httpd.conf
│   ├── index.html
│   └── test.html
├── file.yml
├── hello2.yml
├── hello.yml
├── host.sh
└── selinux

3.卸载被控机已安装的httpd

检查端口号,80端口已开启,需要卸载httpd

卸载命令

[root@ansible145 ansible]# ansible all -m yum -a 'name=httpd state=absent'

检查被控机的80端口已消失

4.执行httpd.yml脚本

# 检查语法
[root@ansible145 ansible]# ansible-playbook -C httpd.yml

# 语法没问题再执行脚本
[root@ansible145 ansible]# ansible-playbook -C httpd.yml

被控机已成功安装并启动httpd服务,80端口已启动

[root@ansible145 ansible]# ansible websrvs -m shell -a 'ss -ntl | grep :80'
192.168.22.142 | CHANGED | rc=0 >>
LISTEN     0      128         :::80                      :::*                  
192.168.22.141 | CHANGED | rc=0 >>
LISTEN     0      128         :::80                      :::* 

5.更改httpd.conf配置文件

修改端口号为8080

[root@ansible145 ansible]# vim ./files/httpd.conf

再次执行httpd.yml后,检查80端口号,依然还在启动,没有变为8080

6.使用handlers

因此,当我们修改程序的配置文件时,重新执行ansible脚本需要重启服务,变为最新的配置和服务,此时,就需要用到handlers。

---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd package
      yum: name=httpd
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart service  # 标记改变的任务,名字要与handlers下的name一一对应
      # 告诉handlers,当配置文件发生改变时,执行handlers下面的重启服务任务
    - name: start service
      service: name=httpd state=started enabled=yes

   handlers: # 当上面的某个或某些任务改变时,执行下面的任务
    - name: restart service
      service: name=httpd state=restarted

更改主控机的配置文件,因为第二次执行脚本时,更改后的配置文件8080端口已经复制到被控机上了,如果不更改,就相当于配置文件没有变。

[root@ansible145 ansible]# vim ./files/httpd.conf

7.重新执行httpd.yml脚本

[root@ansible145 ansible]# ansible-playbook httpd.yml 

8.检查被控机的端口号是否改变

端口号改变,服务成功重启!

9.handlers也可以触发多个

- hosts: websrvs
  remnte user: root
  
  tasks:
    - name: add group nginx
      tags: user
      user: name=nginx state=present
    - name: add user nginx
      user: name=nginx state=present group=nginx
    - name: Inslall Ngiix
      yum: name=nginx state=present
    - name: config
      copy: src=/root/contig.txt dest=/etc/nginx/nginx.conf
    notify:
      - Restart Nginx
      - Check Nginx Process
 
  handlers:
    - name: Restart Nginx
      service: name=nginx state=restarted enabled=yes
    - name: Check Nginx process
      shell: killall -0 nginx > /tmp/nginx.log

二、tags

1.通过指定标签来执行特定的动作

---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd package
      yum: name=httpd
      tags: inshttpd
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart service
    - name: start service
      service: name=httpd state=started enabled=yes
      tags: rshttpd

  handlers:
    - name: restart service
      service: name=httpd state=restarted

2.停止httpd服务

[root@ansible145 ansible]# ansible websrvs -m service -a 'name=httpd state=stopped'

3.检查是否成功停止

4.执行启动服务的tags

[root@ansible145 ansible]# ansible-playbook -t rshttpd httpd.yml

5.重新检查服务是否启动

6.也可以针对多个标签执行脚本

# 卸载httpd
[root@ansible145 ansible]# ansible websrvs -m yum -a 'name=httpd state=absent'

# 检查是否成功卸载
[root@ansible145 ansible]# ansible websrvs -m shell -a 'rpm -q httpd'

# 执行多个tags
[root@ansible145 ansible]# ansible-playbook -t inshttpd,rshttpd httpd.yml 

# 启动的服务为默认的80端口
[root@ansible145 ansible]# ansible websrvs -m shell -a 'ss -ntl | grep :80'
192.168.22.141 | CHANGED | rc=0 >>
LISTEN     0      128         :::80                      :::*                  
192.168.22.142 | CHANGED | rc=0 >>
LISTEN     0      128         :::80                      :::* 

7.多个动作对应一个标签tags

脚本:

---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd package
      yum: name=httpd
      tags: httpd
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart service
    - name: start service
      service: name=httpd state=started enabled=yes
      tags: httpd

  handlers:
    - name: restart service
      service: name=httpd state=restarted
# 卸载httpd
[root@ansible145 ansible]# ansible websrvs -m yum -a 'name=httpd state=absent'

# 检查是否成功卸载
[root@ansible145 ansible]# ansible websrvs -m shell -a 'rpm -q httpd'

# 执行tags
[root@ansible145 ansible]# ansible-playbook -t httpd httpd.yml 

# 启动的服务为默认的80端口
[root@ansible145 ansible]# ansible websrvs -m shell -a 'ss -ntl | grep :80'
192.168.22.141 | CHANGED | rc=0 >>
LISTEN     0      128         :::80                      :::*                  
192.168.22.142 | CHANGED | rc=0 >>
LISTEN     0      128         :::80                      :::* 

查看标签:

[root@ansible145 ansible]# ansible-playbook httpd.yml --list-tags

playbook: httpd.yml

  play #1 (websrvs): websrvs	TAGS: []
      TASK TAGS: [httpd]

三、playbook中变量的使用

使用变量可以对不同的被控机进行不同的操作。

ansible websrvs -m setup | grep ansible_fqdn

ansible websrvs -m setup | grep ansible_hostname

ansible websrvs -m setup -a 'filter=ansible_fqdn'

ansible websrvs -m setup -a 'filter=ansible_hostname'

ansible websrvs -m setup -a 'filter=ansible_*'

ansible websrvs -m setup -a 'filter=*address'

ansible websrvs -m setup -a 'filter=ansible_all_ipv4_addresses'

ansible websrvs -m setup -a 'filter=ansible_eth0'

1.定义1个变量

(1)编写脚本

vim app.yml


---
- hosts: appsrvs
  remote_user: root

  tasks:
    - name: install  package
      yum: name={{ pkname }}
    - name: start service
      service: name={{ pkname }} state=started enabled=yes

(2)启动脚本时对脚本中的变量进行赋值

[root@ansible145 ansible]# ansible-playbook -e 'pkname=vsftpd' app.yml

(3)检查程序是否成功安装、服务是否成功开启

2.定义2个变量

(1)编写脚本

---
- hosts: appsrvs
  remote_user: root

  tasks:
    - name: install  package
      yum: name={{ pkname1 }}
    - name: install  package
      yum: name={{ pkname2 }}

(2)执行脚本

[root@ansible145 ansible]# ansible-playbook -e 'pkname1=httpd pkname2=memcached' app.yml 

(3)查看程序是否安装成功

(4)卸载程序

[root@ansible145 ansible]# ansible appsrvs -m shell -a 'yum -y remove httpd memcached vsftpd'

3.在脚本内部给变量赋值

上面两个脚本都是在命令行对脚本中的变量进行赋值的,我们也可以在脚本内部给变量赋值。

(1)编写脚本

---
- hosts: appsrvs
  remote_user: root
  vars:
    - pkname1: httpd
    - pkname2: vsftpd
  tasks:
    - name: install  package
      yum: name={{ pkname1 }}
    - name: install  package
      yum: name={{ pkname2 }}

(2)执行脚本

[root@ansible145 ansible]# ansible-playbook app.yml 

(3)检查程序是否成功安装

(4)卸载程序

[root@ansible145 ansible]# ansible appsrvs -m shell -a 'yum -y remove httpd vsftpd'

4.在主机清单中给脚本定义变量

[root@ansible145 ansible]# vim /etc/ansible/hosts

vim hostname.yml


---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: set hostname
      hostname: name=www{{ http_port }}.test.com

执行脚本

# 检查语法
[root@ansible145 ansible]# ansible-playbook -C hostname.yml 


# 执行脚本
[root@ansible145 ansible]# ansible-playbook hostname.yml


# 查看websrvs主机名是否成功更改
[root@ansible145 ansible]# ansible websrvs -a 'hostname'
192.168.22.141 | CHANGED | rc=0 >>
www81.test.com
192.168.22.142 | CHANGED | rc=0 >>
www82.test.com

上面的修改主机名的脚本中,www{}test.com部分是公用的,也可以对其进行修改

修改/etc/ansible/hosts文件

修改脚本

vim hostname.yml

---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: set hostname
      hostname: name={{ nodename }}{{ http_port }}.{{ domainname }}

执行脚本后查看主机名,已经被成功修改

注意:如果在上述地方都设置后,在命令行对变量进行重新赋值,则命令行的优先级最高

[root@ansible145 ansible]# ansible-playbook -e 'nodename=web domainname=example.com' hostname.yml 

普通变量的优先级比分组的公共变量的优先级高

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

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

相关文章

矩阵乘法的硬件加速

矩阵乘法的硬件加速 这里的硬件加速是指,如果依靠算法,可以通过减少访存次数来加速。可以将数据预取到cache来减少访存次数。 矩阵相乘最简单的实现 寄存器平铺矩阵乘法 将矩阵划分成多个小的矩阵块,小的矩阵块可以存放在寄存器中&#xff0…

QT开发技巧之嵌入式linux QT的QCombobox显示空白的问题

1.问题 开发平台:imx6ull qt版本:5.12.9 在嵌入式linux上运行的qt,QCombobox显示空白,不能显示其中的文本内容 2.解决办法 选中QCombobox,在属性栏中将foucsPolicy由WheelFocus改成NoFocus就好了

用户、角色、权限、菜单--数据库设计

用户角色关联表--user_role id-------------------主键 user_id------------用户ID role_id-------------角色ID create_time------创建时间 is_deleted--------状态(0:未删除 1:删除) 角色权限关联表--role_permission id------…

【PHP面试题50】Redis的主从复制实现原理是怎么样的?如何保证数据一致性?数据延迟又该如何处理?

文章目录 一、前言二、主从复制的基本原理三、数据一致性的保证四、数据延迟的处理四、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题,对标资深工程师/架构师序列,欢迎大家提前关注锁定。 R…

OpenCv算子

目录 一、索贝尔(sobel)算子 二、沙尔(Scharr)算子 三、拉普拉斯算子 一、索贝尔(sobel)算子 边缘的定义: 边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。 sobel算子对图像求一阶导数。…

【V8】【1. 内存布局、隐藏类Hidden Class】

JavaScript 中的对象是由一组组属性和值的集合。JavaScript 对象像一个字典,字符串作为键名,任意对象可以作为键值,可以通过键名读写键值。 在 ECMAScript 规范中定义了数字属性应该按照索引值大小升序排列,字符串属性根据创建时…

python将dataframe数据导入MongoDB非关系型数据库

文章目录 pymongo连接新建数据库和集合pandas导入数据插入数据数据查看 pymongo连接 import pymongo client pymongo.MongoClient("mongodb://localhost:27017/") dblist client.list_database_names() for db in dblist:print(db) #查看已有数据库admin bilibil…

apply()函数--Pandas

1. DataFrame.apply()函数 1.1 函数功能 对DataFrame沿着指定轴运用函数。 函数接收到的对象是Series对象,它们的索引可以是DataFrame的行索引(axis0)或列索引(axis1)。结果为Series或DataFrame。 1.2 函数语法 Da…

java基础浮点类型

目录 1:float类型和double类型的定义 2:二者的范围和精度 3:float类型详解 3.1:整数位10进制转换为2进制 3.2:小数位10进制转换为2进制 3.3:把二进制放到浮点类型中 3.4:精度损失 4&…

手动下载composer项目放在vendor目录下并加载

比如添加easywechat。 说是手动,其实半手动。 到GitHub或gitee下载 1、下载后放在项目根目录下的vendor文件夹 2、在项目根目录的文件composer.json文件添加一段 "autoload": {"psr-4": {"EasyWeChat\\": "vendor/overtrue/wech…

9.带你入门matlab假设检验(matlab程序)

1.简述 函数 ztest 格式 h ztest(x,m,sigma) % x为正态总体的样本,m为均值μ0,sigma为标准差,显著性水平为0.05(默认值) h ztest(x,m,sigma,alpha) %显著性水平为alpha [h,sig,ci,zval] ztest(x,m,sigma,alpha,tail) %sig为观察…

3.5 Bootstrap 输入框组

文章目录 Bootstrap 输入框组基本的输入框组输入框组的大小复选框和单选插件按钮插件带有下拉菜单的按钮分割的下拉菜单按钮 Bootstrap 输入框组 本章将讲解 Bootstrap 支持的另一个特性,输入框组。输入框组扩展自 表单控件。使用输入框组,您可以很容易地…

SpringCloud Alibaba——Ribbon底层怎样实现不同服务的不同配置

目录 一、Ribbon底层怎样实现不同服务的不同配置二、源码角度分析 一、Ribbon底层怎样实现不同服务的不同配置 为不同服务创建不同的spring上下文,不同的spring上下文中存放对应这个服务所有的配置。 二、源码角度分析 SpringClientFactory中可以获取到所有ribbon…

自动化运维工具——Ansible学习(一)

目录 一、运维自动化发展历程及技术应用 (二)程序发布相关知识 (三)常用的自动化运维工具 二、Ansible入门 (一)Ansible发展史 (二)特点 (三)Ansible架构 (四)工作原理 (五)Ansible主要组成部分 (六) 安装步骤 1.各种安装方法与命令 (1)rpm包安装:EPEL源…

一篇文章让你学会Elasticsearch中的查询

还是惯例,开头先放章节目录,如果有帮到你的地方,欢迎点赞关注转发,如有错误,欢迎指出,不胜感激 一、环境初始化 version: 3.8 services:cerebro:image: lmenezes/cerebro:0.8.3container_name: cerebroport…

ylb-支付服务pay

总览: 在pay模块util包下,创建签名工具类Pkipair和http工具类HttpUtil: package com.bjpowernode.util;import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.securi…

centos7 docker 安装sql server 2019

contos7安装sql server docker最低1.8或更高 卸载旧的docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 装docker依赖包 #安装所需资源包 sudo yum install -…

mac 下 geoserver 安装

一、去官网下载geoserver https://geoserver.org/ 选择一个版本,然后点进去 二、需要配置java环境和设置geoserver 环境变量 1)、java 环境安装 Java Downloads | Oracle 中国 2)、环境变量设置 1.打开终端:command 空格键 2…

全卷积网络(FCN)

一:全卷积网络 义分割是对图像中的每个像素分类。 全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换。与我们之前在图像分类或目标检测部分介绍的卷积神经网络不同,全卷…

融合自适应惯性权重和柯西变异的秃鹰搜索算法(CBES) - 附代码

融合自适应惯性权重和柯西变异的秃鹰搜索算法(CBES) 文章目录 融合自适应惯性权重和柯西变异的秃鹰搜索算法(CBES)1.秃鹰优化算法2.改进秃鹰优化算法2.1 Tent 映射2.2 自适应惯性权重2.3 柯西变异 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要:针对基本秃鹰搜…