Как прочитать IP-адреса/подсети из файла и использовать их в рецепте брандмауэра Chef

Я хочу использовать файл в локальной системе для заполнения правил брандмауэра UFW с помощью Chef. Рецепт firewall (https://supermarket.chef.io/cookbooks/firewall) имеет функциональность для этого, но я получаю ошибки при попытке передать переменную в блоки.

Если я жестко кодирую IP-адреса/подсети, все работает нормально. Если я помещу тот же самый IP/подсеть в файл, я получу ошибку Invalid IP Address.

В приведенном ниже коде первый блок firewall_rule будет выполняться, а второй и последующие блоки с "#{subnet}" — нет. Я также попытался просто передать переменную напрямую вместо замены строки с теми же результатами.

# Try to read from the client list of IPs

if File.exist?("/secure/targs/client.lst") then
  File.open("/secure/targs/client.lst", "r") do |subnets|
    subnets.each_line do |subnet|

      # Only allow outbound connection to in-scope targs
      firewall_rule 'client-out-ether' do
        interface     'eno1'
        destination   "10.0.0.128/25"
        direction     :out
        command       :allow
      end

      firewall_rule 'client-out-wifi' do
        interface     'wlp58s0'
        destination   "#{subnet}"
        direction     :out
        command       :allow
      end

      # Allow inbound connections from in-scope targs
      # Ideally we scope this to specific ports
      # OR remove this and do it manually as needed
      firewall_rule 'client-in-eth' do
        dest_interface  'eno0'
        source          "#{subnet}"
        command         :allow
      end

      firewall_rule 'client-in-wifi' do
        dest_interface  'wlp58s0'
        source          "#{subnet}"
        command         :allow
      end
    end
  end

  # Default allow all out on client interfaces if scope not defined
  else
    firewall_rule 'client-out-ether' do
      interface 'eno1'
      direction :out
      command   :allow
    end

    firewall_rule 'client-out-wifi' do
      interface 'wlp58s0'
      direction :out
      command   :allow
    end
end

Я предполагаю, что это проблема с синтаксисом, но, похоже, это нормальный синтаксис Ruby, который должен работать. Кажется, что рецепт считывает предоставленную переменную как литерал?


person Trevor Steen    schedule 01.02.2019    source источник


Ответы (1)


Файл вводит либо пробелы, либо управляющие символы. Выполнение subnet.strip решило проблему.

person Trevor Steen    schedule 01.02.2019