Как перебрать полный массив хэшей в ruby ​​- только первый найден - PullRequest
0 голосов
/ 25 октября 2019

У меня есть шаблон облачной информации cfndsl и файл yaml с входными значениями. Когда я пытаюсь сгенерировать облачную информацию, неожиданно генерируется только первый элемент значения массива (из хэша).

Что я делаю не так?

Я пытался изменить различные разделы файла yamlи формат кода cfndsl, но все еще получающий только первый блок.

Мой файл Yaml имеет хэш следующим образом

SecurityGroupIngresss:
  - FromPort: 11211
    IpProtocol: 'tcp'
    CidrIp: '10.244.17.0/24'
    ToPort: 11211
  - FromPort: 11211
    IpProtocol: 'tcp'
    CidrIp: '10.244.18.0/24'
    ToPort: 11211
  - FromPort: 11211
    IpProtocol: 'tcp'
    CidrIp: '10.244.19.0/24'
    ToPort: 11211
  - FromPort: 11211
    IpProtocol: 'tcp'
    CidrIp: '10.244.16.0/21'
    ToPort: 11211

, а файл cfndsl имеет следующий раздел

    securityGroupIngresss.each do |securityGroupIngress|
      if !securityGroupIngress.nil?
        Resource(:SecurityGroupIngress) do
          Type('AWS::EC2::SecurityGroupIngress')
          Property('Description', FnJoin(' ', ['Security Ingress for MemCache Stack', Ref('AWS::StackName')]))
          securityGroupIngress.each do |key,value|
            Property("#{key}", "#{value}")
          end            
          Property('GroupId', Ref('SecurityGroup'))
        end
      end
    end

Толькополучить один блок кода, как показано ниже:

    "SecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "Description": {
          "Fn::Join": [
            " ",
            [
              "Security Ingress for MemCache Stack",
              {
                "Ref": "AWS::StackName"
              }
            ]
          ]
        },
        "FromPort": "11211",
        "IpProtocol": "tcp",
        "CidrIp": "10.244.17.0/24",
        "ToPort": "11211",
        "GroupId": {
          "Ref": "SecurityGroup"
        }
      }
    },

Обновление: в CFNDSL я получаю securityGroupIngresss переменную как:

securityGroupIngresss = external_parameters.fetch(:SecurityGroupIngresss)

Ref здесь

1 Ответ

0 голосов
/ 25 октября 2019

Наконец я могу решить это. Я изменил код следующим образом:

securityGroupIngresss = external_parameters.fetch(:SecurityGroupIngresss, {})

и

    securityGroupIngresss.each_with_index do |securityGroupIngress, index|
      if !securityGroupIngress.nil?
        EC2_SecurityGroupIngress(name.capitalize + 'Ingress' + "#{index}") do
          securityGroupIngress.each do |key, val|
            Property("#{key}", "#{val}")
          end
          Property('GroupId', Ref('SecurityGroup'))
        end
      end
    end

Теперь CFNDSL генерирует код для всех блоков моего ввода. Спасибо всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...