面料"树"喜欢部署

时间:2014-05-21 12:56:23

标签: python deployment fabric

我正试图把头靠近布料。

我们有不同的机器:

                      +--+ b2b (+config)            
       +------+ api --+                    
       |              +--+ b2c (+config)             
       |                                   
       |              +---+ service1 (+config)
       |              |                    
       |              +---+ service2 (+config)
all +---------+ web --+                    
       |              +---+ service3 (+config)        
       |              |                    
       |              +---+ service4 (+config)            
       |                                   
       |                                   
       +------+ db (+config)         
从命令行

我希望实现这样的目标:

fab -R prod prepare:all

这里-R prod定义用户和目标主机,如下所示:

'prod':
        {
            'user': 'some_prod_user',
            'hosts': ['some_prod_host1', 'some_prod_host2']
        }

此映射被视为配置并附加到每个节点。

现在,当我执行此命令时,我希望该节点“全部”调用它的所有子节点,并且它们会调用它们的子节点,直到所有节点都执行任务准备。

fab -R prod prepare:api.b2b

应该只准备b2b节点,仅此而已。

我已经在python(对象层次结构)中构建了整个东西,依此类推。

问题:当每个子类运行它的'prepare'方法时,如何构建整个'env'字典。

根据执行模型,当我到达子类时,整个'env.host_string'已经建立,我无法重新定义它们。

所以这让我思考 - 织物是否适合我?

任何帮助高度赞赏。

欢呼声 烫发

修改

看起来可以尝试类似:

all
prepare.sh
execute.sh
 - api
   prepare.sh -> calls [b2b|bc2]/prepare.sh
   execute.sh -> calls [b2b|bc2]/execute.sh
   - b2b
     fabfile.py
     prepare.sh -> invokes fab
     execute.sh -> invokes fab
   - b2c
     fabfile.py
     prepare.sh -> invokes fab
     execute.sh -> invokes fab
 - web
   prepare.sh
   execute.sh -> invokes fab
   - service1
     fabfile.py
     prepare.sh -> invokes fab
     execute.sh -> invokes fab
   - service2
     fabfile.py
     prepare.sh -> invokes fab
     execute.sh -> invokes fab
 ... you get the idea

现在我可以在顶层调用prepare.sh并将子链级联下来。每个孩子调用所有子模块prepare.sh。我也可以单独调用每个节点。

你觉得怎么样?

烫发

1 个答案:

答案 0 :(得分:0)

一般情况下,我建议使用单个入口点,以便单个fab命令行可以执行任何操作。它可能由一组taskargumenttask组成,但通常只有一个命令行。

我通常做的是以下内容:

  1. 定义表示每台计算机环境定义的task
  2. 定义代表我要采取的每项操作的task
  3. (可选)定义定义task种类的groupings,即服务,然后调用服务机器的所有task,切断每个环境之间的环境。
  4. 通过这种方式,您可以使用单个fab命令来指定各种组合,因为每个环境和操作本身都是task,它实际上是{{1}的主要单位工作(实际上只是一个Python函数,有一个框架可以帮助远程执行等)。

    Fabric命令将组合成:fab等。

    我认为,您可以根据我在上面提到的服务之类的fab <env1> <task1> <task2> <env2> <task1> <task2>种类,将您的层次结构编入概念中。

    问题 prepare.sh execute.sh 正在做什么?