Ansible-playbook与Terraform的协作
过程
每次进行蓝绿部署的自动化时,全球IP每次都会更改,手动更改ansible的主机变得繁琐。
即使有人告诉我只要投资EIP就可以,但我没有钱。
曾经做过的事情
-
- Terraform(EC2モジュール)
デプロイ時のグローバルIPを取得
ec2_ip_rewrite.sh
PythonのconfigureParserで読める形に整形
ec2ini_to_ansible_host.py
ansibleのインベントリファイルにあるhostsファイルへ書き込み
请根据环境进行调整,本文档假设您创建了两个EC2实例。
resource "null_resource" "output_instance_grobal_ip" {
triggers = {
xxx = aws_instance.xxx.public_ip
}
provisioner "local-exec" {
command = "echo EC21A ${aws_instance.xxxx.public_ip} >> ec2_ip.txt"
}
}
EC21A xx.xx.xx.xx
EC21C xx.xx.xx.xx
#!/bin/bash
file_path="./ec2_ip.txt"
# 変数でEC2のIDを取得する
ec2_ip_a=$(grep 'EC2-1A' ./ec2_ip.txt | awk '{print $2}')
ec2_ip_c=$(grep 'EC2-1C' ./ec2_ip.txt | awk '{print $2}')
# 挿入するテキストを指定する
new_text="[EC21A]\nhostname=${ec2_id_a}\n[EC21C]\nhostname=${ec2_id_c}"
# 挿入するテキストを含めた新しいファイルを作成する
awk -v text="$new_text" '
{
if (NR > 2) {
prints
}
if (NR == 1) {
print text
}
}
' "$file_path" > /tmp/file.txt
# 新しいファイルを元のファイルに戻す
cp /tmp/file.txt /tmp/ec2_ip.ini
它会被设置成Python的configparser可以读取的格式。
[EC21A]
hostname=xx.xx.xx.xx
[EC21C]
hostname=xx.xx.xx.xx
然后准备hosts文件的模板。 (然後準備hosts文件的模板。)
[EC21A]
@@@EC21A@@@ ansible_user=ec2-user ansible_ssh_private_key_file="xxxx.pem"
[EC21C]
@@@EC21C@@@ ansible_user=ec2-user ansible_ssh_private_key_file="xxxx.pem"
将上述的ec2_ip.ini和hosts模板文件加载到以下的Python程序中
import configparser
import shutil
class hosts_rewrite():
def __init__(self):
source_file = "./hosts_rewrite.template"
destination_file = "./hosts"
shutil.copyfile(source_file, destination_file)
self.input_file = "./hosts"
config = configparser.ConfigParser()
config.read('/tmp/ec2_ip.ini')
self.replace_text1 = '@@@EC21A@@@'
self.replace_text2 = '@@@EC21C@@@'
self.new_text1 = config.get('EC21A','hostname')
self.new_text2 = config.get('EC21C','hostname')
def ec2grobalip_add_ansible(self):
with open(self.input_file, 'r') as file:
content = file.read()
content = content.replace(self.replace_text1, self.new_text1)
with open(self.input_file, 'w') as file:
file.write(content)
with open(self.input_file, 'r') as file:
content = file.read()
content = content.replace(self.replace_text2, self.new_text2)
with open(self.input_file, 'w') as file:
file.write(content)
if __name__ == "__main__":
main = hosts_rewrite()
main.ec2grobalip_add_ansible()
print("terraform→ansible-hosts OK")
将生成的hosts文件放入Ansible的清单中,然后执行 ansible-playbook -i hosts site.yml命令,就能达到幸福了。已经实现了。
在ansible.cfg文件中,如果不将ssh_args = -o StrictHostKeyChecking=no%添加进去,就无法实现完全自动化,因此请注意ssh指纹确认。
我正在应用上次投稿时创建的Shell和Python代码。
https://qiita.com/sannchan/items/189ba0ca47dcd343b9b1