なっく日報

技術やら生活やらのメモ

ESLintで拡張子をみてテキストをゴニョゴニョできる話

久しぶりにESLintの話題を。

公式ドキュメントに書いてあるのですが、ESLintプラグインでは拡張子毎にprocessorを設定できるそう。

http://eslint.org/docs/developer-guide/working-with-plugins#processors-in-plugins

processor is 何?

このeslint-plugin-markdownがわかりやすいかもしれません。

github.com

markdownからJavaScriptのコード部分だけを抜き出し、lintできるというプラグインです。

↓のpreprocessという関数の部分を見ればわかりますが、markdownのテキストからJavaScriptのコード部分だけを抜き出すということをやっています。 https://github.com/eslint/eslint-plugin-markdown/blob/f97e0c01beb7cc6dad21d828ea80e4fbe55317af/lib/processor.js#L43

抜き出したコード部分を配列で返せば、ESLint本体側でそれらをlintしてくれる挙動になっています。

※ちなみにmarkdownをパースする箇所では、昨日の記事で書いたプレゼンテーションツールのremarkが使われていましたw

どんな場合に使えるか?

  • ぱっとプラグインが見つからなかったですが、HTMLファイルの<script>〜</script>の中身のチェックにも使えそう
    → ありました eslint-plugin-html - npm (mysticateaさん、ありがとうございます)

  • テキストの中身をみて、pluginをOFFにするとか (eslint-plugin-disable がまさにそれ)

  • /* eslint no-var: 0 */ みたいなコメントを一行目に強引につけて、ファイルの中身に応じて、動的にルールをON/OFFする(ES2015とES5が混じっている環境で使いたい)

など。

まとめ

使いたい(使うかも)

Github Pages + Markdownで楽々プレゼン生活

qiita.com

の記事の内容ほぼままなのですが、

自分的にはライフチェインジングな発見だったのでご紹介。

Github Pagesとremarkを組み合わせるとプレゼン資料作成が捗るよというお話です。

Github Pagesとは?

みなさん知っていると思いますが、Github上で、yukidarake.github.ioみたいなリポジトリを作ると、https://yukidarake.github.io/にWebページを公開できるという機能です。

が、上記のようなユーザ/オーガニゼーションだけでなく、gh-pagesブランチを作成すれば、プロジェクト毎にも作れるそう!(これ知らなかった)

その場合、URLは https://yukidarake.github.io/presentations みたいになります。

詳しくは↓をご覧ください。

pages.github.com

remarkとは?

github.com

HTML and CSSを使って、ブラウザ上で表示できる(よくありそうな)プレゼンテーション用ツールです。

が、このremarkの良い所は、スライドの内容を別ファイルにmarkdownで書くことができるということ。

さらに、一枚、index.htmlを準備し、パラメータでスライド用ファイルを読み分けるよう細工すれば、都度HTMLやCSSを触る必要ありません!

では、Github Pagesとremarkを組み合わせてみましょう

で、こんな感じになりました。

画像キャプチャ f:id:nakimura:20160421194908p:plain

https://yukidarake.github.io/presentations/?my-first-presentation

TIPS

  • Githubリポジトリの設定より、デフォルトブランチをgh-pagesに変更しておくとよい
  • README.mdを各資料へのインデックスページとして利用するとよい https://yukidarake.github.io/presentations/
  • ローカルでの動作確認はpython -m SimpleHTTPServer 8000が便利だった
  • 絵文字を使うと見栄えが良くなる(気がする)

こんなところで。

一発ネタ。ワンライナーでDynamic Inventory

このままでは使えないですが、何かのヒントにはなるかもしれません。

GCPなんかで、AnsibleのDynamic Inventoryを使う場合、↓の公式ページによれば

http://docs.ansible.com/ansible/guide_gce.html#gce-dynamic-inventory

gcp.pyでやるのをオススメしてます。

が、Dynamic Inverntoryを実現するスクリプトを作るのは結構簡単です。

↓のルールを守って、JSON形式の標準出力でホスト一覧を返せばよいと。
Developing dynamic inventory — Ansible Documentation

このレベルであれば、gcloudコマンドとjqを組み合わせればあっさりいけそうな感じ。

#!/bin/sh
gcloud compute instances list --format json --project project_name \
  | jq 'map(select(.tags.items | any(. == "jenkins"))) | {jenkins:{hosts:map(.networkInterfaces[0].networkIP)}}'

とかでも動くっちゃ動く(冒頭でもいってますが、このままじゃ使えませんが・・・)

上記のコマンドで「タグにjenkinsを含むホストのインターナルIPを抜き出して整形」ができるという感じです。

本日NginxでSSLの設定をする際に参考になったサイト

本日、バックエンドのJenkinsおじさんをSSLで終端させるためにNginxを設定したので、その過程のメモを。

多分、どなたかの参考にはなるはず・・・

Mozilla SSL Configuration Generatorが便利

Redirecting to ssl-config.mozilla.org...

各種ミドルウェアApache, Nginx, Lighttpd, HAProxy, AWS ELB )のオススメの設定が生成されます。

勉強になるし、いい感じ。

OCSP Staplingの設定がわかりづらかった

ssl_trusted_certificate に指定する証明書のところ。

http://blog.mylibs.jp/archives/173blog.mylibs.jp

のサイトにお世話になりました。

ルート証明書とCA中間証明書を結合したファイルが必要だと。。

proxy_pass設定時の注意点

今回はNginxとJenkinsおじさんが同一インスタンスにいるので、必要なかったんですが、いちおうメモ。

d.hatena.ne.jp

要は、proxy_passでホスト名を指定する場合、下記設定をしないとDNSに変更があった際に、キャッシュが悪さして困ると。

  • resoloverの設定が必要(例:resolver 127.0.0.1;
  • setでホスト名を変数にしないといけない(例:set $api_backend "api.oreno";

こんなところで。

Jenkinsにdeploy keysをリポジトリ毎に設定するのが面倒くさい

m(__)m

yukidarake.hateblo.jp

の記事で

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github-foo.pem
    IdentityFile ~/.ssh/github-bar.pem

みたいに書けばJenkinsの鍵をいちいち~/.ssh/configに追記しないでOKだと書いたけど、これだとgit pushできないという指摘がありました。

実際、複数のリポジトリにdeploy keysを設定していると、git push先のリポジトリで、最初にsshの認証が通った鍵で権限があるか判定されてしまい、(違う場合)権限がないよと怒られます。

申し訳ありませんm(__)m

が、このままだと悔しいので何か方法がないか探してみました。

GIT_SSHという環境変数

qiita.com

で知ったのですが、GIT_SSH=./git-ssh.sh git push origin master みたいにsshコマンドをラップさせたりできると。

これでpush先のリポジトリ名が取れれば、秘密鍵を使い分けできそうです。

ラッパースクリプト

こんな感じで書いてみました。sedは使えないのでperlです。

#!/bin/sh
KEY=$(echo "$@" | perl -pe "s{.+'/?(.+?)/(.+?)\.git'}{~/.ssh/github.com/\$1/\$2.pem}")
exec ssh -i "$KEY" "$@"

これで、~/.ssh/github.com/yukidarake/chau.pem みたいなdeploy keys用の秘密鍵を配置して、下記コマンドを実行します。

GIT_SSH=./git-ssh.sh git clone git@github.com:yukidarake/chau.git

# 何か編集して、git commit
GIT_SSH=./git-ssh.sh git push origin master

いけました!

export GIT_SSH=~/git-ssh.sh

とかを.bashrcに足しておけば、もはや~/.ssh/configの設定も必要なくなってしまいます。

まとめ

多分、大丈夫だと思いますが、うまくいかない場合コメントいただければと。

どなたかの参考になれば幸いです。

AnsibleのVaultで暗号化されたファイルを管理する際のベストプラクティス

はじめに

http://docs.ansible.com/ansible/playbooks_best_practices.html#variables-and-vaults

↑のAnsible公式ドキュメントのベストプラクティスの中の「Variables and Vaults」という項目に書いてあったことにプラスアルファした内容です。

ある程度わかっている人が検索してくることを想定しているので、ちょっと雑に書きますw

問題

AnsibleのVaultはパスワードとか秘密鍵みたいなセンシティブな情報が書かれたYAMLを暗号化できるので、非常に重宝する機能ですが、

password1: himitsu_daaaaaaaa
password2: secret_daaaaaaaa

みたいなYAMLを暗号化した結果が↓で

$ANSIBLE_VAULT;1.1;AES256
3333333333333333333333333333333333333333333333333333333333333333333333333333

変数名なんだっけ?となって管理しづらいという問題があります。

「ansible vault best practice」でググった

そこで、ググったところ、公式のベストプラクティスにたどり着きました。

A best practice approach for this is to start with a group_vars/ subdirectory named after the group. Inside of this subdirectory, create two files named vars and vault. Inside of the vars file, define all of the variables needed, including any sensitive ones. Next, copy all of the sensitive variables over to the vault file and prefix these variables with vault. You should adjust the variables in the vars file to point to the matching vault variables and ensure that the vault file is vault encrypted.

が、ちょっとわかりづらい。。

もうちょとググッてみたら

blog.noldor.info

な記事が。

要は

group_vars/stg.ymlを暗号化されているモノとそうでないモノで分ける

group_vars/stg.ymlみたいに定義していたモノは↓のようにディレクトリを掘って、ファイルを分けても自動的に読み込まれるそう。

  • group_vars/stg/vars.yml
  • group_vars/stg/vault.yml

暗号化されてないファイルから暗号化するファイルで定義された値を参照する

(暗号化されていない)vars.ymlで↓のように書いて

password1: {{ vault_password1 }}

(暗号化する)vault.ymlで↓のように定義してあげると。

vault_password1: himitsu_daaaaaaaa

これなら、grepもし易いし、どの変数が暗号化されているかも一目瞭然です。

※最後にansible-vault encrypt group_vars/stg/vault.ymlしてあげるのをお忘れなく

だが、roles/foo/vars/main.yml は・・・

じゃあ、おんなじ要領でと、roles配下で、roles/foo/vars/main.ymlとroles/foo/vars/vault.ymlでやろうとしたら嵌りました。

嵌った原因

roles/foo/vars/main.yml以外は自動的に変数として読み込んでくれないよう。

roles/foo/tasks/main.ymlで↓のようにinclude_varsを使って明示的にincludeしないと使えませんでした。

- include_vars: vault.yml
  no_log: true # ←これもつけた方がよいそう

これは

qiita.com

の記事を見て解決しました(ありがとうございました)

まとめ

多分、(同じように嵌っている|これから嵌る)方はいると思うので、少しでも参考になれば幸いです。

からの、おまけ

その1

秘密鍵とかの変数をtemplates/id_rsa.j2みたいなファイルを置いて、templateモジュール機能を使って配置している例を(社内で)何個かみかけたのですが、

- copy: >
    content="{{ foo_secret_key }}"
    dest=~/.ssh/id_rsa
    mode=0600

みたいにcopyモジュールのcontent指定でもいけます

その2

秘密鍵的な長い文字列を変数に設定するときはYAML|を使った記法が便利(改行をのこしたまま文字列の値として扱ってくれる)

vault_secret_key: |
  -----BEGIN RSA PRIVATE KEY-----
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  -----END RSA PRIVATE KEY-----

zshオススメのちょっとした設定

本日は公開できるほどのネタがないので、ちょっと開発環境的なモノを書いておきます。

多分、ネタに困ったら少しずつ放出するんじゃないかと・・・

特定のコマンドの履歴を残さない

rmとかlsとか。

↓の関数を.zshrcに足します。

zshaddhistory() {
  local line=${1%%$'\n'}
  local cmd=${line%% *}

  # 以下の条件をすべて満たすものだけをヒストリに追加する
  [[ ${#line} -ge 5
    && ! ( ${cmd} =~ [[:\<:]](mv|cd|rm|l[sal]|[lj]|man)[[:\>:]] ) ]]
}

確か↓の記事を見ながら設定したんだと思います。

mollifier.hatenablog.com

ちなみに、その昔、開発環境でだけどうっかり、source ~/.bashrc とやるつもりで、source ~/.bash_history としちゃってア"ア"ーーーーーーッてなったことあるんで、やっておくに越したことはないです。

Finderで現在開いているディレクトリにcdする

↓を.zshrcに追加。cdfで移動可能。

cdf() {
  target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
  if [ "$target" != "" ]; then
    cd "$target"; pwd
  else
    echo 'No Finder window found' >&2
  fi
}

どっかの記事のをコピーさせてもらったんですが、どこかは忘れました。。

.....

.を打った分だけ上の階層にあがれるようになります。あんま需要ないかもですが、自分的には結構使います。

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'

本日はこんなところで。