Skip to content
joniyjoniy edited this page Nov 16, 2016 · 1 revision

Ansible入門

Ansibleとは

  • プロビジョニングツールとよく言われる
  • デプロイメントツール
  • オートストレーションツール
  • 構成管理ツール
  • アドホックコマンド
  • プログラミングに知識が不要
  • 管理対象にエージェントツールが不要
  • python製

プロビジョニングとは

  • ユーザの需要を予測し,設備やサービスなどのリソースを
    計画的に調達し,ユーザの必要に応じたサービスを提供できるように備える行為の総称.
    e-Wordsより
  • 利用者から要求があった場合や障害児などに,
    必要な分のICTリソースを動的に割り当てる技術.
    FUJITSUより
  • ネットワークやコンピュータの設備を,必要になったときにすぐに利用できるよう準備しておくこと
    Networkキーワードより
  • 簡単にまとめると,サーバを調達したり,環境構築すること

Ansibleの特徴

  • YAML形式で記述できる
    • ChefはRubyで記述する
    • PuppetはPuppet独自の宣言型言語で記述する
---
-hosts: all
 become: yes
 gather_facts: no
 name: shutdown
 task:
 - shell: shutdown -h now
  • スタンドアローンでも使える
    • ローカルにも使える
    • グループ化されたサーバにも
  • 冪等性がある
    • 何回実行しても結果が同じ
    • 古い構成管理ツールは何度も実行することで理想状態に近づくものだったらしい(どこで見たか忘れた)

Ansibleに取り組むべき理由とメリット

  • 手動オペレーションによるタイムロスの削減
  • メンテナンス時におけるオペレーションミスの発生可能性の低減
  • 運用後における手順の変更が,作業手順書に反映
    されていないことによる作業漏れの撲滅
  • 直接ログインする機械を最小限にすることによるセキュリティの向上

簡単なplaybook

  • Ansibleを実行してVMのパッケージを更新してみよう
  • VMを起動 vagrant up
  • ~/vagrant/playbook/tasks/update.ymlを以下の内容で作成
---
- hosts: all
  become: yes
  gather_facts: no
  name: update
  task:
  - apt: update_cache=yes upgrade=full
  • ~/vagrant/playbook/hostsを以下の内容で作成
[vagrants]
192.168.11.1{自分のip下2桁}
  • ~/vagrantでansible-playbookを実行
ansible-playbook playbook/tasks/update.yml -i playbook/hosts -u vagrant --private-key="~/vagrant/.vagrant/machines/default/virtualbox/private_key"

playbookの簡単な説明

  • hosts : Ansibleを実行する対象マシン
  • become : sudoユーザになってplaybookを実行する,sudoコマンドと意味は同じ
    Ansible 1.9以前ではsudoと書く
  • gather_facts : facts(環境変数のようなもの)の設定
    デフォルトはyes, 時間がかかるので使わないときはnoにすることがある
  • name : 実行しているtaskの名前
    付けなくてもいい
    いくつものtaskを実行する場合に付けているとどこまで実行されているのか分かって便利
  • tasks: 実行する処理を記述する部分
  • apt : aptモジュール,後述する

ansible-playbookのオプション

  • -k, --ask-pass
    • SSH のパスワードを尋ねる(プロンプトが出る)
  • -K, --ask-sudo-pass
    • sudo のパスワードを尋ねる(プロンプトが出る)
  • -C, --check
    • インストールなどの変更は行わないが、条件の確認などは実行する
  • -c CONNECTION, --connection=CONNECTION
    • local, ssh, paramiko から選択。デフォルトは paramiko。古い OpenSSH で ssh を指定する場合は ANSIBLE_SSH_ARGS="" と環境変数を空で上書きする必要がある
  • -D, --diff
    • file や template の差分(diff)を表示する。--check と一緒に使うと便利
  • -e EXTRA_VARS, --extra-vars=EXTRA_VARS
    • 追加の変数を key=value で指定する。playbook に書かれている変数の上書きはされない
  • -f FORKS, --forks=FORKS
    • 並列実行する数(デフォルトは5)
  • -h, --help
    • このヘルプメッセージを表示して終了する
  • -i INVENTORY, --inventory-file=INVENTORY
    • インベントリファイルを指定する(デフォルトは /etc/ansible/hosts)
  • -l SUBNET, --limit=SUBNET
    • 対象サーバーを指定のものだけに制限する
  • --list-hosts
    • それぞれの playbook の対象ホスト一覧を表示して終了する。playbook の実行はされない
  • --list-tasks
    • 各 playbook のタスク一覧を表示して終了する
  • -M MODULE_PATH, --module-path=MODULE_PATH
    • モジュールファイルのディレクトリを指定する(デフォルトは /usr/share/ansible)
  • --private-key=PRIVATE_KEY_FILE
    • SSH の秘密鍵ファイルを指定する
  • --start-at-task=START_AT
    • 指定の task から開始する
  • --step
    • ひとつの task ごとに "Perform task: タスク名 (y/n/c):" と確認される。y: (yes) 実行する、n: (no) 実行しない、c: (continue) 以降を確認なしで実行する
  • -s, --sudo
    • 対象サーバーでの task を sudo で実行する
  • -U SUDO_USER, --sudo-user=SUDO_USER
    • sudo での実行ユーザーを指定する(デフォルトは root)
  • --syntax-check
    • playbook の文法チェックだけを行う
  • -t TAGS, --tags=TAGS
    • 指定の tag が付けられた task のみを実行する
  • -T TIMEOUT, --timeout=TIMEOUT
    • SSH のタイムアウトを指定する(デフォルトは10秒)
  • -u REMOTE_USER, --user=REMOTE_USER
    • SSH で接続するユーザー名を指定する
  • -v, --verbose
    • 冗長モード (-vvv でより冗長な出力になる)
    • デバック時などに有用
  • --version
    • バージョンを表示して終了する

hosts について

  • Ansibleを実行する対象マシンを指定する
  • 対象サーバをホストグループで指定できる
  • 以下のhostsファイルを -i でインベントリファイルとして指定したとする
[tests]
192.168.33.111
192.168.33.112
192.168.33.113

[staging]
192.168.33.121

[production]
192.168.33.131
  • playbookでは以下のように指定することでstagingグループにだけ実行できる
---
- hosts: staging
...

モジュール

  • Ansibleには便利なモジュールが400種類以上用意されている モジュール一覧
  • モジュールを使うことで完結に,分かりやすく処理を書ける

aptモジュール

  • パッケージに関するモジュール
  • RedHat系列ではyumモジュールを使う
---
- hosts: all
- become: yes
- gather_facts: no
- tasks:
  - name: install base package
    apt: name={{ item }} state=present
    with_items:
      - g++
      - git

shellモジュール

  • shell scriptを使えるモジュール
  • 実行先マシンのshellを通すので環境変数も使える
  • 全ての処理をshellモジュールで書くことも出来なくはないが,
    冪等性が保証されないなどAnsibleの利点が活かせない
    出来るだけ他のモジュールで再現できないか試すべき
---
- hosts: all
- become: yes
- gather_facts: no
- tasks:
  - name: echo hoge
  shell: echo 'hoge' > hoge.txt

commandモジュール

  • コマンドを使えるモジュール
  • こちらはshellを通さないので環境に左右されない
  • パイプを使いたいときはshell, コマンド単体の時はcommandという使い分けか
---
- hosts: all
- become: yes
- gather_facts: no
- tasks:
  - name: echo moge
  command: echo 'moge'

実習1 Apacheインストール

  • playbook/tasks/update.ymlをコピーして,playbook/tasks/apache2.ymlとする
  • aptモジュールを使って apache2 をインストール
  • serviceモジュールを使って apache2 を再起動
  • shellモジュールを使って /var/www/html/index.htmlにechoで適当な文字列を書き込む
  • 以下のコマンドで実行
ansible-playbook -i playbook/hosts playbook/tasks/apache2.yml -u vagrant --private-key="~/vagrant/.vagrant/machines/default/virtualbox/private_key"
  • VMからログアウトした状態で, curl http://192.168.11.{自分のip}を実行
  • 書き込んだ文字列が反映されているか確認する

テンプレート機能

  • Ansibleではjinja2というpythonのテンプレートエンジンを使える
  • 変数nameを展開する場合 {{ name }} で展開できる
<html>
<body>
  <li>Your name is {{ name}} </li>
</body>
</html>
  • 拡張子はj2 main.sh.j2のように付ける
  • プロビジョニング先に応じて内容を変えたい時などに使う

変数

  • Ansibleのデフォルトの変数 ansible_factsと
    自分で定義できる変数varsモジュールがある
  • TODO: varsモジュールの説明
  • ansibleモジュールの中身はsetupモジュールで確認できる
ansible -m setup -i playbook/hosts -u vagrant --private-key=".vagrant/machines/default/virtualbox/private_key"
  • -mオプションで実行するモジュールを指定できる
  • 実行対象のIP情報は ansible_eth1["ip4"]["address"]などに入っている

実習2 テンプレート機能を使おう

  • playbook/tasks/apache.ymlに下記のタスクを追加して実行
  • 作成するファイルはplaybook/template/index.html.j2
  • templateモジュールを使って/var/www/html/index.html を動的に生成する
  • src=template/index.html.j2, dest=/var/www/html/index.html とする
  • VagrantのIPアドレスとansible_envの情報を
    ansible_factsから取り出して出力する
    参考: 対象ホストの情報を取得する
  • ansible_envの情報を表示するときにfor文を使ってみる
  • http://192.168.11.{自分のip}:{設定したhttpポート}/
    にアクセスして確認

playbookの分割 include

  • includeを使うことでplaybookを分割できる

  • main.yml

---
- hosts: all
  become: yes
  gather_facts: no
  name: hoge
  tasks:
    - include: hoge.yml
  • 挿入するplaybookにはtasks以降のみ記述

  • hoge.yml

---
  name: hoge
  shell: echo `hoge`

playbookの分割role

  • roleという仕組みを使うことでも分割できる

  • 簡潔に書くと,決められたディレクトリ構造で,所定のファイルを置くと勝手にincludeしてくれるようなもの

  • ディレクトリ構造 role commonの例

main.yml
hogeserver.yml
roles/
 └── common/
      ├── files/      # copyモジュールなどで用いるファイル
      ├── templates/  # テンプレートファイル
      ├── tasks/      # 実行するタスク
      ├── handlers/   # ファイル変更後最後に実行する処理など
      ├──  vars/      # 変数
      ├── defaults/   # デフォルトの変数
      └── meta/       # roleの依存関係
---
- name: Install apache2 (RedHat)
  yum: name=httpd
  when: "ansible_os_family == 'RedHat'"

- name: Install apache2 (Debian).
  apt: name=apache2
  when: "ansible_os_family == 'Debian'"
  • site.yml
---
- hosts: all
  become: yes
  remote_user: "{{ ansible_remote_user_name }}"
  roles:
    - apache2

実習3 includeを使ってみよう

  • playbook/tasks/apache2.ymlに下記のタスクを追加して実行
  • includeを使ってplaybookを分割
  • VimとEmacsをインストールするplaybookをそれぞれ作成し,apache.ymlにincludeする
  • インストールにはaptモジュールを使う

Ansibleの類似物

  • 構成管理ツール

    • chef
    • puppet
    • itamae
    • salt
  • デプロイメントツール

    • Capistrano
    • Fabric
  • TODO:比較

付録

Ansibleという名前について

この名は,サイエンスフィクションから来ています. Ansibleとは,光よりも高速に情報を転送できる 空想の通信デバイスです.Ursula K. Le Guinは, 彼女の著作のロカノンの世界でこの概念を創造し, それ以来ほかのSF作家達もLe Guinのアイデアを借用しています. さらに詳しく言うなら,Michael DeHaanはOrson Scott Card の著作であるエンダーのゲームからAnsibleという名前を取りました. この作品では,Ansibeは遠く離れた場所にいる大量の 宇宙船を一度に遠隔操作するために使われています. それを,リモートサーバー群のコントロールのメタファー としたわけです.[原文ママ]

参考資料

TODO

  • ページの分割