конфигурационный файл aws terraform seed cloud во время развертывания

#amazon-web-services #nginx #terraform

Вопрос:

У меня есть инфра, которую я создаю с помощью terraform, которая имеет следующие ресурсы:

  • автоматическое масштабирование ec2
  • балансировщик нагрузки

Вся инфра была разработана с использованием модулей, которые я написал. Во время развертывания я предоставляю ec2 с помощью nginx и пишу файл nginx.conf, используя #cloud-config следующее:

Файл шаблона

 package_update: true package_upgrade: false  packages:  - nginx  write_files:  - content: |  # This is the new file  user www-data;  worker_processes auto;  pid /run/nginx.pid;   events {  worker_connections 768;  # multi_accept on;  }   http {  server_names_hash_bucket_size 128;  server {  listen 80; ## listen for ipv4; this line is default and implied  server_name ${output.elb_dns_name};  root /usr/share/nginx/html;  index index.html;   server_tokens off; # disable the Server nginx header    # enable gzip  gzip on;  gzip_disable "msie6";   gzip_comp_level 6;  gzip_min_length 1100;  gzip_buffers 16 8k;  gzip_proxied any;  gzip_types  text/plain  text/css  text/js  text/xml  text/javascript  application/javascript  application/x-javascript  application/json  application/xml  application/rss xml  image/svg xml;   location / {  # try_files $uri /index.html; # redirect all request to index.html  proxy_pass lt;my-domaingt;;   }  }  ##  # Basic Settings  ##   sendfile on;  tcp_nopush on;  tcp_nodelay on;  keepalive_timeout 65;  types_hash_max_size 2048;  # server_tokens off;   # server_names_hash_bucket_size 64;  # server_name_in_redirect off;   include /etc/nginx/mime.types;  default_type application/octet-stream;   ##  # SSL Settings  ##   ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE  ssl_prefer_server_ciphers on;   ##  # Logging Settings  ##   access_log /var/log/nginx/access.log;  error_log /var/log/nginx/error.log;   ##  # Gzip Settings  ##   gzip on;  gzip_disable "msie6";   # gzip_vary on;  # gzip_proxied any;  # gzip_comp_level 6;  # gzip_buffers 16 8k;  # gzip_http_version 1.1;  # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml rss text/javascript;   ##  # Virtual Host Configs  ##   include /etc/nginx/conf.d/*.conf;  include /etc/nginx/sites-enabled/*;  }    #mail {  # # See sample authentication script at:  # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript  #   # # auth_http localhost/auth.php;  # # pop3_capabilities "TOP" "USER";  # # imap_capabilities "IMAP4rev1" "UIDPLUS";  #   # server {  # listen localhost:110;  # protocol pop3;  # proxy on;  # }  #   # server {  # listen localhost:143;  # protocol imap;  # proxy on;  # }  #}  path: /etc/nginx/nginx.conf  runcmd: - nginx -s reload  

Цель этого образовательного проекта-научиться использовать балансировщик нагрузки, который является обратным прокси-сервером nginx.

Все работает нормально, но когда я создаю экземпляр и write_file server_name он жестко закодирован, это означает, что DNS-имя балансировщика нагрузки не будет совпадать.

Используя terraform, я могу извлечь имя dns_name ELB в выводе, но мне было интересно, как я могу поместить этот вывод в cloud config файл, чтобы он всегда подбирал правильное dns-имя?

Большое вам спасибо за вашу помощь/подсказку.

Обновить:

Файл шаблона данных это данные файла шаблона для конфигурации nginx.

 data "template_file" "nginx" {  template = file("./template/nginx.yaml") }  

В моем output.tf я установил этот вывод:

 output "elb_dns_name" {  value = module.load-balancer.ELB }  

если я запущу terraform apply , я смогу увидеть результат. поэтому я попытался использовать это в качестве заполнителя в моем файле conf, как это:

 server_names_hash_bucket_size 128;  server {  listen 80; ## listen for ipv4; this line is default and implied  server_name ${elb_dns_name};  root /usr/share/nginx/html;  index index.html;  

но если я запущу terraform apply, я получу следующую ошибку:

 Error: failed to render : lt;template_filegt;:26,31-37: Unknown variable; There is no variable named "output".   on dev.tf line 4, in data "template_file" "nginx":  4: data "template_file" "nginx" {   

Комментарии:

1. Можете ли вы поделиться источником для вашего data "template_file" ?

2. Ошибка выглядит очевидной Unknown variable; There is no variable named "output". , загляните в этот ресурс и посмотрите, что это за var, может быть, это опечатка?

3. @GrzegorzOledzki Спасибо вам за потраченное время, ребята. Исходный код файла шаблона-это первый блок кода в моем посте. И мне нужно передать имя dns_name ELB в server_name файл моего шаблона. У меня нет объявленной переменной, потому что мне нужно передать сам вывод. и тут я начинаю путаться. Я обновлю свой пост

4. Каково определение данных «template_file» «nginx»?

5. @Marcin большое тебе спасибо. Я только что обновил свой пост данными файла шаблона.

Ответ №1:

Я нашел свою проблему.

В моем файле шаблона данных отсутствовали переменные. Я добавил переменную следующим образом:

 data "template_file" "nginx" {  template = file("../dev/template/nginx.yaml")  vars = {  "output" = module.load-balancer.ELB    } }  

И в моем nginx.yaml я передал выходную переменную объявить следующим образом:

 server {  listen 80; ## listen for ipv4; this line is default and implied  server_name ${output};  root /usr/share/nginx/html;  index index.html;  

И я смог динамически заполнить файл yaml выходным значением.