部署期间的 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 种子云配置文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS 中使用 Terraform 实施蓝/绿部署而不损失容量