「Ansible」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「Tips and tricks」を「ヒントとテクニック」に置換)
(同期)
1行目: 1行目:
 
[[Category:システム管理]]
 
[[Category:システム管理]]
 
[[en:Ansible]]
 
[[en:Ansible]]
[http://docs.ansible.com/ docs.ansible.com] より:
+
[https://www.ansible.com/how-ansible-works www.ansible.com] より:
   
:''Ansible は IT 自動化ツールです。システムを設定ソフトウェデプロイして継続的なデプロや休止期間を挟まないローリグアップデートなど高度な IT 業務をオーケストラレートできます。''
+
:''Ansible は非常にシンプルな IT 自動化エンジンです。クラウドのプロビジョニングや設定管理、アプリケーションのデプロイ、イントラサビスのオーケスレーションなど、様々な IT にまつわる業務を自動化します。''
   
 
== インストール ==
 
== インストール ==
   
制御マシン (サーバーあるいはマスター) に {{Pkg|ansible}} パッケージを[[インストール]]してください。{{Pkg|python}} も必要です (Python バージョン 2.6, 2.7, 3.5 以上がサポートされています)
+
制御マシン (マスター) に {{Pkg|ansible}} パッケージを[[インストール]]してください。{{Pkg|python2}} も必要です。
   
自動デプロイや設定作業を適用したい管理マシン (クライアントあるいはスブ) には通信手段 (通常は [[SSH]]) インストールしてください。[[SSH_鍵#リモートサーバーに公開鍵をコピー|ssh 鍵の設定]]をすることで Ansible が使いやすくなりますが、必須ではありません。
+
自動デプロイや設定作業を適用したい管理マシン (ノード) には {{Pkg|python}} が必要で、''Python 3'' に対応してないモジュールを使用する場合 {{Pkg|python2}} をインルして [[#Python の場所を Ansible に指定する|Python の場所を Ansible に指定する]]必要があります。ノードには通信手段 (通常は [[SSH]]) インストールしてください。[[SSH_鍵#リモートサーバーに公開鍵をコピー|ssh 鍵の設定]]をすることで Ansible が使いやすくなりますが、必須ではありません。
   
 
== 基本的な使い方 ==
 
== 基本的な使い方 ==
47行目: 47行目:
 
そして playbook スクリプトを実行:
 
そして playbook スクリプトを実行:
   
# ansible-playbook --ask-become-pass syu.yml
+
$ ansible-playbook --ask-become-pass syu.yml
   
 
=== Vault ===
 
=== Vault ===
[http://docs.ansible.com/ansible/latest/playbooks_vault.html#using-vault-in-playbooks vault] を使うことで機密データを playbook などに暗号化された状態で保存することができます。vault のパスワードはファイルに平文で保存できます。{{ic|echo myvaultpassword > vault_pass.txt}} で作成して、以下のように Ansible で使うことが可能です:
+
[http://docs.ansible.com/ansible/latest/playbooks_vault.html#using-vault-in-playbooks vault] を使うことで機密データを playbook などに暗号化された状態で保存することができます。vault のパスワードはファイルに平文で保存できます。例えば {{ic|''myvaultpassword''}} という文字列を含んでいる {{ic|''vault_pass.txt''}} ファイルを Ansible で使るには:
   
# ansible-playbook site.yml --vault-id vault_pass.txt
+
$ ansible-playbook ''site.yml'' --vault-id ''vault_pass.txt''
   
{{ic|varname}} という名前の変数の中身 {{ic|varcontent}} を暗号化するには、以下のコマンドを使用します:
+
{{ic|''vault_pass.txt''}} のパスワードを使って {{ic|''varname''}} という名前の変数の中身 {{ic|''the var content''}} を暗号化するには、以下のコマンドを使用します:
   
# ansible-vault encrypt_string --vault-id vault_pass.txt varcontent -n varname
+
$ ansible-vault encrypt_string --vault-id ''vault_pass.txt'' '<i>the var content</i>' --name ''varname''
   
  +
コマンドラインに直接変数の中身を入力したくない場合は、以下のコマンドを実行することで標準入力から中身を入力することができます (ctrl-d で入力を終了します):
playbook に挿入できる暗号化された変数が直接出力されます。暗号化された変数は YAML ファイルの中で他の変数と一緒に混ぜて使うことができます:
 
  +
{{bc|<nowiki>notsecret: myvalue
 
  +
$ ansible-vault encrypt_string --vault-id ''vault_pass.txt'' --stdin-name ''varname''
mysecret: !vault |
 
  +
  +
上記のコマンドで playbook に挿入できる暗号化された変数が直接出力されます。暗号化された変数は YAML ファイルの中で他の変数と一緒に混ぜて使うことができます:
  +
  +
{{bc|notsecret: myvalue
  +
  +
mysecret: !vault {{!}}
 
$ANSIBLE_VAULT;1.1;AES256
 
$ANSIBLE_VAULT;1.1;AES256
 
66386439653236336462626566653063336164663966303231363934653561363964363833313662
 
66386439653236336462626566653063336164663966303231363934653561363964363833313662
67行目: 73行目:
 
3430613539666330390a313736323265656432366236633330313963326365653937323833366536
 
3430613539666330390a313736323265656432366236633330313963326365653937323833366536
 
3462
 
3462
  +
other_plain_text: othervalue</nowiki>}}
 
  +
other_not_secret: othervalue}}
  +
  +
=== パッケージ管理 ===
  +
  +
Ansible には [[pacman]] によるパッケージのインストール・削除やシステムのアップグレードを扱うための [http://docs.ansible.com/ansible/latest/pacman_module.html pacman モジュール] が存在します。
  +
  +
[[Arch User Repository]] ''(AUR)'' を扱うための [https://github.com/kewlfft/ansible-aur ansible-aur] などの非公式モジュールも GitHub にあります。
  +
  +
Ansible では root で ssh 接続することが前提となっていますが、AUR ヘルパーは root でビルドを実行することを許可しません。"you cannot perform this operation as root" というエラーで操作が失敗します。Ansible で自動化するために、''aur_builder'' などという名前のユーザーを作成して、[[sudoers]] で pacman を使うのにパスワードを必要としないように設定することを推奨します。Ansible では以下のようにして設定することができます:
  +
{{hc|task.yml|2=
  +
- 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 の {{ic|become: yes}} と {{ic|become_user: aur_builder}} パラメータと一緒に AUR ヘルパーや [[makepkg]] コマンドを利用してください。
   
 
== ヒントとテクニック ==
 
== ヒントとテクニック ==
73行目: 97行目:
 
Ansible はユーザーアカウントを管理することができ、新しいアカウントを作成することもできます。[http://docs.ansible.com/ansible/latest/user_module.html user モジュール] を使うことで playbook でアカウントを作成できます。任意でユーザーのパスワードを設定する {{ic|password}} 引数が使えます。モジュールに指定するときパスワードはハッシュ化する必要があります。[http://docs.ansible.com/ansible/latest/playbooks_filters.html#hash-filters ハッシュフィルタ] を使うことで Ansible の中でハッシュ化することが可能です:
 
Ansible はユーザーアカウントを管理することができ、新しいアカウントを作成することもできます。[http://docs.ansible.com/ansible/latest/user_module.html user モジュール] を使うことで playbook でアカウントを作成できます。任意でユーザーのパスワードを設定する {{ic|password}} 引数が使えます。モジュールに指定するときパスワードはハッシュ化する必要があります。[http://docs.ansible.com/ansible/latest/playbooks_filters.html#hash-filters ハッシュフィルタ] を使うことで Ansible の中でハッシュ化することが可能です:
   
<nowiki>- user:
+
- user:
name: madhead
+
name: ''madhead''
password: "{{ 'user_password' | password_hash('sha512', 'permsalt') }}"
+
password: "<nowiki>{{</nowiki> '<i>user_password</i>' | password_hash('sha512', '<i>mypermsalt</i>') }}"
shell: /usr/bin/nologin</nowiki>
+
shell: /usr/bin/nologin
   
 
{{Tip|ハッシュ関数の二番目のパラメータとして指定する salt は変更してください。}}
 
{{Tip|ハッシュ関数の二番目のパラメータとして指定する salt は変更してください。}}
105行目: 129行目:
   
 
Python の設定に関する詳細は [https://docs.ansible.com/ansible/python_3_support.html], [http://docs.ansible.com/faq.html#how-do-i-handle-python-pathing-not-having-a-python-2-x-in-usr-bin-python-on-a-remote-machine], [http://docs.ansible.com/intro_inventory.html#list-of-behavioral-inventory-parameters] にあります。
 
Python の設定に関する詳細は [https://docs.ansible.com/ansible/python_3_support.html], [http://docs.ansible.com/faq.html#how-do-i-handle-python-pathing-not-having-a-python-2-x-in-usr-bin-python-on-a-remote-machine], [http://docs.ansible.com/intro_inventory.html#list-of-behavioral-inventory-parameters] にあります。
  +
  +
== トラブルシューティング ==
  +
=== Unarchive ===
  +
{{ic|unarchive}} モジュールは圧縮ファイルを解凍します。しかしながら ''tar'' ファイルのサポートが不十分で問題が発生することが [https://github.com/ansible/ansible/labels/unarchive github] で報告されています。特に {{ic|keep_newer}} パラメータを {{ic|yes}} に設定した場合に、冪等性が保証されません。{{ic|unarchive}} モジュールで問題が起こるときは、代わりに ''zip'' フォーマットを使用すると良いでしょう。
   
 
== 参照 ==
 
== 参照 ==

2018年1月31日 (水) 20:47時点における版

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: yesbecome_user: aur_builder パラメータと一緒に AUR ヘルパーや makepkg コマンドを利用してください。

ヒントとテクニック

ユーザーアカウントの作成

Ansible はユーザーアカウントを管理することができ、新しいアカウントを作成することもできます。user モジュール を使うことで playbook でアカウントを作成できます。任意でユーザーのパスワードを設定する password 引数が使えます。モジュールに指定するときパスワードはハッシュ化する必要があります。ハッシュフィルタ を使うことで Ansible の中でハッシュ化することが可能です:

- user:
  name: madhead
  password: "{{ 'user_password' | password_hash('sha512', 'mypermsalt') }}"
  shell: /usr/bin/nologin
ヒント: ハッシュ関数の二番目のパラメータとして指定する salt は変更してください。

ユーザーアカウントを作成するときは 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 フォーマットを使用すると良いでしょう。

参照