てくなべ (tekunabe)

ansible / network automation / 学習メモ

Ansible で StackStorm をインストールする

■ はじめに

イベントドリブンな自動化ツール StackStorm の公式ドキュメントに、Ansibleでのインストール方法が記載されていたので、試してみます。

・ドキュメント

https://docs.stackstorm.com/install/ansible.html

・Playbook

github.com

■ 環境

インストール先

あまり低スペックだと、インストールの途中で何かしらのタイムアウトで失敗しています。例えば、 AWSt2.micro ではうまくインストールできませんでした。 t2.medium は安定してインストールできました。 システム要件は以下のページで確認できます。

https://docs.stackstorm.com/install/system_requirements.html

Ansibleホスト側

Ansible 2.4.2 を利用しました。特に理由はないですが、今回は Azure Cloud Shell にあらかじめインストールされている Ansible を利用しました。


■ 準備

Playbook

前述のPlaybookをclone しておきます。

git clone https://github.com/StackStorm/ansible-st2.git
cd ansible-st2

その他

inventory ファイル、認証情報などを準備しておきます。


■ 実行

・コマンド

ansible-playbook stackstorm.yml -i 'localhost,' --connection=local

・ログ(抜粋)

[DEPRECATION WARNING]: The use of 'include' for tasks has been deprecated. Use 'import_tasks' for static inclusions or 'include_tasks' for
dynamic inclusions. This feature will be removed in a future release. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: include is kept for backwards compatibility but usage is discouraged. The module documentation details page may
explain more about this rationale.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.

PLAY [Install st2] *************************************************************************************************************************

(略)

changed: [18.217.xxx.xxx] => (item=^(export ST2_AUTH_PASSWORD.*))

TASK [st2chatops : Check if any adapter is enabled] ****************************************************************************************
fatal: [18.217.xxx.xxx]: FAILED! => {"changed": false, "cmd": ["grep", "-e", "^export HUBOT_ADAPTER=", "/opt/stackstorm/chatops/st2chatops.env"], "delta": "0:00:00.002958", "end": "2018-03-12 00:51:45.973120", "msg": "non-zero return code", "rc": 1, "start": "2018-03-12 00:51:45.970162", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [st2chatops : Set variable enabled_adapter] *******************************************************************************************
fatal: [18.217.xxx.xxx]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: list object has no element 1\n\nThe error appears to have been in '/home/yokochi1983/ansible-st2/roles/st2chatops/tasks/main.yml': line 118, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Set variable enabled_adapter\n  ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: list object has no element 1"}
...ignoring

(略)

TASK [st2chatops : Comment existing hubot adapters in "/opt/stackstorm/chatops/st2chatops.env"] ********************************************
ok: [18.217.xxx.xxx]


PLAY RECAP *********************************************************************************************************************************
18.xx.xx.xx             : ok=96   changed=68   unreachable=0    failed=0

書き方が少し古いようで WARNING が出ました。 また、二つほどタスクがコケましたが、 ignore_errors: true 扱いのようです。


■ 確認

CLI

インストール先にログインし、以下のようにバージョンや簡単な動作確認をします。 なお、ユーザー名とパスワードは、roles/st2/defaults/main.yml で定義したものになります。特にカスタマイズしていない場合は以下のようになります。

  • ユーザー名: testu
  • パスワード: testp
[ec2-user@ip-172-31-2-121 ~]$ st2 --version
st2 2.6.0
[ec2-user@ip-172-31-2-121 ~]$ export ST2_AUTH_TOKEN=`st2 auth -t -p 'testp' testu`
[ec2-user@ip-172-31-2-121 ~]$ st2 run core.local -- date -R
.
id: 5aa5e69cfbe28846c0b28881
status: succeeded
parameters:
  cmd: date -R
result:
  failed: false
  return_code: 0
  stderr: ''
  stdout: Mon, 12 Mar 2018 02:31:57 +0000
  succeeded: true
[ec2-user@ip-172-31-2-121 ~]$

StackStorm 経由でローカルに対して date コマンドが実行できたことを確認できました。

Web UI

https://<インストール先IPアドレス> でブラウザでアクセスします。 f:id:akira6592:20180312114025p:plain

前述のユーザー名とパスワードでログインします。ちょうど先ほどCLIで試したときのログがHISTORYに表示されていることが確認できました。 f:id:akira6592:20180312114231p:plain


■ まとめ

Ansible で StackStorm をインストールできることが確認できました。 他にもワンライナーでインストールしたり、Docker、Vagrant など様々な方法でのインストール方法がありますでの、詳細は、以下の公式ドキュメントをご参照ください。

https://docs.stackstorm.com/install/index.html

参考:VagrantVM ごと準備する場合

tekunabe.hatenablog.jp

Ansible の panos_object モジュール使用時のエラー「Missing required libraries.」の対策

■ はじめに

Ansible には PaloAlto (PAN-OS) 用のモジュールがいくつかあります。これらのモジュールを利用するにあたって、別途Pythonライブラリが必要なものもあります。 たとえば、 アドレスやサービスオブジェクトを操作する panos_object モジュール の公式ドキュメントには以下の2つのPythonライブラリが必要(Requirements)という記述があります。

ところが私の環境(Centos 7.4、Ansible 2.4.3、Python 2.7.5)では、それでもまだライブラリが足りないというエラーが発生したので、その詳細と対策を記載します。


■ 実行エラー内容

panos_object モジュールの公式ドキュメントのサンプルにある、サービスオブジェクトを追加する Playbook を実行したところ、以下のエラーになりました。

TASK [create a global service for TCP 3306] ***********************************************************
fatal: [192.168.1.15]: FAILED! => {"changed": false, "msg": "Missing required libraries."}


■ 対策

結論としては、 xmltodict を追加でインストールすることで処理を正常に実行することができました。

準備

pip install xmltodict

実行

[vagrant@centos7 vagrant]$ ansible-playbook -i inventory p25.yml

PLAY [panos] *******************************************************************

TASK [create a global service for TCP 3306] ************************************
changed: [192.168.1.15]

PLAY RECAP *********************************************************************
192.168.1.15               : ok=1    changed=1    unreachable=0    failed=0


■ 補足:調べ方

エラーメッセージの Missing required libraries. をヒントにして、panos_object モジュールのコードを調べました。 エラーメッセージを設定している箇所がこちらでした。

遡ってみると、以下のimport に失敗したときにエラーが表示されることが分かりました。

    import pan.xapi
    from pan.xapi import PanXapiError
    import pandevice
    from pandevice import base
    from pandevice import firewall
    from pandevice import panorama
    from pandevice import objects
    import xmltodict
    import json

ここに import xmltodict とあるのに対して、私の環境には xmltodict がなかったのでインストールしました。

SRE-SET Automation Night #2 で「Ansible 2.5 におけるネットワークモジュールのトピック」という発表をしてきました

f:id:akira6592:20180309181453j:plain

2018/03/06 に メルカリさん主催の「SRE-SET Automation Night #2」という自動化に関する勉強会が開催され、参加と登壇させていただきました。

mercari.connpass.com


■ Ansible 2.5 におけるネットワークモジュールのトピック

www.slideshare.net

2018年3月中に正式リリース予定の Ansible 2.5 でネットワークモジュール周りで変更点がいくつかあります。現在のバージョン rc1 なので、少し早めに共有したいと思い、時間を頂戴しました。

資料中にでてくるリンクを本記事にも引用します。

CHANGELOG

github.com

公式ドキュメント: Ansible for Network Automation

Ansible for Network Automation — Ansible Documentation

Porting Guide

Ansible 2.5 Porting Guide — Ansible Documentation

公式ブログ: COMING SOON: NETWORKING FEATURES IN ANSIBLE 2.5

www.ansible.com



■ 他の発表の資料

mercari.connpass.com


■ まとめブログ

blog.jicoman.info kesin.hatenablog.com

感想など

普段、automation、自動化といったキーワードで参加しているイベントの参加者と違って、フロントエンジニアの方が多かった印象です。 Ansible は知っていても、利用はされていなかったり、ネットワークに対応していることをご存じなかった方もいらっしゃったようなので、知っていただくきっかけにはなったかなと思います。 みなさんの発表を聞いて、開発では様々な工夫をされているのだなと感じました。

今回は、発表の機会を頂戴しましてまことにありがとうございました。

オープンソースカンファレンス 2018 Tokyo/Spring に参加してきました

はじめに

いつか行きたいと思っていてようやく行けたイベントシリーズ。

に続いて、 オープンソースカンファレンス(OSC)に参加してきました。 私が参加したセッションのメモを簡単ですがまとめたいと思います。

www.ospn.jp


■ ついにL3スイッチ機能が搭載された,日本発のオープンソースソフトウェアスイッチOS「Lagopus Switch」

www.ospn.jp

Lagopus Switch は聞いたことはあったのですが、Lagopus Router という存在を初めて知りました。 現状、紹介されていたユースケースを身近に当てはめられることはありませんが、今後何か細かいことをしなくてはいけない時に、かゆいところに届くこのようなモノがあることは覚えておこうと思います。

また、Zebra 2.0 や openconfigd のくだりで、大変興味深い資料が紹介されていました。

www.slideshare.net

  • 参考: OSC 2018 大阪での同タイトルセッションのtogetter togetter.com


■ 【入門】Docker入門

www.ospn.jp

www.slideshare.net

あまり Docker を触ったことがなかったので参加しました。個人的には attachとexecの違いの説明が助かりました。


LAMPもDockerもKubernetesも数クリックでデプロイ! Nutanix & Calmによるインフラとアプリケーション展開の自動化

www.ospn.jp

www.slideshare.net

Nutanix は、どちらかというとアプライアンス寄りのベンダーというイメージがあったのですが、今回でソフトウェアのベンダーという印象に変わりました。 また、 Nutanix Calm を初めて知り、ずいぶん範囲を広げてきているんだなと思いました。


オープンソースのコンテナ管理プラットフォーム "Rancher" のご紹介

www.ospn.jp

www.slideshare.net

Rancherは名前しか聞いたことがなかったのですが、ほかのコンテナ周辺のツールとの関係、Rancher 1.0 と 2.0 の大きな違いなどを知れました。 また、Rancher 2.0 が オーケストレータを kubernetes 1本に絞った経緯が大変興味深かったです。


おわりに

初参加でしたが、いろいろ目移りしてしまうセッションがあって楽しめました。 また、twitter でやり取りさせていただいている皆様ともご挨拶ができました。 次回もまた参加させていただきたいと思います。

Ansible の Playbook Debugger を常に起動させる方法(Ansible 2.5 から)

■ はじめに

Ansible には Playbook Debugger というPlaybook の実行を途中で止めて、変数の内容を表紙したり変更したりできる機能があります。 これまでは、エラー発生時のみ Debugger を起動させることできたのですが、次期バージョン Ansible 2.5 から、オプションの指定次第で常に Debugger を起動させることができるようになります。

本記事では、Playbookの書き方と動作イメージについてご紹介します。

なお、ansible-playbook コマンドの --step オプションとは別のものです。


■ 環境

インストール

記事執筆時点では 2.5 は beta2 となっています。 ここでは pip で以下のようにインストールします。

pip install git+https://github.com/ansible/ansible.git@stable-2.5

バージョン確認

バージョンが 2.5系 になっていることを確認します。

(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook --version
ansible-playbook 2.5.0b2
  config file = /etc/ansible/ansible.cfg
  (略)


■ お試し

Playbook

以下のような Playbook で試します。 ポイントは以下の2箇所です。

  • strategy: debug 今までも利用できた Playbook Debugger を適用するための指定です
  • debugger: always 2.5 から利用可能な、Debugger を起動させる条件の指定です。alyways で常に起動。
- hosts: junos
  gather_facts: no
  strategy: debug      # point1
  debugger: always     # point2

  tasks:
    - name: task1
      junos_facts:

    - name: task2
      junos_command:
        commands:
          - show version

(インベントリファイル、varsファイルは省略します)

実行結果

(1) 通常通り ansible-playbook コマンドで実行します。

(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory test.yml

PLAY [junos] ****************************************************************

TASK [task1] ****************************************************************
ok: [172.16.0.1]
[172.16.0.1] TASK: task1 (debug)>

このように Debugger が起動し、入力待ち状態になります。

(2) h でヘルプを表示します。

[172.16.0.1] TASK: task1 (debug)> h

Documented commands (type help <topic>):
========================================
EOF  c  continue  h  help  p  pprint  q  quit  r  redo

[172.16.0.1] TASK: task1 (debug)>

このように 入力オプションが表示されます。

(3) c で処理を続けます。

[172.16.0.1] TASK: task1 (debug)> c

TASK [task2] *****************************************************************
ok: [172.16.0.1]
[172.16.0.1] TASK: task2 (debug)>

このように、 task2 が実行され、入力待ち状態になります。

(4) p でタスク実行結果の内容を表示させます。

[172.16.0.1] TASK: task2 (debug)> p result._result
{'_ansible_no_log': False,
 '_ansible_parsed': True,
 u'changed': False,
 'failed': False,
 u'invocation': {u'module_args': {u'commands': [u'show version'],
                                  u'display': None,
                                  u'host': None,
                                  u'interval': 1,
                                  u'match': u'all',
                                  u'password': None,
                                  u'port': None,
                                  u'provider': None,
                                  u'retries': 10,
                                  u'rpcs': None,
                                  u'ssh_keyfile': None,
                                  u'timeout': None,
                                  u'transport': None,
                                  u'username': None,
                                  u'wait_for': None}},
 u'stdout': [u'Hostname: vsrx1\nModel: firefly-perimeter\nJUNOS Software Release [12.1X47-D15.4]'],
 u'stdout_lines': [[u'Hostname: vsrx1',
                    u'Model: firefly-perimeter',
                    u'JUNOS Software Release [12.1X47-D15.4]']]}
[172.16.0.1] TASK: task2 (debug)> 

このように、p result._result で、タスク実行結果の各変数が表示されます。 Playbook の中で特に register で明示的に変数に代入していないのもポイントです。 その他、Playbook Debbuger の詳細は使用方法は、公式ドキュメントの「Playbook Debugger」ページをご参照ください。

(5) c で処理を続けます。

[172.16.0.1] TASK: task2 (debug)> c

PLAY RECAP *******************************************************************
172.16.0.1                 : ok=2    changed=0    unreachable=0    failed=0

(ansible25) [vagrant@centos7 vagrant]$

すべてのタスクが終了します。

デモ動画

先ほどの実行結果の動画版です。

f:id:akira6592:20180220180655g:plain


■ まとめ

エラー時だけでなく、通常時も Debbuger を起動できるようになり、Playbook の開発、デバッグが捗りそうです。

・参考記事

tekunabe.hatenablog.jp

Ansible 2.5 の情報を一足早く掴むために読みたいページたち

はじめに

現在(2018/02/19)、Ansible 次期バージョンの 2.5 は beta2 となっています。正式リリースは 3月の予定のようです。 この記事では、Ansible 2.5 の情報を一足早く掴むために読んでおきたいページたちをご紹介します。 公式ドキュメントはすべて devel バージョンへのリンクを掲載しています。

CHANGELOG

一番はじめにこちらの CHANGELOG を読むのがよいと思います。

https://github.com/ansible/ansible/blob/stable-2.5/changelogs/CHANGELOG-v2.5.rst

以下の情報が記載されています。

  • 主な変更点 (loop など)
  • 軽微な変更点
  • Deprecated になった点(2.9で削除されるまでの猶予)
  • 削除されるモジュール
  • 追加されるプラグイン、モジュール


■ 新モジュール一覧

新モジュールの一覧を紹介しているページです。削除されるモジュールも 紹介しています。

Ansible 2.5 新モジュール一覧awsbloglink.wordpress.com


■ 移行ガイド

Ansibe 2.4 から 2.5 へ移行する際に注意するべき事項が記載されている、公式の移行ガイドです。

http://docs.ansible.com/ansible/devel/porting_guides/porting_guide_2.5.html


■ ネットワークモジュールの新機能

ネットワークモジュールの新機能を紹介しているAnsible 公式ブログ記事です。 2.4 までのPlaybook の書き方と 2.5 での書き方の比較などが記載されていて分かりやすいです。

www.ansible.com


■ ネットワークモジュールのドキュメント

f:id:akira6592:20180219151517p:plain

ついに 公式ドキュメントの見出しに「Ansible Networking Guide」が登場しました。

以下の情報が記載されています。

(2018/02/19追記) 公式ドキュメント内の become を説明するページにも、Ansible 2.5 での特権モードの扱いについて記載されています。

Understanding Privilege Escalation — Ansible Documentation


■ stable-2.5 ブランチ

GitHub Ansible リポジトリstable-2.5 ブランチです。 すでに devel ブランチは 2.6 用になっています。 github.com


■ おまけ: Asnble 2.5 のインストール方法

現在、普通にインストールすると 2.4系がインストールされます。 ベータ版である、Ansible 2.5 をインストールするためには、 pip であれば以下のようにブランチを指定します。

pip install git+https://github.com/ansible/ansible.git@stable-2.5


■ まとめ

今回も、多数のモジュール追加や、機能の追加があるようです。 ネットワークモジュール方面でも、コネクションタイプの追加やベストプラクティスの公開といった大きめトピックがあります。 試したものは本ブログで公開したいと思います。

Ansible の Junos 対応モジュールは標準モジュールとGalaxyモジュールの2種類ある

はじめに

Ansible は ネットワーク機器にも対応していて、Juniper の Junos にも対応しています。 Junos対応モジュールは大きく分けて以下の2の種類があります。

  • Ansible本体に組み込まれているモジュール(以下、標準モジュール)
  • Ansible Galaxy からインストールして利用するモジュール(以下、Galaxy モジュール)

このため、見るべきドキュメントを間違えてしまったりすることがあります。 この記事では、これら2種類のモジュールの入手方法やドキュメントの場所などについてまとめます。 (すべて 2018/02/10 現在)

比較

標準モジュール Galaxy モジュール
入手方法 Ansibleインストール時に同時に入る ansible-galaxy install Juniper.junos
公式ドキュメント Ansible全体 Ansible for Junos OS
モジュール名プレフィックス junos_ juniper_junos_ (*1)
モジュール一覧 Junos Juniper.junos Ansible Modules
 モジュール例1 junos_facts juniper_junos_facts
 モジュール例2 junos_config juniper_junos_config
 モジュール例3 junos_l3_interface juniper_junos_srx_cluster
Playbook記述例 junos_config の利用例 juniper_junos_config の利用例
最新stableバージョン 2.4.3.0 2.0.1
GitHub リポジトリ ansible/ansible Juniper/ansible-junos-stdlib