堆垛机AwsvpcConfiguration作为yaml传入,作为s接收

2024-06-01 10:19:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试启动并运行一个Stacker项目(在幕后使用Troposphere),我已经能够创建多个资源,但未能找到子网部分。我尝试了几种不同的方法将它们传递到blueprint类中,但我认为这一种方法最接近,而且与其他不会完全爆炸的实现类似。这个想法是接受这样子网的一些配置。在

在我的my_cluster.yaml中,我有:

 stacks:
 ...
  - name: cluster-networks
    description: "Networks for an ECS cluster"
    class_path: blueprints.networks.Networks
    variables:
      Networks: 
        InternalComms:
          AssignPublicIp: False
          SecurityGroups: 
            - sg-id
          Subnets: 
            - subnet-id1
            - subnet-id2

为了阅读这个配置,我有一个名为blueprints/networks.py的蓝图,其中包含以下内容:

^{pr2}$

如果您想知道我为什么要创建一个AwsvpcConfiguration对象,然后用这个对象创建一个NetworkConfiguration对象,原因是我在采用AwsvpcConfiguration对象之前试图通过使用NetworkConfiguration对象来传递这些信息,但它也没有起作用。我用这个file来指导我,因为这是定义这些对象的地方。下一步是build资源,因此当我通过运行以下命令执行此操作时:

stacker build path/to/my.env path/to/my_cluster.yaml

我得到一个错误,上面写着:

stacker.exceptions.ValidatorError: Validator 'AwsvpcConfiguration.create' 
failed for variable 'Networks' with value 
'{'InternalComms': {'AssignPublicIp': False, 'SecurityGroups': ['sg-id'], 'Subnets': ['subnet-id1', 'subnet-id2']}}': 
TypeError: _from_dict() argument after ** must be a mapping, not str

这可能是我在stacker、yaml和python方面的技能不足,但我被难住了,而且已经呆了一天左右了。在

我不知道如何将配置从yaml作为字典传递到blueprint中,就像我用同样的方式处理在AWS土地上成功创建的其他资源一样。如果你能给我指出错误,我将非常感激,并肯定会告诉圣诞老人你有多好。在


Tags: path对象方法yamlformy资源cluster
1条回答
网友
1楼 · 发布于 2024-06-01 10:19:59

对流层维护者/堆积者作者。所以有几件事:

  1. 您希望使用TroposphereType(ecs.NetworkConfiguration, many=True),因为这是您要创建的对象类型。在
  2. 在云服务器网络配置(https://github.com/cloudtools/troposphere/blob/master/troposphere/ecs.py#L71)是一个AWSProperty类型,这意味着它内部的值,如果使用“many”需要是字典列表per:http://stacker.readthedocs.io/en/latest/blueprints.html#property-types

所以我认为你想要的是你的配置

variables: Networks: - AwsvpcConfiguration: AssignPublicIp: False SecurityGroups: - sg-id Subnets: - subnet-id1 - subnet-id2

这是因为TroposphereType要求您传入类型所需的确切参数。NetworkConfiguration需要一个键,AwsvpcConfiguration,而您传递的值是AwsvcpConfiguration对象所期望的值。在

现在更大的问题是如何使用这些对象。在云形成/对流层中,属性类型不是单独创建的——它们用作实际资源的属性——在本例中是ecs.Service类型。您不打算在同一个蓝图中包含该服务吗?如果没有,您计划如何与这些服务所在的其他蓝图共享这些属性?在

一个更好的方法可能是有一个蓝图来构建服务以及它的NetworkConfiguration。然后,如果您希望使用该蓝图在多个堆栈之间轻松共享相同的网络配置,您可以使用YAML锚点执行以下操作:

common_network_configuration: &common_network_configuration - AwsvpcConfiguration: AssignPublicIp: False SecurityGroups: - sg-id Subnets: - subnet-id1 - subnet-id2

然后在变量中使用它,比如:

variables: << : *common_network_configuration

我希望这是有意义的-如果你有任何问题,你也可以随时联系我们的堆垛机松弛:https://empire-slack.herokuapp.com/

祝你玩得开心!在

相关问题 更多 >