ksaitoの日記

日々試したことの覚え書き

handlersのデバッグ

ansibleのhandlerは便利なのですが、想定通り動かない場合にデバッグが難しいです。

サンプル

handlersは、notifyで通知された名前のhandlerを実行します。複数のタスクを実行する方法が分かりません...

handlerでシェルを起動する際、結果はどうあれ、出力を記録したかったのですが... handlerの2つ目のdebugは、普通に動きませんでした。

$ cat site.yml 
---
- hosts: appservers
  tasks:
    - shell: ls
      notify: aaa
  handlers:
    - name: aaa
      shell: ls -l
      register: result
    - debug: var="result.stdout_lines"
$ ansible-playbook -i hosts site.yml 

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [appserv1]

TASK [command] *****************************************************************
changed: [appserv1]

RUNNING HANDLER [aaa] **********************************************************
changed: [appserv1]

PLAY RECAP *********************************************************************
appserv1                   : ok=3    changed=2    unreachable=0    failed=0   

$ 

とりあえず...

-vvオプションでとりあえず実効結果は確認できますが、分かりにくい...

$ ansible-playbook -i hosts site.yml -vv
Using /home/vagrant/.ansible.cfg as config file
1 plays in site.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [appserv1]

TASK [command] *****************************************************************
NOTIFIED HANDLER aaa
changed: [appserv1] => {"changed": true, "cmd": "ls", "delta": "0:00:00.001665", "end": "2016-02-27 11:16:25.886746", "rc": 0, "start": "2016-02-27 11:16:25.885081", "stderr": "", "stdout": "git\npub\nwork", "stdout_lines": ["git", "pub", "work"], "warnings": []}

RUNNING HANDLER [aaa] **********************************************************
changed: [appserv1] => {"changed": true, "cmd": "ls -l", "delta": "0:00:00.002075", "end": "2016-02-27 11:16:26.002306", "rc": 0, "start": "2016-02-27 11:16:26.000231", "stderr": "", "stdout": "total 12\ndrwxr-xr-x 5 vagrant vagrant 4096 Feb 25 22:51 git\ndrwxr-xr-x 2 root    root    4096 Sep 26 16:23 pub\ndrwxr-xr-x 4 vagrant vagrant 4096 Feb 17 00:25 work", "stdout_lines": ["total 12", "drwxr-xr-x 5 vagrant vagrant 4096 Feb 25 22:51 git", "drwxr-xr-x 2 root    root    4096 Sep 26 16:23 pub", "drwxr-xr-x 4 vagrant vagrant 4096 Feb 17 00:25 work"], "warnings": []}

PLAY RECAP *********************************************************************
appserv1                   : ok=3    changed=2    unreachable=0    failed=0   

$ 

shellモジュールとdebugモジュール

shellモジュールの実行結果をdebugモジュールで表示してみます。

ソース

使ったソースは下記の通りです。

$ cat site.yml 
---
- hosts: appservers
  tasks:
    - debug:
    - shell: ls
      register: result
      changed_when: False
    - debug: var="result.rc"
    - debug: var="result.stdout"
    - debug: var="result.stdout_lines"
$ 

実行

一つ目のdebugモジュールは、オプションを何も指定しないと"Hello, World!"を表示するんですね。

shellモジュールで実行したコマンドの終了ステータス、実行結果を表示します。

$ ansible-playbook -i hosts site.yml 

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [appserv1]

TASK [debug] *******************************************************************
ok: [appserv1] => {
    "msg": "Hello world!"
}

TASK [command] *****************************************************************
ok: [appserv1]

TASK [debug] *******************************************************************
ok: [appserv1] => {
    "result.rc": "0"
}

TASK [debug] *******************************************************************
ok: [appserv1] => {
    "result.stdout": "git\npub\nwork"
}

TASK [debug] *******************************************************************
ok: [appserv1] => {
    "result.stdout_lines": [
        "git", 
        "pub", 
        "work"
    ]
}

PLAY RECAP *********************************************************************
appserv1                   : ok=6    changed=0    unreachable=0    failed=0   

$ 

httpd.confへのProxyPass設定をansibleで自動化

ansibleでProxyPassの設定をするサンプルです。

ソース

lineinfileモジュールを使います。

createを指定することで、ファイルがない場合は作成します。

regexpでポートの部分を指定することで、ポート番号変更の際にエントリが増えてしまうことを防ぎます。

$ cat roles/app/tasks/main.yml
---
- name: lineinfile sample
  lineinfile:
    dest: /tmp/test.txt
    regexp: '^ProxyPass /aaa ajp://localhost:[0-9]*/aaa'
    line:    'ProxyPass /aaa ajp://localhost:{{port}}/aaa'
    create: yes
$ 

実行

最初にファイルがない状態で実行するとファイルを作成してエントリを追加します。

$ ls /tmp/test.txt
ls: /tmp/test.txt にアクセスできません: そのようなファイルやディレクトリはありません
$ ansible-playbook -i hosts -l appserv1 site.yml --extra-vars="port=99"; cat /tmp/test.txt

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [appserv1]

TASK [app : lineinfile sample] *************************************************
changed: [appserv1]

PLAY RECAP *********************************************************************
appserv1                   : ok=2    changed=1    unreachable=0    failed=0   

ProxyPass /aaa ajp://localhost:99/aaa
$ 

再度、ポートを変更して実行すると最初の行が書き換えられます。

$ ansible-playbook -i hosts -l appserv1 site.yml --extra-vars="port=8080"; cat /tmp/test.txt

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [appserv1]

TASK [app : lineinfile sample] *************************************************
changed: [appserv1]

PLAY RECAP *********************************************************************
appserv1                   : ok=2    changed=1    unreachable=0    failed=0   

ProxyPass /aaa ajp://localhost:8080/aaa
$ 

サーバに複数インスタンスを設定する

サーバ一台にミドルウェアをインストールしてインスタンス複数作る構成を設定するサンプルです。

ディレクトリ構成

ディレクトリ構成は、下記です。

$ tree 
.
├── host_vars
│   ├── appserv1
│   └── appserv2
├── hosts
├── roles
│   └── app
│       └── tasks
│           ├── main.yml
│           └── sample.yml
├── site.yml
└── vars
    ├── inst1.yml
    ├── inst2.yml
    └── insta.yml

5 directories, 9 files
$

設定

設定は、サーバ毎、インスタンス毎に変数ファイルにまとめます。 構成変更は、このファイルだけを変更します。

サーバの設定

host_varsディレクトリの下にサーバ名と同名のファイルにサーバについての設定を行います。 この場合、serverName変数がサーバ固有の設定です。

instlistに作成するインスタンスを定義します。 この場合、2インスタンス作ることを意味します。

$ cat host_vars/appserv1
serverName: app-server1
instlist:
  - inst1
  - inst2
$ 

インスタンスの設定

インスタンスの設定は、varsディレクトリの下にinstlistで定義した名前と同名のファイルに設定します。

$ cat vars/inst1.yml 
appName: inst1
appDB: db1
$ 

タスク

設定された値をもとにタスクを実行します。 ベストプラクティスに従ってrolesディレクトリ下に定義します。

サーバタスク

サーバ固有のタスクは、Hello, World!です。 インスタンスの設定は、sample.ymlに定義して、with_itemsとしてインスタンス毎に実行するように定義します。

$ cat roles/app/tasks/main.yml 
---
- name: Hello, World!
  debug: msg="hello"
- include: sample.yml
  with_items: instlist
$ 

インスタンスタスク

最初のinclude_varsタスクでvarsディレクトリ下のinstlistに定義された名前と同名の変数ファイルを読み込みます。 testタスクがインスタンス固有のタスクでインスタンス毎の値を参照します。

$ cat roles/app/tasks/sample.yml 
---
- include_vars: "{{item}}.yml"
- name: test
  debug: msg="appName={{appName}} appDB={{appDB}}"
$ 

インベントリ

インベントリで2台のサーバを含むグループを定義します。

$ cat hosts
[appservers]
appserv1
appserv2
$ 

まとめる

hostsにグループを指定して、同じロールを割り当てる複数のサーバを指定します。 新しいサーバが追加されたらインベントリにサーバを追加して、host_varsにサーバ、varsにインスタンスの設定をします。

$ cat site.yml 
---
- hosts: appservers
  roles:
    - app
 $ 

実行

これで1コマンドで2サーバ3インスタンスを一気に設定できる雛形の完成です。 ansibleすごい!

$ ansible-playbook -i hosts site.yml 

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [appserv2]
ok: [appserv1]

TASK [app : Hello, World!] *****************************************************
ok: [appserv1] => {
    "msg": "hello"
}
ok: [appserv2] => {
    "msg": "hello"
}

TASK [app : include] ***********************************************************
included: /home/vagrant/git/sample/roles/app/tasks/sample.yml for appserv2
included: /home/vagrant/git/sample/roles/app/tasks/sample.yml for appserv1
included: /home/vagrant/git/sample/roles/app/tasks/sample.yml for appserv1

TASK [app : include_vars] ******************************************************
ok: [appserv2]

TASK [app : test] **************************************************************
ok: [appserv2] => {
    "msg": "appName=insta appDB=db3"
}

TASK [app : include_vars] ******************************************************
ok: [appserv1]

TASK [app : test] **************************************************************
ok: [appserv1] => {
    "msg": "appName=inst1 appDB=db1"
}

TASK [app : include_vars] ******************************************************
ok: [appserv1]

TASK [app : test] **************************************************************
ok: [appserv1] => {
    "msg": "appName=inst2 appDB=db2"
}

PLAY RECAP *********************************************************************
appserv1                   : ok=8    changed=0    unreachable=0    failed=0   
appserv2                   : ok=5    changed=0    unreachable=0    failed=0   

$ 

以上

PR-400KIの初期化

PR-400KIのパスワードを忘れてしまったので初期化しました。

必要なもの

  • 針金
  • LANケーブル
  • 有線LANで接続可能なブラウザがインストールされたPC
  • プロバイダの認証IDとパスワードが記載された紙

手順

手順は、PR-400KI取扱説明書の8-10ページにあります。

手順実施後にPCを有線LANで接続し、http://ntt.setup/にアクセスします。 初期パスワード設定を求められるので設定します。 基本設定の一番上のメイン接続にプロバイダの認証IDとパスワードを入力して接続を確認する。

以上

softbank光への切り替え

フレッツ光+プロバイダを使ってきましたがsoftbank光に切り替えました。

光BBユニットの設定を朝10時頃から設定を始め夜7時になっても設定は完了しませんでした...

光BBユニットの設定は諦めて、これまで使ってきたNTTのルータと自前のWi-Fiルータ(TimeCapsule)の手動設定に切り替えたところ10分で設定が完了しました。

接続するだけで設定はいらない?

店頭では、「光BBユニットを接続するだけで設定が完了する」と説明を受けました。 「光BBユニット接続ガイド」には、下記のように「以前に使っていたプロバイダーの設定をされている場合は、その設定を削除して下さい。」と記載されています。また、ここに記載されている説明では、NTTのルータ機種別にIPV6のセキュリティ設定追加が必要と記載があります。

設定変更する前にサポートに電話することにしました。

f:id:ksaito11:20160223210048p:plain

ご利用開始日の朝から使えるとは限らない

サポートに電話したところ、「局側の工事が午前中の予定なので、15時過ぎに、再度、やり直して問題があったら改めて連絡して欲しい」とのことでした。サポートは工事完了後の接続についてのサポートしかしていないということで、工事の見込み、完了しているか、していないか、と言ったことには何も答えてもらえませんでした。

工事が完了しても繋がるとは限らない

余裕を見て16時頃にリトライしましたが状況は、改善しなかったので、サポートに再度連絡しました。

気になっていた、「NTTのルータに設定されている前のプロバイダの情報は削除する必要があるか」は、不要ということで、BBユニット、NTTルータの順番に電源を抜いて、しばらく待ち、NTTルータ、BBユニットの順に電源を入れるよう指示があり、実施したところオレンジの点滅から緑の点滅に変わりました。

  • サポート「これでしばらく待つと緑の点灯となれば接続完了です。」
  • わたし「通常だと、どのくらいかかりますか?」
  • サポート「通常は1時間くらい、混み合っていると半日くらいかかります。でも、今緑の点灯になっているので早いと思います。」
  • わたし「...様子を見てみます。」

その後、3時間ほど緑の点滅が続き自動設定を諦めました...

光BBユニットは諦めて、既存設備を手動設定

時間切れなので、光BBユニットはとりあえず諦めて、既存設備を手動設定することにしました。

NTTのルータは、PR-400KIです。有線LANで直接PCを接続しブラウザでhttp://ntt.setup/にアクセスします。

ルータにSoftbankから届いた「ご利用開始のご案内」に記載されている認証ID(S-ID)と認証パスワードを入力したら設定が完了しました。

この状態で、光BBユニットを接続してみましたが、今度は、オレンジの点滅となり、最後まで光BBルータは、動作しませんでした。

後日、リトライするかも...

後日、時間ができたら以下の手順を検証してみるかも

  • NTTのルータを初期化
  • 光BBユニット接続ガイドの通りに設定

以上

iOSのリモートデスクトップ

Windows環境をiPhoneだけで構築できるか検証してみました。

  1. iPhoneSafariAWSコンソールに接続してWindowsインスタンスを作成
  2. iOSリモートデスクトップアプリで接続

iPhoneSafariAWSコンソールに接続してWindowsインスタンスを作成

これは、普通にできました。

接続に必要なパスワードを取得するための秘密鍵は、メモ帳で共有しておく必要があります。 iPhone秘密鍵のテキストをコピーしてWIndows接続に必要なパスワードを入手します。

iOSリモートデスクトップアプリで接続

マイクロソフト社製のリモートデスクトップアプリをインストールします。

接続先を登録します。

f:id:ksaito11:20160220220236p:plain

iPhone 6sで下記の画面です。

f:id:ksaito11:20160220220326p:plain

拡大もできるので、ちょっとした操作は問題なくできそうです。

f:id:ksaito11:20160220220359p:plain

以上