前言

一直在做calamari的相关的一些打包和安装的工作,都是业余弄的东西,所以并没有仔细的进行功能点的验证测试,正好ceph社区群里面有人问了个问题

calamari上是不是能看到ceph的version?

对于这个问题,好像确实没有见到过,而之前正好有个页面看到是空的,当时还不清楚这个是什么用的

而另外一位群友贴出了这个地方的是有值的,这个地方是有BUG的,在咨询了相关的问题描述以后,我们来看下,可以如何解决这个问题

问题解决过程

salt的软件版本:

  • salt-master-2015.8.1-1.el7.noarch
  • salt-2015.8.1-1.el7.noarch
  • salt-minion-2015.8.1-1.el7.noarch

问题描述

calamari的salt-master节点在读取

/var/cache/salt/master/minions/{minion-hostname}/data.p

的时候有权限问题,在修改权限以后,可以读取到了,但是在重启了salt-minion以后,这个文件会被更新,然后权限又变成无法读取的

相关知识补充

Grains - salt-minion 自身的一些静态信息

salt '*' grains.ls       # 查看 grains 分类
salt '*' grains.items # 查看 grains 所有信息
salt '*' grains.item os # 查看 grains 某个信息
salt '*' grains.get os

上面的是salt-minion的静态信息的查询的相关的命令,salt-minion在进行重启的时候会将一些静态的信息推送到salt-master上面去,而这个生成的信息正好就是我们上面提出有权限问题的data.p这个存储的文件的,那么解决问题就是修改这个地方的权限的问题了

修改salt-master代码

这个问题通过修改salt-master的master.py代码可以解决

写入这个grains信息的代码在/usr/lib/python2.7/site-packages/salt/master.py这个文件当中,代码段如下:

  def _pillar(self, load):
···
if self.opts.get('minion_data_cache', False):
cdir = os.path.join(self.opts['cachedir'], 'minions', load['id'])
if not os.path.isdir(cdir):
os.makedirs(cdir)
datap = os.path.join(cdir, 'data.p')
tmpfh, tmpfname = tempfile.mkstemp(dir=cdir)
os.close(tmpfh)
with salt.utils.fopen(tmpfname, 'w+b') as fp_:
fp_.write(
self.serial.dumps(
{'grains': load['grains'],
'pillar': data})
)
# On Windows, os.rename will fail if the destination file exists.
salt.utils.atomicfile.atomic_rename(tmpfname, datap)
return data

就是这个函数就是负责这个文件写入的,我们只在这个代码里面增加一个文件的权限的控制,在 salt.utils.atomicfile.atomic_rename(tmpfname, datap)这行之上增加一行代码os.chmod(tmpfname, 0o644)

 def _pillar(self, load):
···
if self.opts.get('minion_data_cache', False):
cdir = os.path.join(self.opts['cachedir'], 'minions', load['id'])
if not os.path.isdir(cdir):
os.makedirs(cdir)
datap = os.path.join(cdir, 'data.p')
tmpfh, tmpfname = tempfile.mkstemp(dir=cdir)
os.close(tmpfh)
with salt.utils.fopen(tmpfname, 'w+b') as fp_:
fp_.write(
self.serial.dumps(
{'grains': load['grains'],
'pillar': data})
)
# On Windows, os.rename will fail if the destination file exists.
os.chmod(tmpfname, 0o644)
salt.utils.atomicfile.atomic_rename(tmpfname, datap)
return data

修改好了以后,重启下salt-master,然后重启下salt-minion

systemctl restart salt-minion

检查权限,已经看到权限变成了644了

[root@lab8106 ~]# ll /var/cache/salt/master/minions/lab8106/data.p
-rw-r--r-- 1 root root 5331 Jan 9 15:33 /var/cache/salt/master/minions/lab8106/data.p

现在再看下前台页面效果:

问题解决

总结

calamari有一些各种各样的小问题,总体上还是一款非常简洁漂亮的管理界面,在没有监控系统的情况下,还是一个不错的选择

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-01-09

解决calamari无法获取节点信息的bug的更多相关文章

  1. wx.createSelectorQuery() 获取节点信息 获取不到解决方法

    场景:一个气泡的宽度由加载来的数据填充所决定,不定宽,     wx.createSelectorQuery().selectAll('.talkbubble').boundingClientRect ...

  2. Selenium 获取节点信息

    Selenium 可以通过 find_element() 找到指定的节点,Selenium 也提供了相关的方法和属性来直接提取节点信息,如属性.文本等 from selenium import web ...

  3. XML获取节点信息值

    XmlDocument doc = new XmlDocument(); doc.LoadXml(sreturn); XmlNode xNode = doc.SelectSingleNode(&quo ...

  4. 小程序文案过长,‘收起/展开’文字,createSelectorQuery 获取节点成功,boundingClientRect 返回信息null

    问题描述: wxml中id是动态生成的. 获取节点信息是在onReady生命周期函数内延时500ms执行的,select(id)可以获取全部节点信息,boundingClientRect (rect) ...

  5. 微信小程序在组件中获取界面上的节点信息wx.createSelectorQuery

    节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: const query = wx.cre ...

  6. 小程序插件使用wx.createSelectorQuery()获取不到节点信息

    发现小程序一个bug, 在小程序插件中使用wx.createSelectorQuery()获取不到节点信息,需要在后面加入in(this) 例如: const query = wx.createSel ...

  7. uni-app——小程序插件使用wx.createSelectorQuery()获取不到节点信息

    发现小程序一个bug, 在小程序插件中使用wx.createSelectorQuery()获取不到节点信息,需要在后面加入in(this) 例如: const query = wx.createSel ...

  8. 获取BT节点信息bittorrent-discovery

    获取BT节点信息bittorrent-discovery   BT/磁力都是常见的P2P下载方式.用户作为一个节点node从其他用户node或者peer获取文件数据,以完成下载.bittorren-d ...

  9. 小程序框架之视图层 View~获取界面节点信息

    获取界面上的节点信息 WXML节点信息 节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: ...

随机推荐

  1. 50种编程语言,一句 “Hello, World”!展现编程语言七十年发展!

    mod confinment { use std::os::raw::{c_char}; extern "C" { pub fn puts(txt: *const c_char); ...

  2. Vagrant系列(一)----win10搭建Vagrant+VirtualBox环境_

      一.Vagrant是什么?     vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境.    通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的 ...

  3. php闭包作为函数参数

    <?php function test(Closure $call) { $a = 63; $b = 22; echo "hello"; echo $call($a,$b); ...

  4. 转 RabbitMQ 入门教程(PHP版) 使用rabbitmq-delayed-message-exchange插件实现延迟功能

    延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...

  5. linux(centos8):使用namespace做资源隔离

    一,namespace是什么? namespace 是 Linux 内核用来隔离内核资源的方式. 它是对全局系统资源的封装隔离, 处于不同 namespace 的进程拥有独立的全局系统资源, 改变一个 ...

  6. spring-boot-route(二十)Spring Task实现简单定时任务

    Spring Task是Spring 3.0自带的定时任务,可以将它看作成一个轻量级的Quartz,功能虽然没有Quartz那样强大,但是使用起来非常简单,无需增加额外的依赖,可直接上手使用. 一 如 ...

  7. Helium文档8-WebUI自动化-wait_until等待元素出现

    前言 wait_until等待某个条件为真才继续往下执行.默认的超时时间为10s,每0.5查询一次,这俩参数选填.可以设置超时时间和轮询间隔. 可以作为添加后校验元素是否存在的场景 入参介绍 def ...

  8. MySQL数据库基础-2范式

    数据库结构设计 范式 设计数据库的规范 第12345范式,凡是之间有依赖关系. 关系模型的发明者埃德加·科德最早提出这一概念,并于1970 年代初定义了第一范式.第二范式和第三范式的概念 设计关系数据 ...

  9. linux 常用命令及零散知识

    磁盘管理常用命令 fdisk -l //展示磁盘使用情况 df -h      //展示目录挂载情况 du -sh   //查文件.文件夹的总大小 scp /home/a.txt /home/b.tx ...

  10. [OGeek2019]bookmanager

    做过的代码量最大的一个题 说出的好也好,不好也不好,利用点很简单,就是一个大规模的heapoverflow,就是逆起来有点儿难度 思路很简单,就是利用堆溢出覆盖结构体中的指针为__free_hook, ...