部署期间的 aws terraform 种子云配置文件

Posted

技术标签:

【中文标题】部署期间的 aws terraform 种子云配置文件【英文标题】:aws terraform seed cloud config file during deployment 【发布时间】:2022-01-04 12:25:59 【问题描述】:

我有一个使用 terraform 创建的基础设施,其中包含以下资源:

ec2 自动缩放 负载均衡器

整个基础设施都是使用我编写的模块开发的。 在部署期间,我使用 nginx 配置 ec2 并使用 #cloud-config 编写 nginx.conf 文件,如下所示:

模板文件

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 <my-domain>;

                
            
            ##
            # 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 我可以在输出中提取 ELB dns_name,但我想知道如何在 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 : <template_file>: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" 

【问题讨论】:

你能分享你的data "template_file"的来源吗? 错误看起来很清楚Unknown variable; There is no variable named "output". 看看那个资源,看看那个 var 是什么,可能是那个错字吗? @GrzegorzOledzki 谢谢你们的时间。模板文件的源代码,是我博文的第一段代码。我需要将 ELB dns_name 传递到模板文件中的 server_name 中。我没有声明变量,因为我需要传递输出本身。在这里我感到困惑。我会更新我的帖子 data "template_file" "nginx" 的定义是什么? @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 文件播种。

【讨论】:

以上是关于部署期间的 aws terraform 种子云配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Terraform + AWS ECS,持续部署流程?

写在前面-Terraform

如何在 AWS 中使用 Terraform 实施蓝/绿部署而不损失容量

使用Terraform部署代码和管理配置

如何使用 AWS Lambda 脚本通过 Terraform 部署 AWS 基础设施

Terraform 学习总结—— 基于 AWS 云平台上的 Terraform 实战