私は基本的にはchef使いなのでセットアップはそっちでやっていますが、chefを使うためのAMIを作成する等、chefを使うまでにセットアップ作業が必要になるケースはあります。
cloud-initで設定ファイルやスクリプトファイルの配備をする場合は、適当なWebサーバに置いてそこから取得するのが一般的だと思いますが、それを用意するのがどうにもめんどくさい場合、cloud-initで出来たら…と思うことがあります。
というわけで、cloud-initで設定ファイル等をつくるために有効なテクニックをご紹介します。
ファイルに追記する
おなじみのこういうやつです。
echo "hoge hoge" >> /etc/settei.conf
これをcloud-initでやる場合はこうです
runcmd:
- [sh, -c, 'echo "hoge hoge" >> /etc/settei.conf']
ポイントはsh -c
を使っていることで、これを使うことでリダイレクトが使えるようになります。権限系の調整が必要な場合は、sudoでも使えるteeの方がいいかもしれません。
ファイルを新規生成する
こんなやつ。つまるところ、改行入りのテキストファイルを新規作成ないしは追記したい場合のやり方です。
cat > /etc/settei.conf <<EOF
# settei file
hoge=settei
foo=bar
EOF
これをcloud-initでやる場合はこうです
runcmd:
-
- sh
- -c
- |+
cat > /etc/settei.conf <<EOF
# settei file
hoge=settei
foo=bar
EOF
sh -c
を使うところはechoを使うときと一緒です。
ただ、catで放り込むようなケースだと改行が入っているので、|+
を使ってyamlに対して改行テキストとして認識させる必要があります。その場合[a, b, c]
な表記だと厳しいので、上記のように配列部分は[]
を使わず、インデントを下げた表現にしてます。改行テキストの中身部分もインデント位置はあわせます。(この表現で作られるファイルには、インデントした分のスペースは入らないのでご安心を)
ファイルの中身を修正する
これは何の工夫もないですが、一応書いておきます
sed -i 's/en_US/ja_JP/' /etc/sysconfig/i18n
これはこうなります
runcmd:
- [sed, -i, 's/en_US/ja_JP/', /etc/sysconfig/i18n]