0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ansible-playbookとterraformの連携

Posted at

経緯

ブルー・グリーンデプロイの自動化なのに毎回毎回グローバル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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?