経緯
ブルー・グリーンデプロイの自動化なのに毎回毎回グローバルip
が変わってしまって、ansibleのhosts
を手で変更するのがめんどくさくなりました。
EIPを振ればいいとか言われてもお金がないので
やったこと
- Terraform(EC2モジュール)
- デプロイ時のグローバルIPを取得
- ec2_ip_rewrite.sh
- PythonのconfigureParserで読める形に整形
- ec2ini_to_ansible_host.py
- ansibleのインベントリファイルにあるhostsファイルへ書き込み
※xxxは環境に合わせて変更してください。ec2インスタンス2つを想定して作成してます。
main.tf(EC2モジュール) モジュールが2つの場合は2つに 1つにまとめてる場合は書き方を変えなくてはいけません。
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"
}
}
terraformから出力されるファイル ec2_ip.txt
EC21A xx.xx.xx.xx
EC21C xx.xx.xx.xx
ec2_ip_rewrite.sh
#!/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で読み込む形に整形されます。
ec2_ip_rewrite.shで生成される一時ファイルec2_ip.ini
[EC21A]
hostname=xx.xx.xx.xx
[EC21C]
hostname=xx.xx.xx.xx
そしてhostsファイルのテンプレートを用意します。
hosts_rewrite.template
[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プログラムに読み込ませます
ec2ini_to_ansible_host.py
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のフィンガープリント確認でて完全自動にならなくなるから気をつけて
前回投稿した時に作ったシェルとpythonを応用しています。
https://qiita.com/sannchan/items/189ba0ca47dcd343b9b1