Ansible-vaultについて

Article:

柴田です。こんにちは。

Ansible-vault

Ansibleには vault という機能があります。 Ansibleを使って「ユーザ追加」や「MySQLインストール」など行うことはあると思います。 その際、パスワードも指定のパスワードを設定すると思います。 ホスト毎に違うパスワードを設定したりするかと思います。

通常、サーバ固有の情報は、「vars.yml」に記述します。

しかしパスワードは機密情報のため、生のテキストでおいておきたくないケースがあります。 いつだれがplaybookを覗くとも限りません。

そこで、vaultを使います。 「vars.yml」の代わりに、パスワードのような機密情報は「vault.yml」に記述します。

以下は、サンプルです。 host_vars以下に、3つのホストがあり、それぞれ「vars.yml」と「vault.yml」を持っている図です。

(サンプル)
├── host_vars
│     ├── dev1
│     │      ├── vars.yml  ← こちらはいわゆるホスト固有の変数です。
│     │      └── vault.yml ← valrs.ymlと並ぶ形で、機密情報(vault.yml)を置いておけます。
│     ├── dev2
│     │      ├── vars.yml
│     │      └── vault.yml
│     └── dev3
│            ├── vars.yml
│            └── vault.yml
├── hosts.yml
└── site.yml

vault.yml に 機密情報を記述

vault.ymlに機密情報を書いてみます。

以下は、dev1/vault.ymlに、ユーザ情報とMySQLのユーザ情報を記述した例です。

---
vault_linux:
  users_list:
    - user: test1
      group: wheel
      password: HOGE
    - user: test2
      group: wheel
      password: HOGEHOGE

vault_database:
  users_list:
    - user: dbuser1
      password: HOGEHOGEHOGE
      host: "%"
      database: hogedb
      privileges: "ALL PRIVILEGES"
    - user: dbuser2
      password: HOGEHOGEHOGEHOGE
      host: "%"
      database: hogedb
      privileges: "SELECT,UPDATE,INSERT,DELETE"
  default_user:
    user: root
    password: HOGEHOGEHOGEHOGEHOGE

vault.yml を暗号化する

コマンド
ansible-vault encrypt host_vars/dev1/vault.yml
続けてパスワード入力
New Vault password: (ここでパスワードを打ちます。)
Confirm New Vault password: (ここでパスワードを打ちます。)
Encryption successful
※パスワードは忘れずに!

暗号化された vault.yml の中身。 以下サンプルです。

$ANSIBLE_VAULT;1.1;AES256
65636435383639376636393965303564346636666332353761353435396633343762316431313435
3863396362386561383363336135373935383161616331660a366436393438306231373561653830
61396164623734633363663033646437353730653834643839346138666237303532653833393039
6636373730343639640a363831383161383335653364333130343233626630373836306634643438
61373465663333313536656663333234653931623433353062666164373238303139313537356330
37353964306563303838336139623235333261386437633736346135656661363661326437663535
62393433336538333565636162343461323534343864343163396631326661333232383730373431
65633335373231303432663966653235343263313634323731646562346137333236663562633632
62396464653935333761616438633066633362633030633564656166373763363164393562393732
63353661366665656638663938623336646433656437386265353230323963663661343631363933
63613038646465633763663166643836346137373365633062313664643935323935323634393262
30386432366632393931633838313264343062383231323334313131343864333565356165646435
32323031636566303633663531643230336437663135656333643732636130646461616336613664
66343565383832316132336633623531623361383862366232356564643262376533366161386633
35356535643139663238306664346461646332316362393831393462393565303837616534336431
39386538646335653264626630643335656633643665393863626532633534353138373331636362
36633961373630313965636434333532303766313239353962363366316561376264373332303664
66656566623636333637363737373962326332623939623661636139326537323366386533336666
30663262376464356230366466346336633631336431363766363033653730346566623663393835
38356561613932353730313061356462313766316330626565663332666239313262373334333035
36343636393966323238636635303266313936316365653663313036343564343064613737316162
38346230646466383139653639343366336335346335656363383532616639306461623339376163
32633563336535663562623237383765363937633066336266376537333561363232323034363061
39616366356131333834343362373162623537373630663866663463613039343931613463623462
65663634623733306566376239343332393038363562643337333631633732303063303135383866
33383233323531636638613036653864373130316362366537336165313833323961316433326263
63623861653063306438383861323332356166663034656531306139316138653764306234313466
33626163383163653634623362366363356133316564303866393462663663646231333839656363
63646566346639646464643634653463663436306634653635383436303834623236

この状態ならplaybookをgitで管理しても機密情報が外に漏れることはないでしょう。

vault.yml を複合化する

コマンド
ansible-vault decrypt host_vars/dev1/vault.yml
Vault password: (ここでパスワードを打ちます。)
Decryption successful

vault.ymlは複合化され生データとなります。

TIPS

vault.ymlの変数は、vars.ymlで参照するとよい。

自分の場合は、暗号化されたvault.ymlにどのような情報を扱っていたか忘れるので、 機密情報はvault.ymlに記述し、vars.ymlからvault.ymlのすべての変数を参照するようにしています。 playbookからはあくまでvars.ymlの変数を参照する様にルールつけしておきます。 そうすることで、都度で複合化しなくてもvault.ymlに何が記述されていたか分かります。 また、vars.ymlに、固有の変数が全て記載されていることになるので一元管理されているとも言えます。

以下はvars.ymlがvault.ymlを参照している例です。

(注釈)
linux:
  users_list: "{{vault_linux.users_list}}" ← ここでvaultの変数を参照しています。
(注釈)

まとめ

  • ansibleは機密情報をvault.ymlとして暗号化できる。複合化もできる。
  • 暗号化パスワードは、忘れないように、別で管理する。
  • 暗号化されたvault.ymlは、gitなどソース管理に含めても安心。

かずにぃ

プログラマー

Ansible-vaultについて

お気軽に
お問い合わせください。

お問い合わせ