当前位置 : 首页 » 互动问答 » 正文

在Ansible中,我可以将字典作为变量传递给云模块

分类 : 互动问答 | 发布时间 : 2017-09-28 19:55:09 | 评论 : 1 | 浏览 : 29 | 喜欢 : 0

我正在使用ec2_asg云模块更新Auto-Scaling组。我试图让它成为一个角色,所以我可以将它应用于多个剧本,并且我想知道是否可以将变量值作为变量传递。

没有变量,asg任务如下所示:

 ec2_asg:
  名称:“test_app”
  标签:
     - 环境:生产
     - 名称:test_app

我知道我也可以这样做:

 ec2_asg:
  名称:{{asg_name}}“
  标签:
     - 环境:“{{asg_tag_env}}”
     - 名称:“{{asg_tag_name}}”

但我很好奇,如果在我的group_vars中,我可以将所有标记信息作为var传递,即

 asg_tags:“{'tags':{'Environment':Production,'Name':test_app} }“ #选项1

or

 asg_tags:“{'Environment':生产,'名称':test_app}”#option2

当我尝试可以通过

#option1在ec2_asg模块中调用它时
 ec2_asg
   名称:“{{asg_name}}”
   “{{asg_tags}}”

这似乎不起作用,因为模块不理解字典的根索引是您在ec2_asg模块中指定的tags选项。
加载YAML时,我只是得到语法错误<notranslate >,如果我尝试

#option2  ec2_asg    名称:“{{asg_name}}”    标签:“{{asg_tags}}”

我从可信的说明中找到一个错误:

对于k,v在tag.items()中:\ nAttributeError:'str'对象没有属性'items'\ n“
这不支持,或者我不确定如何构造变量,所以ec2_asg模块正确读入标签并知道如何应用它们。

Either this isn't supported, or I'm not sure how to structure the variable so the ec2_asg module reads in the tags correctly and knows how to apply them.

回答(1)

  • 1楼
  • 首先,注意字典的tags is a list的值,每个字符都带有一个键:

    标记:
       - 环境:生产
       - 名称:test_app
    

    如果你将它粘贴到YAML解析器(如this one)中,则会看到相应的JSON为:

     {
      “标签”:[
        {
          “环境”:“生产”
        },
        {
          “名称”:“test_app”
        }
      ]
    }
    

    因此,无论赋值给变量,它都需要是一个类似的列表

    我现在无法自己测试ec2 *模块,但是如果您恰当地定义了一个变量,就像这样:

     asg_tags:
       - 环境:生产
       - 名称:test_app
    

    或者交替地(尽管我发现前者更容易阅读):

     asg_tags:[{“Environment”:“Production”},{“Name”:“test_app”}]
    

    然后你应该可以这样做:

      -  ec2_asg:
        名称:“test_app”
        标签:“{{asg_tags}}”

相关阅读: