我有三个密切相关的应用程序,它们是从相同的源代码构建的 - 比方说APP_A,APP_B和APP_C.APP_C是APP_B的超集,APP_B又是APP_A的超集.
到目前为止,我一直在使用预处理器定义来指定正在构建的应用程序,它就像这样工作.
// File: app_defines.h
#define APP_A 0
#define APP_B 1
#define APP_C 2
Run Code Online (Sandbox Code Playgroud)
然后我的IDE构建选项指定(例如)
#define APPLICATION APP_B
Run Code Online (Sandbox Code Playgroud)
...在源代码中,我会有类似的东西
#include "app_defines.h"
#if APPLICATION >= APP_B
// extra features for APPB and APP_C
#endif
Run Code Online (Sandbox Code Playgroud)
然而,我今天早上在脚上射击并且浪费了很多时间,只需从一个文件中省略#include"app_defines.h"的行.一切编译得很好,但应用程序在启动时与AVs崩溃.
我想知道更好的处理方法是什么.以前,这通常是我认为#define可以使用的少数几次之一(无论如何都是在C++中),但我仍然很糟糕,并且编译器没有保护我.
c++ configuration-management c-preprocessor software-product-lines
Cfengine和Chef之间的功能有何不同?
我有一个类库,将从多个单独的可执行应用程序中调用.此类库需要知道要访问的数据库服务器的地址(以及许多其他配置选项,身份验证信息等).我有一个独立于类库的配置和管理应用程序,它还需要知道并设置这些配置选项.
通常的做法是在Windows注册表中存储这些特定于用户的配置选项,还是首选对类库使用典型的"App.config"XML方法,并允许配置工具更改和修改它?
我倾向于注册表方法,但我知道许多人对不使用它有意见.你会怎么做?
复杂的web-app可以具有大量用户和/或上下文特定的元和配置信息.例如,用户首选的结果集大小,时区,周初(周日/周一)等.
在加载时将变量传输到客户端应用程序的可能方法是什么(隐藏变量?嵌入某处的JSON?),每种方法的优点/缺点是什么?
我知道有几种方法可以同时解决问题,但我很好奇是否有人确定了要使用的好设计模式,或者他们可以分享的最佳实践.
虽然我更喜欢这方面的一般信息,但我的主要堆栈是jLAMP(jQuery,Apache,MySQL,PHP)
编辑:我已经有应用程序执行此操作,所以我不是在寻找快速修复,或建议完全不同的范例(如,不加载配置).我正在寻找与每个选项和优缺点的讨论,以便我可以调整我所拥有的内容,或者为新用户提供大量选项以从一开始就做出好的设计决策.谢谢!
这是我的目标文件:
Sonatype Nexus
# ==============
# This is the most basic configuration of Nexus.
# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-webapp=${bundleBasedir}/nexus
nexus-webapp-context-path=/nexus
# Nexus section
nexus-work=/opt/nexuswork
runtime=${bundleBasedir}/nexus/WEB-INF
Run Code Online (Sandbox Code Playgroud)
我知道使用正则表达式或简单的sed脚本有一种简单的方法:
sed -i 's/${bundleBasedir}\/..\/my\/second\/path\/002\/\/nexus/\/myfirstdir001\/g'
Run Code Online (Sandbox Code Playgroud)
但是,理想情况下,我更喜欢盐栈方式.
我希望它看起来像这样:
Sonatype Nexus
# ==============
# This is the most basic configuration of Nexus.
# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-webapp=/my/second/path/002/nexus # changed
nexus-webapp-context-path=/nexus
# Nexus section
nexus-work=/opt/nexuswork
runtime=/myfirstdir001/nexus/WEB-INF # changed
Run Code Online (Sandbox Code Playgroud)
我还没有弄清楚这方面的saltstack文档.
Saltstack的salt.states.file.replace文档似乎相当简单:
http://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#salt.states.file.replace
这是我试过的:
/opt/nexus-2.8.0/conf/nexus.properties
file: # state
- replace
- pattern: '\$\{bundleBasedir\}' # without escapes: '${bundleBasedir}/nexus' …
Run Code Online (Sandbox Code Playgroud) 有一种新兴的趋势是将全局状态从传统的"静态"配置管理工具(例如Chef/Puppet/Ansible)中删除,而是将配置存储在某些集中/分布式工具中,其中主要参与者似乎是:
这些工具中的每一个都有不同的工作方式,但原理是相同的:
MY_APP
")和环境(" DEV
"," PROD
"等).有一个优秀的Consul Java客户端,它可以很好地解释所有这些,并提供了充足的代码示例.
我对这些工具的理解是,它们建立在Zab,Paxos和Gossip等共识算法的基础之上,这些算法允许配置更新在整个节点中几乎以病毒式传播,最终保持一致.这样的想法存在,如果你有一个myapp
有20个节点的应用程序,比如myapp01
通过myapp20
,如果你做一个配置改变其中之一,这种变化自然会"蔓延"遍及20个节点在一段秒/分钟.
我的问题是:这些更新如何实际部署到每个节点?在任何客户端API(我上面链接的那个,ZooKeeper API或Eureka API)中都没有看到某种回调功能,可以设置并用于在集中服务(例如领事)时通知客户端cluster)想要推送和重新加载配置更新.
所以我问:这应该如何工作(动态配置部署和客户端重装)?虽然Consul的API似乎是最先进的恕我直言,但我对这三种工具中的任何一种都有任何可行的答案感兴趣.
configuration-management consul netflix-eureka apache-zookeeper
我正在使用 cloud-init/cloud-config 配置 OpenStack 框。我打算等到它完全配置好再开始使用它。
使用一些标记文件或检测 cloud-init 进程是否仍在运行,这并不难,尽管在每个 cloud-init 脚本中这样做似乎很麻烦。有什么推荐的方法吗?理想情况下,由 cloud-init 原生支持?
我开始使用 Ansible 编写一个剧本,为我们的应用程序部署临时环境。我试图了解对文件应用更改的最佳实践是否是在控制计算机上本地更改它们,然后将它们传播到远程服务器,或者是否应该在剧本内操作文件。
通过剧本操作文件在可读性和文档方面似乎更好,并且将整个配置过程保留在一个工具中以实现整个配置过程。另一方面,更改本地服务器上的文件更加容易和快捷。
解决这些问题的最佳方法是什么?
谢谢,亚龙。
我真的很喜欢你可以将同一本食谱的多个版本上传到Chef服务器的方式.您还可以在元数据文件中指定cookbook版本.例如
depends 'base-config', '= 1.2.1'
Run Code Online (Sandbox Code Playgroud)
我喜欢Salt.但是,我找不到任何版本管理和盐状态/公式的必备条件.我真的很惊讶,因为我认为这是配置管理的基本要求.我错过了什么吗?salt如何处理状态/公式文件版本?
我正在尝试找到一种方法来支持我的代码库中的两个不同版本的API.它们具有相同的封装名称,但在引擎盖下工作方式有很大不同(两个完全不同的系统).我怎样才能做到这一点?
这两个API也依赖于Bouncy Castle,但它们使用不同的版本.我该如何考虑这一点?
salt-stack ×2
ajax ×1
ansible ×1
c# ×1
c++ ×1
cfengine ×1
chef-infra ×1
cloud-init ×1
consul ×1
java ×1
jquery ×1
lamp ×1
nexus ×1
provisioning ×1
registry ×1
replace ×1