あきろぐ

いろいろめもするよ🐈🐈🐈

ansibleもくもく会(サーバー編)行ってきたよ

f:id:akngo22:20190327192718p:plain

遅くなりましたが、ansibleユーザー会主催のもくもく会に初参加してきました。

参加したのはこちら↓

ansible-users.connpass.com

今回のもくもく会は、オイシックス・ラ・大地(Osaki kitchen studio)で開催されました。オイシックス提供の美味しい野菜ジュースを飲みながらもくもくです。

 会場となったスタジオはこちら↓(若干迷ったw)

無料で会場提供しているとのことなので、勉強会等開催したい方、する予定がある方は連絡すると良いかもです。

www.wantedly.com

 もくもく内容

今回実施した内容については以下の通りです。

  • Ansible Engine

   アドホックコマンド

   Playbook

   変数、ループ、ハンドラ

   Ansible Galaxy

  • Ansible Tower

   Ansible Towerのインストール 👈私はここまで。。。

   Ansible Towerのコンフィグレーション

   Job Templateの作成と実行

大きく分けて、Ansible EngineとAnsible Towerの2つに触れてみるのが今回の目的でした。私は全部終わらなかったので、Ansible Towerは後日やります。。。

実際にAnsibleを試してみる環境は、事前に用意していただいていたので、参加者はSSHで準備済みの環境に接続するだけ!とてもありがたかったです。

アドホックコマンド

Ansibleのアドホックコマンドは、ワンライナーで処理を実行することができるので、「ささっと処理を実行してしまいたい!」って時にとても便利です。

デフォルトのインベントリファイルは、.ansible.cfgにパスが記載されているので事前にチェックしておきましょう。.ansible.cfgにインベントリファイルを指定していれば、-iオプションを使わなくてもそのファイルに書かれたホストに対して処理を実行してくれます。

f:id:akngo22:20190328202115j:plain

 例えば、以下のようにアドホックコマンド使うことができます。

-oオプションは、通常数行で表示されるコマンド結果を1行で表示させるオプションで、-bオプションはroot権限でコマンドを実行させるオプションです。

その他のコマンドオプションが知りたい場合は、ansible --helpコマンドを実行してみてください。

$ ansible [対象] -m ping  #対象のノードが操作可能か確認
$ ansible [対象] -m command -a "uptime" -o #対象ノードにuptimeコマンドを実行
$ ansible [対象] -m yum -a "name=httpd state=present" -b #対象ノードにapacheインストール 

Playbookの作成

アドホックコマンドは、ワンライナーで処理を実行することができますが、Playbookというスクリプトを書けば管理ノードに対する処理を一括で実行することができます。

f:id:akngo22:20190328232938j:plain

例えば、ApacheをインストールするPlaybookを書く場合は以下のようにします。

※インデントには注意しましょう。※

---
- hosts: web #対象のノードを指定
  name: install apache #任意で処理の内容など書くことが可能
  become: yes #root権限で処理を実行する
 
  tasks:
     - name: install apache #タスクの名前
       yum: #モジュール指定
           name: httpd
           state: present #インストールする

    - name: start httpd #タスクの名前
      service: #モジュール指定
          name: httpd
          state: started #起動させる
これくらいのPlaybookの長さだとインデントのミスに気づきやすいですが、記述が長くなってくると間違いに気づきにくくなるのが難点ですね。。。皆さんどうしてるんだろうか。

変数、ループ、ハンドラについて

Playbookでは、管理ノードに対する処理を一括で実行できるというメリットがありました。上記のようにそれぞれのグループに対して処理を書いていくのも良いですが、Playbookが長くなってしまうのが難点です。そこで、Playbookをより強力に使うために「変数」、「ループ」、「ハンドラ」を扱えるようになると、使いまわしがしやすくなります。

変数は、ターゲットサーバーごとに違う部分(IPアドレスディレクトリ等)を吸収し扱うことができます。変数はPlaybookだけでなくインベントリファイルでも指定することが可能です。

ループは、繰り返し実行するタスクがある場合に使用します。これによって、タスクを複数作成する必要がなくなります。

ハンドラは、サービスを再起動する必要がある場合に使用します。設定ファイルの変更・新規パッケージの導入など、再起動しなければ設定が反映されないときに活用できます。

例えば、上記のPlaybookに書き加えるとするなら、変数だとこのように指定できます。

---
- hosts: web 
  name: install apache 
  become: yes 
  vars: #変数は3つ
      httpd_packages: #"htpd_packages"という変数に"httpd"と"mod_wsgi"を代入する
         - httpd
         - mod_wsgi
      apache_test_message: This is a test message #文字列を変数に代入
      apache_max_keep_alive_requests: 115 #数字を文字列に代入

 "httpd_packages"はリスト型の変数であり、"httpd"と"mod_wsgi"の2つのパッケージをリストに入れるように定義しています。以下のようにすると要素を一行で書くことも可能です。

      httpd_packages: 
         [ httpdmod_wsgi ] #コンマで区切り、[]で囲むと1行で表せる

変数名は、自由に決めることができますが、「英数字とアンダースコア」で定義しなければならないので注意してください。例えば、"foo-port"や"foo port"、"555"などは変数名として使えません。

続いて、ループについてです。例えば、複数のパッケージをインストールしたい場合、同じようなタスクを複数書くのは面倒ですよね。ループを使えば、1つのタスクに収めることができます。

  tasks:
     - name: install httpd packages
       yum:
           name: "{{ item }}" #定義した変数に格納されたものを1つ1つ展開
           state: present
       with_items: "{{ httpd_packages }}" #"httpd_packages"に格納したものを使う

"items"と"with_items"はセットで使います。ここでは、"httpd_packages”を"items"の中に展開するという意味になるので、変数に入れたhttpdとmod_wsgiをそれぞれインストールすることができます。

f:id:akngo22:20190409222618p:plain

ハンドラに関しては、再起動が必要なタスクにnotifyキーを指定して使います。タスクにnotifyキーを指定するとhandlersキーを呼びだして、指定したサービスを再起動させることができます。ハンドラは基本Playbookに書かれたタスクが全て完了した後に実行されます。

  tasks:
     - name: install httpd packages
       yum:
           name: httpd
           state: present
       notify: restart apache service #ハンドラを呼び出して再起動する

  handlers: restart apache service
     - name: restart apache service
       service: name=httpd state=restarted

遭遇したエラー

1つ目

ERROR! Extraneous options or arguments

無効なオプションまたは引数を使っていませんか?実行した処理をもう一度見直してみましょう。これはたぶんオプションを間違えたときに出たやつです。

2つ目

fatal: [node1]: FAILED! => {"msg": "'httpd_pachages' is undefined"}
"httpd_pachages"は定義されていないですよと言われました。定義したのは"httpd_packages"なのでそりゃそうだ。。。シンタックスチェックコマンドでは、変数のミスは引っかからないなので気をつけましょう。

3つ目

fatal: [node2]: FAILED! => {"changed": false, "checksum": "26fd90c27a2f629a9ba00619e8e7b3fe4c9cfa59", "msg": "Unsupported parameters for (copy) module: notify Supported parameters include: _original_basename, attributes, backup, checksum, content, delimiter, dest, directory_mode, follow, force, group, local_follow, mode, owner, regexp, remote_src, selevel, serole, setype, seuser, src, unsafe_writes, validate"}
「モジュールのパラメータがサポートされていない」とのメッセージが表示されていますが、原因はインデントが間違っていたためでした。。。(全然気づかなかったw)

最後

自分の理解を深めるために色々書いてたら長くなってしまったので、ここまでで割愛。。。Roleを使ったPlaybookの書き方もまとめたいので今度書きます。