Tocyukiのブログ

ギターと柔術とプログラミングが好き!

MySQLで時間のかかっているクエリを強制終了させる

DB触ってない勢なのでDB周りの運用を覚えていかないとやばい〜、というわけで最近ちょくちょく発生しているMySQLで時間のかかっているSELECT文を強制終了させるというオペレーションの備忘録として残しておきます。

この対応が最高にイケていないというのは重々承知の上ですが、ちょっと特殊な環境のサーバー&アプリで移行も控えているということで人力で頑張っている感じです!

MySQLでクエリの一覧を表示させる

まずは現在実行されているクエリの一覧をSHOW PROCESSLISTコマンドで表示させる

mysql> SHOW PROCESSLIST;
+----+------+-----------+------+---------+------+------------+--------------------+
| Id | User | Host      | db   | Command | Time | State      | Info               |
+----+------+-----------+------+---------+------+------------+--------------------+
| 88 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 89 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 90 | root | localhost | NULL | Query   |   96 | User sleep | select sleep (100) |
| 91 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 92 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 93 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 94 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 95 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 96 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 97 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 98 | root | localhost | NULL | Query   |    0 | starting   | SHOW PROCESSLIST   |
+----+------+-----------+------+---------+------+------------+--------------------+
11 rows in set (0.00 sec)

通常、Info 列に表示されるクエリは100文字を越えると省略されますが、FULL オプションを指定すると、省略せずクエリの全文が表示される その際、表示が崩れるようであれば\Gオプションでクエリ結果を垂直表示すると見やすくなる

mysql> SHOW FULL PROCESSLIST \G;

対象のクエリを強制終了させる

KILL CONNECTION <processlist id>コマンドで対象のクエリを強制終了させる

mysql> KILL CONNECTION 90;
Query OK, 0 rows affected (0.00 sec)

再度クエリの一覧を確認する

id 90のクエリが消えているのが確認できました!

mysql> SHOW PROCESSLIST;
+----+------+-----------+------+---------+------+------------+--------------------+
| Id | User | Host      | db   | Command | Time | State      | Info               |
+----+------+-----------+------+---------+------+------------+--------------------+
| 88 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 89 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 91 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 92 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 93 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 94 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 95 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 96 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 97 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 98 | root | localhost | NULL | Query   |    0 | starting   | SHOW PROCESSLIST   |
+----+------+-----------+------+---------+------+------------+--------------------+
10 rows in set (0.00 sec)

複数のクエリを一発でKILLしたい場合

以下のクエリでプロセスIDを抽出可能(60秒以上かかっている処理を抜き出したい場合)

mysql> SELECT GROUP_CONCAT(ID) FROM information_schema.PROCESSLIST WHERE TIME > 59;
+------------------+
| group_concat(ID) |
+------------------+
| 1,2,3,4,5        |
+------------------+

GROUP_CONTACT関数を使うことで複数レコードをカンマ区切りで1行にまとめられるが、MySQL内のkillコマンドでは複数IDを受け付けてくれてくれないため、 一旦MySQLから抜けてmysqladminコマンドで実行する必要がある

mysqladmin kill 1,2,3,4,5 -h localhost -u foo

KILL QUERYKILL CONNECTIONの違い

MySQLでクエリを強制終了させる場合、KILL QUERYKILL CONNECTIONのコマンドがるのですが、基本的にはKILL CONNECTIONコマンドを実行するのが今回の運用では適切っぽいですね。

その理由としてはKILL QUERYコマンドではステートメントは終了されるが、トランザクションは終了されないので、接続自体が残ってしまうからのようです。

そんなわけで

DBに強くなりたいと心から願っている今日このごろです。。。

参考情報

dev.mysql.com

VScodeのVimプラグインでh,j,k,lキー押しっぱなしで移動できない問題

最近のVScodeちゃんの出来が良すぎてVimを使い続けていく気持ちを維持できなくなってきている今日このごろでございます・・・><

いやー、この問題なんだけども職場ではMacbook Pro使ってて家ではMacbook Air使ってるんですが、自体のMacのVScodeでしか起きなくて放置してたんですが、ちょっと調べて見るかーと思ったら普通にマーケットプレイスのVimプラグインのページに丁寧に記載があったのですぐ解決できたって話\(^o^)/

marketplace.visualstudio.com

のページの以下の部分

To enable key-repeating execute the following in your Terminal and restart VS Code:

というわけで以下のコマンド打ったら無事解決したのでありました。

$ defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false 
$ defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false
$ defaults delete -g ApplePressAndHoldEnabled

【参加レポ】SRE Next 2020に参加してきた!

ブログに書くまでがSRE Nextというわけで参加レポ書いていくよ!
というか今年は週一ぐらいで頑張ってブログ書きたいと思っていたのに今年初ブログですわ・・・^^

まぁ、そんなわけでSRE Next2020に同僚と参加してきましたよ!

sre-next.dev

もちろん早期来場者特典のヨガから参加しましたよ!

実際に見た基調講演たち

speakerdeck.com

speakerdeck.com

speakerdeck.com

speakerdeck.com

speakerdeck.com

docs.google.com

speakerdeck.com

感想

まず基調講演を聞いていて感じたのはSREとして抱える課題が今の会社で抱えている課題と結構同じだったことにびっくりしたというか、スキルセット的な難しさもあるけど、どうSREチームとして成果を上げていくのかというのは程度の差はあれどこも課題があるんだなぁというのを知れたのは良かったというか安心したし、今自分が課題に対してやろうとしていることもずれていないというのも確認できたので一番の収穫だった!

そしてそういった課題感からなのか組織論というかチームリーディングなどの話などもたくさんあったのが印象的で、とくにそのっつさんの基調講演はとても共感でき、単純にかっこいいなぁと思ったし、こんなリーダーがいるチームは幸せなんだろうなといろいろと妄想してしまったw

やっぱり、背中で見せるのは大事だよなぁと思いつつも背中で語れるスキルが身に付いていないので頑張ろうと思いました\(^o^)/

さすがにメルカリやカヤックの基調講演は圧巻というかすごいなぁという感じでSREチームとして理想的だなぁと思える取り組みや施策、改善をきちんと進められているのがさすがという感じでした。

とにかく今の自分にとってとても有意義な時間となり、モチベーションが上がりまくった一日でした!

あと個人的に会いたかった方に会えたり、SREの知り合いが増えたのもとっても嬉しかったー!

あとメルカリブースでSREクイズ行っていて献本頂いてしまったり

ノベルティたくさんもらいまくったり

とにかく内容盛り沢山で全部おもしろくて本当に参加してよかった!

また次回開催されたら必ず参加します!

おわりに

さっそく基調講演資料をまとめてくれている方がいらっしゃるので気になる方は是非見てみてください! qiita.com

つぎはMerPey Tech Festいくぞー!

events.merpay.com

2019年の振り返りと2020年の目標

なんだかあっという間の2019年でした〜。
でもなかなか濃厚な一年でもあったような気もする。

  • 3人目の子供が産まれる(2018年末だけども)
  • 虫歯を11本治療(あとは親不知の抜歯のみ)
  • AWS触り始めてとりあえずSAA取得
  • セブ島に一ヶ月語学留学
  • 転職し、名ばかりのSREになる
  • フットサル再開
  • 柔術紫帯ストライプ2本もらうも転職に伴い道場を退会
  • ゴールドジムに入会しボディメイクに本気出すことを誓う

今年はそんな感じでした!
それでは来年の抱負をつらつらと述べようかと!

勉強

  • TOEIC700点以上
  • AWS資格5冠達成(残りSysOps/Developer/SAP/DevOpsの4つを取得)
  • 今積まれている技術書やUdemyを消化する(主にPython系を)

仕事

  • 監視基盤の再構築
  • CI/CDパイプライン構築&運用にのせる
  • GitHub、Slackの導入
  • 定期的な勉強会の実施

健康

  • 6月までの間最低週2回は追い込む
  • 体脂肪率15%を切る
  • 7月から柔術再開し最低週2回稽古を行う

その他

  • ブログを週に一度は書く

そんなわけで

2020年は一番上の子供も小学校に入ったり、生活面での変化も色々予定されているので、確固たる決意を持って2020年も頑張りたいなと思います!

今年もお世話になりました!来年もよろしくおねがいします!

【厳選】AWSアソシエイト試験を突破するための公式ドキュメントおよびチュートリアル

以下に挙げたAWS公式ドキュメントを読んでチュートリアルを実施していればAWSをいじった経験がなくてもアソシエイト試験は軽々突破できるぜよ!!

そう信じて頑張っていこうぜよ!!

コンピューティング

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

ストレージ

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

データベース

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

開発者ツール

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

セキュリティ、アイデンティティ、コンプライアンス

docs.aws.amazon.com

暗号化と PKI

docs.aws.amazon.com

docs.aws.amazon.com

マネジメントとガバナンス

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

ネットワーキングとコンテンツ配信

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

アプリケーション統合

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

【Python】リストの要素を頻出順でソートする

やりたいこと

例えば以下のようなリストを

[5, 4, 3, 5, 5, 5, 4, 4, 3, 2]

こうしたい場合のTipsです

[5, 5, 5, 5, 4, 4, 4, 3, 3, 2]

できあがったコード

from collections import Counter

a = [5, 4, 3, 5, 5, 5, 4, 4, 3, 2]
counter = Counter(a)
result = [k for k, v in counter.most_common() for _ in range(v)]
print(result)
# [5, 5, 5, 5, 4, 4, 4, 3, 3, 2]

色々やりかたはあると思うけど、とりあえずリストを手っ取り早く要素毎に辞書形式でカウントアップしてくれるCounterと要素数毎に返してくれるmost_common()を使って実装してみた。

まず、対象のリストをCounter()メソッドを使って要素: 要素数の辞書型で返すようにする

a = [5, 4, 3, 5, 5, 5, 4, 4, 3, 2]
counter = Counter(a)

print(counter)
# Counter({5: 4, 4: 3, 3: 2, 2: 1})

ちなみにtype関数で型を見るとcollection型になっている

>>> type(counter)
<class 'collections.Counter'>

これをさらにmost_common()を使って値の昇順で返すようにして、

>>> counter.most_common()
[(5, 4), (4, 3), (3, 2), (2, 1)]

あとは以下のようなイメージのforループを内包表記で記載すればリストの要素を頻出順でソートすることができた!

このforループを

reuslt = []
for k, v in counter.most_common():
    for _ in range(v):
        result.append(k)

こんな感じで内包表記!

result = [k for k, v in counter.most_common() for _ in range(v)]

もっと良い方法等あれば教えてつかーさい^^

GitLab CI + GitLab Pages + Sphinx で最強のドキュメントビルド環境を構築する

最近、仕事で運用しているサービスのドキュメントをもうWordで作りたくないという思いがすごくてSphinxがよさそうなのでいろいろいじってたらGitLab CI + GitLab Pages + Sphinxが最強のドキュメントビルド環境すぎたのでやり方を説明します。

前提条件

  • GitLab.comでアカウント作成済み
  • Sphinxで初回ビルドできる環境を構築済み

やること

  • リポジトリの作成とクローン
  • リポジトリのクローン
  • Sphinxでプロジェクトの作成
  • .gitlab.ymlを作成し、GitLabへPush後、CI結果を確認
  • GitLab Pagesへアクセス

リポジトリの作成とクローン

なんか適当にREADMEだけあるようなリポジトリを作成してクローンしておく

Sphinxでプロジェクトの作成

$ sphinx-quickstart -q -p sphinx-handson -a Tocyuki -v 1.0 sphinx-handson

状態の確認

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Makefile
        conf.py
        index.rst
        make.bat

GitLabへPushしておく

$ git add .
$ git commit -m 'Create sphinx-handson project'
$ git push

.gitlab.ymlを作成し、GitLabへPush後、CI結果を確認

以下のページを参考にして.gitlab.ymlを作成する

gitlab.com

image: alpine

pages:
  script:
  - apk --no-cache add py2-pip python-dev
  - pip install sphinx
  - apk --no-cache add make
  - make html
  - mv _build/html/ public/
  artifacts:
    paths:
    - public
  only:
  - master

GitLabへPush

$ git add .
$ git commit -m 'Create .gitlab-ci.yml'
$ git push

CI結果がパスしていることを確認 f:id:tocguitar1:20190129014622p:plain

GitLab Pagesへアクセス

以下のページからGitLab PagesのURLを確認する

f:id:tocguitar1:20190129014728p:plain

画面が正常に表示されることを確認

f:id:tocguitar1:20190129014902p:plain

おわりに

GitLabでCI環境作ってしまえばGitLab Pagesへテスト後自動でデプロイされるしめちゃ便利!
GitHubはデファクトスタンダードだけど、GitLabですべて完結できるのは大きいなぁと感じました!

今後はGitLabを中心に使っていこうかなー。

参考情報

今回使用したリポジトリです。 gitlab.com

Sphinxユーザーの会 sphinx-users.jp

Amazon S3で処理速度(パフォーマンス)を上げる方法

タイムスタンプやアルファベット順などの連続するプレフィックスを使用すると、Amazon S3 の特定のパーティションに大量のキーが集中し、そのパーティションの I/O 容量がひっ迫する場合があります。

上記が原因で以下のような問題が発生することがある。

Amazon Simple Storage Service (Amazon S3) のワークロードが急増する (「リクエスト率およびリクエストパフォーマンスに関する留意事項」で説明されているリクエスト率を超える) と、ワークロードに応じて Amazon S3 のパフォーマンスがスケールされません。これに伴って、HTTP 500 や 503 エラーが発生する場合があります。

上記問題に対応するにはどうするか?

ランダムなキー名にすると、I/O の負荷は複数のインデックスパーティションに分散されます。

各オブジェクト名にランダム文字列をプレフィックスとして付加すればよいってことですねー!

aws.amazon.com

【決定版】AWS 認定ソリューションアーキテクト – アソシエイト取得までの道のり

タイトルは釣りですが、業務でちょこちょこAWSいじるようになった(仕向けた)ので、とりあえず資格も取得するぞと意気込んでおりまして、すでに合格したという体でお送りいたします!!

というのも、実はすでに有料のバウチャー付きトレーニングを受けているので取らなければならないのです/(^o^)\

追記

とりあえず以下の流れで大丈夫かな?

試験ガイドの確認

aws.amazon.com

試験ガイドを確認し、どんな試験なのかなぁ〜、というのをなんとなく把握しておく。

分野 試験における比重
分野 1: 回復性の高いアーキテクチャを設計する 34%
分野 2: パフォーマンスに優れたアーキテクチャを定義する 24%
分野 3: セキュアなアプリケーションおよびアーキテクチャを規定する 26%
分野 4: コスト最適化アーキテクチャを設計する 10%
分野 5: オペレーショナルエクセレンスを備えたアーキテクチャを定義する 6%
合計 100%


分野 1: 回復性の高いアーキテクチャを設計する

  • 1.1 信頼性と回復性の高いストレージを選択する。
  • 1.2 AWS サービスを使用した分離機構を設計する方法を定義する。
  • 1.3 多層アーキテクチャソリューションを設計する方法を定義する。
  • 1.4 可用性またはフォルトトレラント性 (あるいはその両方) が高いアーキテクチャを設計する方法を定義する。

分野 2: パフォーマンスに優れたアーキテクチャを定義する

  • 2.1 パフォーマンスの高いストレージとデータベースを選択する。
  • 2.2 キャッシュを使用してパフォーマンスを向上させる。
  • 2.3 伸縮性と拡張性を備えたソリューションを設計する。

分野 3: セキュアなアプリケーションおよびアーキテクチャを規定する

  • 3.1 アプリケーション層をセキュリティ保護する方法を定義する。
  • 3.2 データをセキュリティ保護する方法を定義する。
  • 3.3 単一の VPC アプリケーション用のネットワークインフラストラクチャーを定義する。

分野 4: コスト最適化アーキテクチャを設計する

  • 4.1 コスト最適化ストレージを設計する方法を定義する。
  • 4.2 コスト最適化コンピューティングを設計する方法を定義する。

分野 5: オペレーショナルエクセレンスを備えたアーキテクチャを定義する

  • 5.1 オペレーショナルエクセレンスを実現するソリューションの設計特性を選択する。

AWS Well-Architected フレームワークのホワイトペーパーを確認

aws.amazon.com

AWS Well-Architected フレームワークのホワイトペーパーを確認し、特定のアーキテクチャがクラウドのベストプラクティスに沿っているかどうかの指標を理解する。

AWS クラウドサービス活用資料集を確認

aws.amazon.com

いわゆるブラックベルトですね!主要サービスのものは一通り確認しておくべし!

併せてホワイトペーパーガイドと API リファレンスも見ておくとなおよし!

AWSのサービスを実際にいじってみる

aws.amazon.com

aws.amazon.com

aws.amazon.com

AWSではさまざまなチュートリアルが用意されているので、チュートリアルに沿って実際に手を動かしてみると理解もめちゃくちゃ深まります!というかサービスをまったく使ってなくて試験受けるとなるとほんと暗記だけで終わってしまうので実際のサービスは一通りいじっておくことをオススメします。

サンプル問題と模擬試験の問題内容解析

サンプル問題が公開されているので問題内容の確認と分析を行う。

aws.amazon.com

一通りのインプットが完了したら、模擬試験を受験し、現在の実力の確認と、問題内容のスクリーンショット取得を行い、問題の分析を行いましょう!

おすすめの参考書

あと年末更新されたこの参考書もおすすめです!

徹底攻略 AWS認定 ソリューションアーキテクト ? アソシエイト教科書

徹底攻略 AWS認定 ソリューションアーキテクト ? アソシエイト教科書

  • 作者: ??部昭寛,宮?光平,菖蒲淳司,株式会社ソキウス・ジャパン
  • 出版社/メーカー: インプレス
  • 発売日: 2019/01/18
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

だいたいこのぐらいやれば、きっと大丈夫でしょう!

AWSで見積もりを行う方法

AWSってすごく便利だけど、従量課金で結局いくらぐらいかかるのかがわからないから見積もりを行う方法を調べてみたよ。

公式サイト

aws.amazon.com

AWS Simple Monthly Calculator(簡易見積ツール)

calculator.s3.amazonaws.com

このツールで基本的な要件は満たせそう!

AWS Total Cost of Ownership (TCO) Calculator

https://awstcocalculator.com/

これは主にオンプレミス環境との比較で使うツールかな?

提案とかには使えそう。

というわけで

AWS Simple Monthly Calculator(簡易見積ツール)を使えばやりたいことやれそうな感じなのでした!

UbuntuをZsh+tmux+Vim+Dockerで俺色に染めるまでの道のり

仕事で使ってるtmuxを動かしているサーバーがあるのですが、タワー型のやっすいの使っててそこにCentOS7突っ込んでオフィスに直置きしてます。法定停電でもあった日にゃ育てたtmuxのセッションが死滅し、その明けの出勤は気が重くなること請け合いな感じになっていたので、CentOSからの脱却もかねてAWS上にUbuntuサーバーを立てて俺色に染めてやろうと思ったわけですはい。とりあえず手動でガシガシと構築していって最終的にAnsibleのPlaybookを作るとこまでやっております。

要件

基本的にこの子たちがいればどこにいてもやっていけると思う。

  • Zsh(zplug/ghq/peco)
  • tmux
  • Vim
  • Git
  • Ansible
  • Docker

Ubuntuの良いところ

弊社はほとんどがCentOSでgitやtmuxが最初から入ってなくてしかもyumでインストールできるのはバージョンが古いものになってしまうけど、Ubuntuの18.04.1 LTSはさいしょからtmux 2.6git 2.17.1が入っているのでとっても良いぞってなったのでこれからUbuntuを愛していこうとおもいます。

やること

AWSでのインスタンス作成は割愛します。

  • rootアカウントでのパスワード認証を許可する
  • Zsh(peco/go/ghq)のインストール
  • Ansibleのインストール
  • Dockerのインストール
  • Playbook化

rootアカウントでのパスワード認証を許可する

自分が使い倒すだけのサーバーなのでrootアカウントのパスワードを設定しパスワードログインができるようにします。

# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

/etc/ssh/sshd_configを以下のように編集

- PasswordAuthentication no
+ PasswordAuthentication yes
+ PermitRootLogin yes

sshdの再起動

# systemctl restart sshd

Zsh(zplug/ghq/peco)のインストール

まずはzshを以下のようにインストール

# apt install zsh

お次に公式手順に従いzplugをインストール

github.com

# curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh | zsh

pecoのインストール

github.com

cd /usr/src
wget https://github.com/peco/peco/releases/download/v0.5.3/peco_linux_amd64.tar.gz
tar zxvf peco_linux_amd64.tar.gz
cd peco_linux_amd64
cp -p peco /usr/local/bin
peco --version
peco version v0.5.3 (built with go1.10)

ghqを使うためにgoをインストール

apt-get install gcc make
apt-get install golang
go version
go version go1.10.4 linux/amd64

.zshrcの配布

github.com

ghqのインストール

go get github.com/motemen/ghq

※ちなみにghqコマンドにパスを通すために.zshrcまたは.zshenvにに以下を追記する必要があります。

## golang
export GOPATH=$HOME
export PATH=$PATH:$GOPATH/bin

zshをデフォルトのログインシェルにする

chsh -s /usr/bin/zsh

Ansibleのインストール

公式手順にのっとり以下のようにインストールを実施

Installation Guide — Ansible Documentation

apt-get update
apt install software-properties-common
apt-add-repository ppa:ansible/ansible
apt update
apt install ansible

Dockerのインストール

docs.docker.com

以下手順にのっとり以下のようにスクリプトでインストールを実施

qiita.com

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
# Executing docker install script, commit: 46dc063
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic edge" > /etc/apt/sources.list.d/docker.list
+ [ ubuntu = debian ]
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sh -c docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:49:01 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:16:44 2018
  OS/Arch:          linux/amd64
  Experimental:     false
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

Playbook化

まだやってないけど、Ubuntuに変えたのでこれからは普通にTravisCIを使った自動テストも組めるぞ~! github.com

そんな感じで

やはりCentOSはちょっと使いづらいなぁと感じつつ、VimからNeoVimへの移行もしないといけないかなぁと思い始めたのでまた別の機会にまとめようかと思いますー!

AnsibleのroleテストをTravisCIで行う

AnsibleのroleテストはTravisCIが主流だというので試してみようじゃないという趣旨の記事です。

やること

GitHubにリポジトリを作成

以下のような感じで適当にリポジトリを作成しておく

f:id:tocguitar1:20181024161625p:plain

ansible-galaxyコマンドでroleのひな型を作成

作成したリポジトリをClone

$ git clone https://github.com/Tocyuki/ansible-role-travisci-handson.git

roleのひな型を作成する

$ ansible-galaxy init -f ansible-role-travisci-handson
- ansible-role-travisci-handson was created successfully

こんな感じのディレクトリ構成となる

$ tree ansible-role-travisci-handson
ansible-role-travisci-handson
├── LICENSE
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 9 files

.travis.ymlを作成

tasks/main.ymlに適当に記述しておく

---
# tasks file for ansible-role-travisci-handson
- name: Debug Message
  debug:
    msg: 'Hello World!!!'

.travis.ymlに以下のように記載

---
language: python
python: 2.7
sudo: false

addons:
  apt:
    packages:
      - python

install:
  - pip install ansible
  - ansible --version
  - printf '[defaults]\nroles_path=../' >ansible.cfg

script:
  - ansible-playbook tests/test.yml -i tests/inventory --syntax-check
  - ansible-playbook tests/test.yml -i tests/inventory -C
  - ansible-playbook tests/test.yml -i tests/inventory

TravisCI側で実行対象のリポジトリを設定する

TravisCIへログインを行う

Travis CI - Test and Deploy Your Code with Confidence

f:id:tocguitar1:20181024164932p:plain

右上のアカウントアイコンをクリックし、「Setting」を選択し、対象のリポジトリを有効にする

f:id:tocguitar1:20181024165239p:plain

GitHubへプッシュしTravisCIでテストされることを確認

tasks/main.yml.travis.ymlgit addする

$ git add tasks/main.yml .travis.yml

git commitを行う

$ git commit -m "Add tasks/main.yml .travis.yml"
[master c367d3a] Add tasks/main.yml .travis.yml
 2 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 .travis.yml

git pushを実行

$ git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 655 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/Tocyuki/ansible-role-travisci-handson.git
   9edd540..c367d3a  master -> master

tests/test.ymlconnection: localを入れわすれてビルドに失敗したので修正後、再度git push実行

- hosts: localhost
  connection: local
  remote_user: root
  roles:
    - ansible-role-travisci-handson
$ gaa ; gcmsg "Fix tests/test.yml"; gp
[master 222b373] Fix tests/test.yml
 1 file changed, 2 insertions(+), 1 deletion(-)
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 452 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/Tocyuki/ansible-role-travisci-handson.git
   c367d3a..222b373  master -> master

TravisCI上でテストが走ることを確認

f:id:tocguitar1:20181024170136p:plain

そして正常に完了することを確認

f:id:tocguitar1:20181024172120p:plain

READMEにテスト結果のバッチをつける

矢印部分をクリックし、Markdownを選択するとなんかでてくるのでそれをコピーしてREADME.mdに張り付ける

f:id:tocguitar1:20181024174122p:plain

こんな感じで記載してGitHubへPushする

git diff README.md
diff --git a/README.md b/README.md
index 225dd44..044d484 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
 Role Name
 =========

+[![Build Status](https://travis-ci.org/Tocyuki/ansible-role-travisci-handson.svg?branch=master)](https://travis-ci.org/Tocyuki/ansible-role-travisci-handson)
+
 A brief description of the role goes here.

 Requirements

GitHubで以下のように表示されていることを確認

f:id:tocguitar1:20181024174527p:plain

おわりに

超簡単にですがこれでAnsible roleの自動テストができるようになったぞ!

ただ、TravisCIはUbuntuかMacにしか対応しておらず、そのほかのディストリビューションでやろうとした場合、Dockerを使ったりする必要があるのでそれはまたの機会に!

今回のリポジトリはこちら!

github.com

Windows10でHyper-Vを無効化できないときの対応

Windows10ではDocker for WindowsとVirtualBoxが混在できないので、Docker使ってて、VirtualBox使いたくなると結構めんどうなんですよね。。。

なぜかぼくの端末ではインターネット上に転がっている情報をそのまま試すだけではうまくいかず、ちょいとアレンジが必要だったのでメモしておきます。

bcdedit /set {current} hypervisorlaunchtype off

とりあえず上記コマンドを実行して再起動すれば大丈夫でした!

わけわからんちん!