Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Puppet使用ENC报’Could not load external node results for’

Puppet使用ENC报’Could not load external node results for’

作者头像
星哥玩云
发布于 2022-07-03 07:57:01
发布于 2022-07-03 07:57:01
5160
举报
文章被收录于专栏:开源部署开源部署

这个问题出现有一段时间了,最开始的时候从一天3-5次左右到最近的一天出现10多次的告警邮件...

因为Puppet同步采取了主动触发和定时同步两种策略,几乎每次的报错都是在定时同步时出现...

Puppet Server采用双主结构,Web ui使用Foreman,为了确定这个报错是出现在那台服务器上, 通过对源代码的log增加主机标记最终定位到了这个错误只是出现在一台服务器上...,出现的很偶然,但所有的错误标记中,都是它....

Level  Resource    message

err Puppet  Could not retrieve catalog from remote server: Error 400 on SERVER: Failed when searching for node xxx: 001。,Could not load external node results for xxx: undefined method `inject' for false:FalseClass ::--- false

notice  Puppet  Using cached catalog

err Puppet  Could not retrieve catalog; skipping run

最后面的 :: --- false    其中::是在log中追加的分解符,方便区分, --- false 是返回的output的信息..

在Puppet源代码中 , 通过indirector与enc相关的find方法中可以看到这个find方法接受一个参数 request

 indirector/node/exec.rb

  def find(request)

    output = super or return nil

    # Translate the output to ruby.

    result = translate(request.key, output)

    create_node(request.key, result)

  end

output 是调用父方法的find

父方法的find会调用enc脚本获取返回值,如果失败或调用不成功则为Nil..

这时会继续通过translate方法,将yaml输出转为ruby的对象

如果output为nil,这时yaml在读取这个数据的时候就会抛出异常,异常就是收到的Puppet邮件告警的内容了。

  def translate(name, output)

    YAML.load(output).inject({}) do |hash, data|                                           

      case data[0]                                                                         

      when String                                                                           

        hash[data[0].intern] = data[1]                                                     

      when Symbol                                                                           

        hash[data[0]] = data[1]                                                             

      else                                                                                 

        raise Puppet::Error, "key is a #{data[0].class}, not a string or symbol"           

      end                                                                                   

      hash                                                                                 

    end                                                                                     

  rescue => detail                                                                         

      raise Puppet::Error, "001,Could not load external node results for #{name}: #{detail} ::#{output} "

  end

罗嗦了一大堆,其实就是node.rb的脚本在通过api取参数的时候,没有获得200...导致的。

通过指向一个错误的WEB服务器地址,可以看到 开头--- false。。。。

[root@test puppet]# ruby node1.rb test

--- false

Error retrieving node test: Net::HTTPNotFound 

分析node.rb

def enc(certname)

  foreman_url      = "#{url}/node/#{certname}?format=yml"

  uri              = URI.parse(foreman_url)

  req              = Net::HTTP::Get.new(uri.request_uri)

  http            = Net::HTTP.new(uri.host, uri.port)

  http.use_ssl    = uri.scheme == 'https'

  if http.use_ssl?

    if SETTINGS[:ssl_ca] && !SETTINGS[:ssl_ca].empty?

      http.ca_file = SETTINGS[:ssl_ca]

      http.verify_mode = OpenSSL::SSL::VERIFY_PEER

    else

      http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    end

    if SETTINGS[:ssl_cert] && !SETTINGS[:ssl_cert].empty? && SETTINGS[:ssl_key] && !SETTINGS[:ssl_key].empty?

      http.cert = OpenSSL::X509::Certificate.new(File.read(SETTINGS[:ssl_cert]))

      http.key  = OpenSSL::PKey::RSA.new(File.read(SETTINGS[:ssl_key]), nil)

    end

  end

  res = http.start { |http| http.request(req) }

  raise "Error retrieving node #{certname}: #{res.class}" unless res.code == "200"

  res.body

end

脚本的前面都是在构造一个http的对象...,直接看倒数第三行

可以清楚的看到一个判断,然后抛出异常,没有任何的重试机制....,为此我很确信我的web,它如果能有一次重试的机会,那么下一次一定能正常获得返回值,  然后我就给了它很多次的机会。。。

  #raise "Error retrieving node #{certname}: #{res.class}" unless res.code == "200"

  while res.code != "200"

    res = http.start { |http| http.request(req) }

    puts "Error retrieving node #{certname}: #{res.class}"    sleep 3

  end

这时有些人可能会想,while 循环,加3秒重试,,如果一直不成功怎么办?

在脚本最开头会有配置timeout的地方,在timeout到了之后,会关闭http连接,然后读取cache。

      # query External node

      begin

        result = ""

        timeout(tsecs) do

          result = enc(certname)

          cache(certname, result)

        end

      rescue TimeoutError, SocketError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED

        # Read from cache, we got some sort of an error.

        result = read_cache(certname)

这段代码可以很清晰的看出,在timeout没超时时会调用enc这个方法返回结果,然后在调用cache方法写入到cache文件

如果超时或http错误,则读取cache,但是这里的异常不包括...,HTTP的...,如果如果是4XX的错误,不会触发读取cache的异常..

Puppet 学习系列:

Puppet 学习一:安装及简单实例应用 http://www.linuxidc.com/Linux/2013-08/88710.htm

Puppet学习二:简单模块配置和应用 http://www.linuxidc.com/Linux/2013-08/88711.htm

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何在 Ubuntu 15.04 中安装 puppet
在本教程里,我们将使用2台运行 ubuntu 15.04 “Vivid Vervet" 的主机,一台作为主控服务器,另一台作为 puppet 的代理节点。下面是我们将用到的服务器的基础信息。
用户8989785
2021/09/09
1.1K0
WordPress Popular Posts 5.3.2 远程代码执行
https://github.com/rapid7/metasploit-framework
Khan安全团队
2021/12/22
9720
【Puppet】安装配置Puppet
文章目录 一、参考链接 二、Puppet介绍 三、Puppet安装 安装准备 安装master端 安装node端 Node端向Master端发起认证 一、参考链接 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 puppet镜像-puppet下载地址-puppet安装教程-阿里巴巴开源镜像站 序 | Puppet运维实战 (gitbooks.io) 二、Puppet介绍 Puppet是IT自动化的行业标准。 以一种简单而强大的方式管理和自动化更多的基础架构和复杂的工作流。 三、Puppet安装
宝耶需努力
2022/12/13
4750
Puppet常识梳理
Puppet简单介绍 1)puppet是一种Linux/Unix平台下的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。 2)Puppet是开源的基于Ruby的系统配置管理工具,puppet是一个C/S结构。所有的puppet客户端同一个服务器端的puppet通讯,每个puppet客户端每半小时(可以设置)连接一次服务器端,下载最新的配置文
洗尽了浮华
2018/01/22
2K0
Puppet常识梳理
Python 获取 NCBI 基因名 SSL 证书异常?
即想要通过 Python 在线获取某个转录本对应的基因 symbol 时,发现出现 SSL 无法获取本地证书:unable to get local issuer certificate (_ssl.c:1056)!
章鱼猫先生
2021/10/15
1K0
Python 获取 NCBI 基因名 SSL 证书异常?
MySQL8 中文参考(二十六)
MySQL 支持使用ACCOUNT LOCK和ACCOUNT UNLOCK子句对用户账户进行锁定和解锁,用于CREATE USER和ALTER USER语句:
ApacheCN_飞龙
2024/06/26
7150
Puppet3.1 Master Client安装测试
Linux master.inno.com 2.6.32-279.22.1.el6.centos.plus.x86_64 #1 SMP Wed Feb 6 05:16:56 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
三杯水Plus
2018/11/14
6730
借助Gotify轻松实现MSF上线提醒
官方已于5月14日上午将代码整合进官方项目~所以,友友们只需要搭建好自己的Gotify然后直接加载官方的session_notifier插件就可以了~
FB客服
2021/07/02
4.5K0
如何在Ubuntu上为MySQL配置SSL/TLS
MySQL 是最流行的关系型数据库管理系统,MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中。随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用,比如维基百科、Google和Facebook等网站 。APT包管理器已经减少了启动和运行MySQL的一些步骤,但是仍然有一些配置应该在安装后完成。
你在哪里
2018/08/08
4.2K0
[NodeJS]创建HTTP、HTTPS服务器与客户端
当从客户端请求流中读取到数据时会触发data事件,当读取完客户端请求流中的数据时触发end事件。
奋飛
2019/08/15
5.6K0
使用Burp拦截Flutter App与其后端的通信
Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。Flutter应用程序是用Dart编写的,这是一种由Google在7年多前创建的语言。
FB客服
2019/10/10
2.9K0
使用Burp拦截Flutter App与其后端的通信
使用telegraf收集监控接入Prometheus
Prometheus 官方exporter:https://prometheus.io/download/ telegraf 官方下载地址:https://github.com/influxdata/telegraf
用户6792968
2022/06/27
6K1
puppet 自定义facter
在使用puppet作为配置管理工具的同时,facter是一个非常有用的系统盘点工具,这个工具可以通过一些预先设定好变量定位一台主机,比如可以通过变量lsbdistrelease便可以知道当前系统的版本号,通过osfamily便可以知道系统是RedHat还是SLES,还是其它等等。但是这些预先设定好的变量毕竟有限,在整个自动化运维过程中,由于系统应用的多样性,更多需要通过应用的名称、角色的名称进行标示,这样就需要自定义一些fact并赋值到每个节点上去,相当于给节点打上标签。
用户5760343
2022/05/23
7440
技术分享 | MySQL : SSL 连接浅析
爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。
爱可生开源社区
2022/04/06
3.8K0
技术分享 | MySQL : SSL 连接浅析
python requests 如何达到关闭强制urlencode的效果
requests库是python中常用的网络库,有着比原生urllib更丰富的功能和更易用的接口,但是并不一定有相当的灵活性。这不现在就有一个问题。
一次次尝试
2019/02/23
9K3
MySQL Router Restful API (中文)
MySQL 路由器允许应用程序对后端 MySQL InnoDB Cluster 的 MySQL 服务器进行透明路由访问。
MySQLSE
2022/11/21
2.5K0
MySQL Router Restful API (中文)
puppet简介、安装配置、语法、命令与实例
puppet主要使用于自动化运维方面,对于拥有众多服务器需要管理的管理员来说,puppet是个不错的选择,使其管理更加轻松,容易。其设计的是c/s建构,可以一个master和多个client。通过master可管理配置客户端的文件、用户、cron任务、软件包、系统服务等。客户端默认半小时向master请求一次以使其与master配置同步,从而使管理员在master上设置配置就可以实现对于众多客户端机器的管理。
菲宇
2019/06/13
3.6K0
puppet简介、安装配置、语法、命令与实例
如何创建 http2 node App
openssl genrsa -des3 -out server.key 2048
JS菌
2019/07/23
1K0
如何创建 http2 node App
「技术架构」设置Squid转发代理或者正向代理
如果您正在阅读这篇文章,您可能会因为缺少与Squid相关的信息而感到沮丧,Squid是一种非常流行的转发代理。这些令人沮丧的事情包括:在小的软件修订之后出现的重大的可用性变化,对幕后发生的事情的误解,以及真正糟糕的文档。这是一个全面的入门,它将使你和鱿鱼。
架构师研究会
2019/11/11
2.1K0
「技术架构」设置Squid转发代理或者正向代理
Pupet自动化管理环境部署记录
废话不多说了,下面记录下Puppet在Centos下的部署过程: puppet是什么 puppet是一种基于ruby语言开发的Lnux、Unix、windows平台的集中配置管理系统。它使用自有的puppet描述语言,可管理配置文件file、用户user、cron任务、软件包、系统服务等系统实体。 puppet把这些系统实体称之为资源,puppet设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。 puppet依赖于C/S(客户端/服务器)的部署架构。它需要在puppet服务器上安装puppet-
洗尽了浮华
2018/01/22
1K0
相关推荐
如何在 Ubuntu 15.04 中安装 puppet
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档