カメニッキ

カメとインコと釣りの人です

ansibleメモ

どれもマニュアルに載ってるやつです

command

ansible

指定したホストに対し、単一モジュールの実行を行う

[~]$ ansible hostA -i inventory -m ping
hostA | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

ansible-console

指定したホストに対し、インタラクティブにモジュール実行を行う

[~]$ ansible-console hostA:hostB -i inventory
Welcome to the ansible console.
Type help or ? to list commands.

tahira@hostA*:hostB* (2)[f:5]$ ping
hostA | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
hostB | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

ansible-doc

モジュールのドキュメントを表示

# モジュールの一覧表示
[~]$ ansible-doc -l
a10_server                         Manage A10 Networks AX/SoftAX/Thunder/vThunder devices
a10_service_group                  Manage A10 Networks devices' service groups
a10_virtual_server                 Manage A10 Networks devices' virtual servers
acl                                Sets and retrieves file ACL information.
add_host                           add a host (and alternatively a group) to the ansible-playbook...
airbrake_deployment                Notify airbrake about app deployments
・・・
# yumモジュールのドキュメント表示
[~]$ ansible-doc yum
> YUM

  Installs, upgrade, removes, and lists packages and groups with the `yum' package manager.

Options (= is mandatory):

- conf_file
        The remote yum configuration file to use for the transaction.
・・・

ansible-galaxy

世界中のansibler(?)の作ったRoleを入手できる

[~]$ ansible-galaxy install username.jenkins

ansible-vault

ソースコード管理に平文のまま登録したくない情報を暗号化できる

# 暗号化
[~]$ ansible-vault encrypt private.yml
# 暗号化したプレイブックを実行する場合は--ask-vault-passを指定して実行する
[~]$ ansible-playbook -i inventory private.yml --ask-vault-pass
# 修正する場合は復号化する
[~]$ ansible-vault decrypt private.yml

option

※ 主にansibleコマンドに対するもの

やりたいこと option
sudoして実行 -s
パスワードが必要なsudo -sK
sudoユーザの指定 -U SUDO_USER
inventory & ホストで処理対象となるホスト確認 –list-hosts
並列数の指定 -f 10
使用するモジュール指定 -m shell
モジュールにわたす引数 -a ARGS (例: -m shell -a ‘uname -a’)
実行ユーザ指定 -u USERNAME
タイムアウト時間指定 -T 5
ログ出力 -t logfilename (例:
-t logs/date +%Y/date +%m/date +%d/date +%H%M
)

perlのDBIでset sessionした値が効いてなくて困ってた

perlからMySQLにGrant発行するときに、条件に応じてset sessionしたかった。

        $dh = Data::ObjectDriver::Driver::DBI->new(
            dsn             => 'dbi:mysql:mysql:127.0.0.1',
            username        => root,
            password        => password,
            reuse_dbh       => 1,
            connect_options => {
                 mysql_auto_reconnect => 1,
                 Callbacks => {
                   connected => sub {
                     shift->do(q{
                         SET SESSION old_passwords=0;
                     });
                     return;
                   },
                },
            },
        );

        $dh = $dh->rw_handle;
        my $sql = "GRANT ALL PRIVILEGES ON `dbname`.* TO `hoge`@`fuga` IDENTIFIED BY \"pass\";";
        $dh->do($sql);

みたいなコード書いてるのに、old_password=0が効いてなくてあれ?ってなってた。 tcpdumpで眺めてたら再接続されているっぽい

15:35:25.472990 IP 192.168.0.1.45833 > 192.168.0.2.mysql: Flags [P.], seq 109:188, ack 98, win 46, options [nop,nop,TS val 2930090828 ecr 853280486], length 79

                        SET SESSION old_passwords=0;

15:35:25.473281 IP 192.168.0.1.45833 > 192.168.0.2.mysql: Flags [P.], seq 188:193, ack 109, win 46, options [nop,nop,TS val 2930090829 ecr 853280486], length 5
15:35:25.473493 IP 192.168.0.1.45833 > 192.168.0.2.mysql: Flags [P.], seq 193:198, ack 120, win 46, options [nop,nop,TS val 2930090829 ecr 853280487], length 5
15:35:25.473499 IP 192.168.0.1.45833 > 192.168.0.2.mysql: Flags [F.], seq 198, ack 120, win 46, options [nop,nop,TS val 2930090829 ecr 853280487], length 0
15:35:25.473638 IP 192.168.0.1.45834 > 192.168.0.2.mysql: Flags [S], seq 174310667, win 5840, options [mss 1460,sackOK,TS val 2930090829 ecr 0,nop,wscale 7], length 0
15:35:25.473669 IP 192.168.0.1.45833 > 192.168.0.2.mysql: Flags [.], ack 121, win 46, options [nop,nop,TS val 2930090829 ecr 853280487], length 0
15:35:25.473808 IP 192.168.0.1.45834 > 192.168.0.2.mysql: Flags [.], ack 160687258, win 46, options [nop,nop,TS val 2930090829 ecr 853280487], length 0
15:35:25.474039 IP 192.168.0.1.45834 > 192.168.0.2.mysql: Flags [.], ack 71, win 46, options [nop,nop,TS val 2930090829 ecr 853280487], length 0
15:35:25.474077 IP 192.168.0.1.45834 > 192.168.0.2.mysql: Flags [P.], seq 0:75, ack 71, win 46, options [nop,nop,TS val 2930090829 ecr 853280487], length 75
15:35:25.474361 IP 192.168.0.1.45834 > 192.168.0.2.mysql: Flags [P.], seq 75:88, ack 76, win 46, options [nop,nop,TS val 2930090830 ecr 853280488], length 13
15:35:25.474624 IP 192.168.0.1.45834 > 192.168.0.2.mysql: Flags [P.], seq 88:223, ack 87, win 46, options [nop,nop,TS val 2930090830 ecr 853280488], length 135
E...fK@.@.....iV..h..
..
c.d ..............
...N2........GRANT ALL PRIVILEGES ON `dbname`.* TO `user`@`host` IDENTIFIED BY "aaaaa";

DBI - search.cpan.org この辺みて、connected時にset sessionしてあげるのが良い方法だと思ってたけど、どうやら DBD::mysqlのmysql_auto_reconnectが真だとDB再接続時にDBICのon_connect_doが実行されない件 - Unknown::Programming なのかな?10年前に似たようにハマった人がいて嬉しいきもちになった

w3-total-cacheプラグインで、サーバエラーが発生する問題の対処法

これの続き

tapira.hatenablog.com

対処法

結論から言うと w3-total-cacheDatabase Cache 無効化で良い

再現

  1. wordpressインストール
  2. w3-total-cacheプラグインインストール
  3. General Settings にて以下を有効化。他はデフォ値で。
    Page Cache / Database Cache / Object Cache / Browser Cache
  4. 画像を含んだ投稿をおこなう
  5. 管理者ログアウトした状態でトップページ表示

原因(?)

細かく追ってないけど Object Cache が消えているのに、 Database Cache がファイルがあるものとして記憶しているっぽくて No such file or directory の後、無限ループに入り死んでるように見える。(違ったらすいません)

レンサバ何箇所かで試すと再現するけど、プラグインの問題なのだろうか

PHPがsegmentation faultで死ぬ原因を追跡する

発端

WordPressで構築されたサイトで 502 Proxy Error が出る、という問題が発生した。

[LB] -> [Reverse proxy] -> [Webサーバ] という構成のため、ユーザへ返るステータスコードReverse proxy が吐いてる。
ここが 502 Proxy Error となるのは、プロキシした先の Webサーバhttpdプロセスが異常終了してしまっている事が原因だった。

※ちなみに今回PHPのセグフォでhttpdが死んでいるのは、dsoだったため。httpdから生えたcgiだった場合、cgiのセグフォをhttpdが検知できるので、恐らく500エラーを返すことになる

なぜ異常終了しているかを調べた(未解決)


  • httpdのエラーログを見ると、プロセスがセグフォで死んでいることがわかる。
[Wed Nov 30 11:53:51.240210 2016] [core:notice] [pid 16547] AH00052: child pid 18079 exit signal Segmentation fault (11)
  • straceでセグフォで死ぬプログラムをみてみると brk システムコールを呼び続けて最後に死んでた
brk(0x5631000)                          = 0x5631000
brk(0x5671000)                          = 0x5671000
brk(0x56b1000)                          = 0x56b1000
brk(0x56f1000)                          = 0x56f1000
brk(0x5731000)                          = 0x5731000
brk(0x5771000)                          = 0x5771000
brk(0x57b1000)                          = 0x57b1000
brk(0x57f1000)                          = 0x57f1000
brk(0x5831000)                          = 0x5831000
brk(0x5871000)                          = 0x5871000
brk(0x58b1000)                          = 0x58b1000
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++

brkシステムコール直前 wp-content/cache/object/ とキャッシュを触っており、キャッシュ関連のプラグインが怪しいと目星がついたので、試しにそのプラグインを無効化すると、本問題は発生しなくなった。
プラグイン無効化で終わり、でもいいが、なぜセグフォするのかもう少し調査
- 次にcore dumpを吐かせた

# coreファイルのサイズ制限を外す
$ ulimit -c unlimited
# 確認
$ ulimit -a | grep core
# 問題のコードを実行する
# カレントディレクトリにcoreがはかれる
$ ls -l core.19380
# fileコマンドで何のプログラムでセグフォしたcoreかみれる
$ file core.19380
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, from '/usr/local/php/bin/php-cgi sample.php'
# gdbで解析
$ gdb /usr/local/php/bin/php-cgi -c core.19380
()
Core was generated by `/usr/local/php/bin/php-cgi sample.php'.
Program terminated with signal 11, Segmentation fault.
#0  zend_parse_arg (arg_num=1, arg=0x5e4a6b8, va=0x7ffdbf6cd110, spec=0x7ffdbf6cd0c8, quiet=0, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_API.c:686
686 /tmp/php-build/source/5.6.21/Zend/zend_API.c: そのようなファイルやディレクトリはありません.
    in /tmp/php-build/source/5.6.21/Zend/zend_API.c
(略)
(gdb) bt
#0  zend_parse_arg (arg_num=1, arg=0x5e4a6b8, va=0x7ffdbf6cd110, spec=0x7ffdbf6cd0c8, quiet=0, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_API.c:686
#1  0x000000000089dec3 in zend_parse_va_args (num_args=<value optimized out>, type_spec=0xa2b863 "s", va=0x7ffdbf6cd110,
    flags=<value optimized out>, tsrm_ls=0x1b350c0) at /tmp/php-build/source/5.6.21/Zend/zend_API.c:873
#2  0x000000000089e7d6 in zend_parse_parameters (num_args=1, tsrm_ls=0x1b350c0, type_spec=<value optimized out>)
    at /tmp/php-build/source/5.6.21/Zend/zend_API.c:924
#3  0x00000000008a8464 in zif_defined (ht=<value optimized out>, return_value=0x5dff408, return_value_ptr=<value optimized out>,
    this_ptr=<value optimized out>, return_value_used=<value optimized out>, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_builtin_functions.c:735
#4  0x000000000091bf93 in zend_do_fcall_common_helper_SPEC (execute_data=<value optimized out>, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_vm_execute.h:558
#5  0x0000000000909c4b in execute_ex (execute_data=0x5e4a610, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_vm_execute.h:363
#6  0x000000000091c44e in zend_do_fcall_common_helper_SPEC (execute_data=<value optimized out>, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_vm_execute.h:592
#7  0x0000000000909c4b in execute_ex (execute_data=0x5e4a3d0, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_vm_execute.h:363
#8  0x000000000091c44e in zend_do_fcall_common_helper_SPEC (execute_data=<value optimized out>, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_vm_execute.h:592
#9  0x0000000000909c4b in execute_ex (execute_data=0x5e49b38, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_vm_execute.h:363
#10 0x000000000091c44e in zend_do_fcall_common_helper_SPEC (execute_data=<value optimized out>, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_vm_execute.h:592
#11 0x0000000000909c4b in execute_ex (execute_data=0x5e499d0, tsrm_ls=0x1b350c0)
    at /tmp/php-build/source/5.6.21/Zend/zend_vm_execute.h:363
(略)

Zend/zend_vm_execute.h:363行目Zend/zend_vm_execute.h:592行目 が無限につづいていた。
なんでこうなるのかよくわかってない。Zendのバグなんじゃないの?とか思って眺めてた。
また、上記の問題は thread safe版 の場合。試しに同じconfigureオプションで作った non thread safe版 を使用して同じプログラムを実行させると、セグフォはおきなかった。
その代わりに brk システムコールを無限に実行し続けて memory_limit の値に引っかかってた。
試しに1GBほど割り当てても同様に全て食いつぶしてメモリ不足になってたので、やっぱりZendのバグなんじゃないの?とか思ってる。
ここからどうすれば根本的な原因(もしあるならバグの箇所)までたどり着けるのか、調べ方がわからない。勉強しようと思った

追記: 原因と思われるもの

tapira.hatenablog.com

IIJmio みおふぉんへMNPで乗換希望の人に見せるページ

身内や知人にちょいちょい聞かれるので、まとめとく。 内容間違ってたらすいません

IIJmio みおふぉん?

IIJのやってる音声通話付の格安SIMサービスのこと。 docomo回線とau回線を使用しており、自分が使っている限り通信速度に不満無し。

特徴

  • 前述の通り、回線品質は良い
  • 音声通話付の場合、12ヶ月以内の解約は (12ヶ月 - 使用した月数) * 1,000円 かかる。それ以降、いつでもOK
  • 高速データ通信残量は翌月持ち越し可能。ミニマムスタートプランでは 3GB/月 付与され、2.5GB使った場合、翌月は3.5GB使える

プラン(一人(SIM一枚)向け)

  • (最安) 通話可能で3GB/月 高速通信可能 音声通話は従量課金・3GB使用後は低速で使い放題
    • ミニマムスタートプラン 900円 + 音声通話付帯 700円 + その他雑費 = 約1,800円(税込み)
  • 5分以内通話し放題で3GB/月 高速通信可能
    • ミニマムスタートプラン 900円 + 音声通話付帯 700円 + かけ放題 830円 + その他雑費 = 約2600円(税込み)

プラン(複数人(SIM複数枚)向け)

  • SIM2枚通話可能で月10GB(全体で共有)
    • ファミリーシェアプラン 2560円 + (音声通話付帯 700円 * 2枚) + その他雑費 = 約4,300円(税込み)
  • SIM3枚通話可能で月10GB(全体で共有)
    • ファミリーシェアプラン 2560円 + (音声通話付帯 700円 * 3枚) + その他雑費 = 約5,000円(税込み)
  • SIM4枚通話可能で月10GB(全体で共有)
    • ファミリーシェアプラン 2560円 + (音声通話付帯 700円 * 4枚) + (追加SIM利用(4枚目以降) 400円 * 1枚)+ その他雑費 = 約6,300円(税込み)

注意事項

  • 通話料金まあまあ高い。
    • 20円/30秒 基本、みおふぉんダイヤルというアプリを利用するので、実質は 10円/30秒
  • SIMサイズ変更時に費用がかかる
    • 2000円/1回
  • 初期費用がかかる
    • 3000円
  • MNP転入できるのは、みおふぉんと3大キャリアの契約者名が同じ場合のみ
    • 結構罠で、夫婦のキャリアまとめるときに面倒。キャリア側で名義変更をやっておかなくてはいけない。
  • オンライン申込だと利用できない期間が発生する

申込の流れ

  1. 端末用意
  2. 別にSIMフリーじゃなくてもdocomoまたはauの端末がそのまま使えるっぽい
  3. キャリア同様、端末を割賦購入するプランもある
  4. たとえば ASUS ZenFone 3 Laserなら24回払いで 1,200円/月 なので、最安プランと併用すると 1,200円 + 1,800円 = 約3,000円/月
  5. IIJmio会員登録
  6. クレカと本人確認書類がいる
  7. MNP転出予約番号の取得
  8. 契約中のキャリアにネットか電話で取得できる
  9. MNP転出予約番号をもってみおふぉんの申込

やっておくこと

  • キャリアの解約可能月確認
    • だいたい二年毎に一ヶ月間解約料かからない月がある。要確認 

やらなくていいこと

  • キャリアへの解約依頼
    • MNP転入完了をもって解約になるっぽい

実際いくら払ってんの?

自分 + 妻で音声通話付きのSIMを2枚利用中。10GB使えるので、動画やkindle本ダウンロードなど余り気にせずやっても足りてる。
請求金額の実績は以下 妻実家との通話が結構多くて、毎月 1,400円 くらいかかってる。受ける専用だったら 4000円で済むのに…

2016年08月 5,436円
2016年09月    5,350円
2016年10月    5,530円

まとめ

  • iPhoneやXperiaZシリーズのような、10万円近くするスマホの場合、割賦が使えないから一括で買わなくちゃいけなくてちょっと辛い
    • もし金利無しの24回払いできても端末だけで 4,000円/月 なので毎月の支払いは最安プランでも6000円くらい
    • キャリアとあんまりかわらない。解約月の縛りないからそれでもこっちがお得だとは思う
  • タブレットなんか買い足すときにデータ通信専用SIMだったら、SIM追加手数料だけで増やせるからすごい助かる

最後に

申し込む人は以下からよろしく

お友達紹介キャンペーン | IIJmio

または

紹介コード 633 5790 8195 4353

5人紹介すると、なんと バッジ がもらえるらしい