Ansible
www.ansible.com より:
- Ansible は非常にシンプルな IT 自動化エンジンです。クラウドのプロビジョニングや設定管理、アプリケーションのデプロイ、イントラサービスのオーケストレーションなど、様々な IT にまつわる業務を自動化します。
目次
インストール
制御マシン (マスター) に ansible パッケージをインストールしてください。python2 も必要です。
自動デプロイや設定作業を適用したい管理マシン (ノード) には python が必要で、Python 3 に対応していないモジュールを使用する場合は python2 をインストールして Python の場所を Ansible に指定する必要があります。ノードには通信手段 (通常は SSH) もインストールしてください。ssh 鍵の設定をすることで Ansible が使いやすくなりますが、必須ではありません。
基本的な使い方
インベントリ
/etc/ansible/ansible.cfg
のデフォルト設定では、/etc/ansible/hosts
にインフラを定義します。3つのノードからなる小規模なクラスタを定義するインベントリの例:
/etc/ansible/hosts
[control] 192.168.12.1 [managed] 192.168.12.2 192.168.12.3
ファイルの中でノードごとに属性を割り当てることができます。詳しくは 公式ドキュメント を読んでください。
Ping
インベントリ内のノードが稼働しているか確認するには:
$ ansible all -m ping
Playbook
Playbook はインフラをデプロイ・設定するための強力なツールです。詳しくは 公式ドキュメント を読んでください。以下は全ての Arch Linux ノードでシステムアップグレードを実行する例です。まず YAML 形式の playbook ファイルを作成します (インデントは空白2つです):
syu.yml
--- - name: All hosts up-to-date hosts: control managed become: yes tasks: - name: full system upgrade pacman: update_cache: yes upgrade: yes
そして playbook スクリプトを実行:
$ ansible-playbook --ask-become-pass syu.yml
Vault
vault を使うことで機密データを playbook などに暗号化された状態で保存することができます。vault のパスワードはファイルに平文で保存できます。例えば myvaultpassword
という文字列を含んでいる vault_pass.txt
ファイルを Ansible で使用するには:
$ ansible-playbook site.yml --vault-id vault_pass.txt
vault_pass.txt
のパスワードを使って varname
という名前の変数の中身 the var content
を暗号化するには、以下のコマンドを使用します:
$ ansible-vault encrypt_string --vault-id vault_pass.txt 'the var content' --name varname
コマンドラインに直接変数の中身を入力したくない場合は、以下のコマンドを実行することで標準入力から中身を入力することができます (ctrl-d で入力を終了します):
$ ansible-vault encrypt_string --vault-id vault_pass.txt --stdin-name varname
上記のコマンドで playbook に挿入できる暗号化された変数が直接出力されます。暗号化された変数は YAML ファイルの中で他の変数と一緒に混ぜて使うことができます:
notsecret: myvalue mysecret: !vault | $ANSIBLE_VAULT;1.1;AES256 66386439653236336462626566653063336164663966303231363934653561363964363833313662 6431626536303530376336343832656537303632313433360a626438346336353331386135323734 62656361653630373231613662633962316233633936396165386439616533353965373339616234 3430613539666330390a313736323265656432366236633330313963326365653937323833366536 3462 other_not_secret: othervalue
パッケージ管理
Ansible には pacman によるパッケージのインストール・削除やシステムのアップグレードを扱うための pacman モジュール が存在します。
Arch User Repository (AUR) を扱うための ansible-aur などの非公式モジュールも GitHub にあります。
Ansible では root で ssh 接続することが前提となっていますが、AUR ヘルパーは root でビルドを実行することを許可しません。"you cannot perform this operation as root" というエラーで操作が失敗します。Ansible で自動化するために、aur_builder などという名前のユーザーを作成して、sudoers で pacman を使うのにパスワードを必要としないように設定することを推奨します。Ansible では以下のようにして設定することができます:
task.yml
- user: name=aur_builder - copy: path: /etc/sudoers.d/aur_builder-allow-to-sudo-pacman content: aur_builder ALL=(ALL) NOPASSWD: /usr/bin/pacman validate: /usr/sbin/visudo -cf %s
Ansible の become: yes
と become_user: aur_builder
パラメータと一緒に AUR ヘルパーや makepkg コマンドを利用してください。
ヒントとテクニック
ユーザーアカウントの作成
Ansible はユーザーアカウントを管理することができ、新しいアカウントを作成することもできます。user モジュール を使うことで playbook でアカウントを作成できます。任意でユーザーのパスワードを設定する password
引数が使えます。モジュールに指定するときパスワードはハッシュ化する必要があります。ハッシュフィルタ を使うことで Ansible の中でハッシュ化することが可能です:
- user: name: madhead password: "{{ 'user_password' | password_hash('sha512', 'mypermsalt') }}" shell: /usr/bin/nologin
ユーザーアカウントを作成するときは vault を使ってパスワードを暗号化することが推奨されています。#Vault を見てください。ただし、暗号化された変数は直接パイプで渡すことができないため、先に別の変数に渡してからパイプで渡す必要があります。
また、ハッシュ化は Ansible の外で行うことも可能です。以下のコマンドは user_password を MD5 と SHA512 でハッシュ化した値を返します:
$ openssl passwd -1 user_password
Python の場所を Ansible に指定する
Ansible は管理対象のマシンに Python を必要とします。デフォルトでは Ansible はリモートシステム上の /usr/bin/python
が 2.X あるいは 3.X バージョンの Python (特に 2.6 以上) だと想定しています。
使用するモジュールが Python 2 を必要とする場合、Ansible のインベントリファイルで ansible_python_interpreter
変数を設定して Python 2 の場所を Ansible に指定する必要があります。以下のようにホストグループを使って設定できます:
Inventory file
[archlinux] server1 server2 [debian] server3 [archlinux:vars] ansible_python_interpreter=/usr/bin/python2
Python の設定に関する詳細は [1], [2], [3] にあります。
トラブルシューティング
Unarchive
unarchive
モジュールは圧縮ファイルを解凍します。しかしながら tar ファイルのサポートが不十分で問題が発生することが github で報告されています。特に keep_newer
パラメータを yes
に設定した場合に、冪等性が保証されません。unarchive
モジュールで問題が起こるときは、代わりに zip フォーマットを使用すると良いでしょう。