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

广告
将在 10 秒后关闭
bannerAds