Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby DSL × SSH config = Nymphia!!

mozamimy
January 18, 2017

Ruby DSL × SSH config = Nymphia!!

mozamimy

January 18, 2017
Tweet

More Decks by mozamimy

Other Decks in Programming

Transcript

  1. Why so dif cult? 気を抜くと SSH con g が破滅してる 構造的に書けるようになっていない

    ご家庭や仕事のインフラが混じると最悪 基本フラットに 1 ファイルとして書く 他人のファイル読むの難しい とにかく冗長 4
  2. What is Nymphia? identity_file :private, '~/.ssh/id_rsa.1' my_server_port = 4321 host

    'alice', 'my server on VPS' do hostname 'alice.example.com' user 'alice' port my_server_port use_identify_file :private end Host alice Hostname alice.example.com User alice Port 4321 IdentityFile ~/.ssh/id_rsa.1 5
  3. Motivation Ruby の DSL を作ってみたかった SSH con g に秩序をもたらしたい 構造化して

    DRY にしたい ファイルを分けて管理したい Ruby を使った構成管理ツー ルに組み込みやすそう 6
  4. Install $ gem install nymphia CLI $ nymphia --help nymphia

    -f, --file=FILE Your DSL code file -o, --output=FILE Output file (default: stdout) 8
  5. Basis source identity_file :private, '~/.ssh/id_rsa.1' my_server_port = 4321 host 'alice',

    'my server on VPS' do hostname 'alice.example.com' user 'alice' port my_server_port use_identify_file :private end 9
  6. Basis compiled # # This config is generated by Nymphia

    0.1.1 # # my server on VPS Host alice Hostname alice.example.com User alice Port 4321 IdentityFile ~/.ssh/id_rsa.1 10
  7. Splitting les identity_file :private, '~/.ssh/id_rsa.1' host 'alice', 'my server on

    VPS' do hostname 'alice.example.com' user 'alice' port 4321 use_identify_file :private end load 'other_nymphia_file.nym.rb' load で別ファイルを読み込める 単一の con g として出力される 11
  8. Proxy and Gateway ナマの SSH con g は全てが Host proxy

    や gateway として使うホストをコー ドレ ベルでわかるようにしたい 12
  9. Proxy identity_file :company_proxy, '~/.ssh/id_rsa.company.gw' proxy 'awsproxy.company.apne1' do hostname 'gw.apne1.example.com' user

    'alice' port 19822 use_identify_file :company_proxy # SOCKS proxy dynamic_forward 23921 # ssh tunnels local_forward 'mysql-server', { 'localhost' => 13306, 'mysql.apne.aws.example.com' => 3306, } end 13
  10. Proxy compiled # # This config is generated by Nymphia

    0.1.1 # Host awsproxy.company.apne1 Hostname gw.apne1.example.com User alice Port 19822 IdentityFile ~/.ssh/id_rsa.company.gw DynamicForward 23921 LocalForward localhost:13306 mysql.apne.aws.example.com:3306 15
  11. Gateway de ne a gateway identity_file :company, '~/.ssh/id_rsa.company' identity_file :company_gateway,

    '~/.ssh/id_rsa.company.gw' gateway 'company.gateway' do hostname 'gw.example.com' user 'alice' port 19822 end host の代わりに gateway でゲー トウェイを定義 ブロック内は普通の host とおなじ 16
  12. group 'company.ap-northeast-1' do use_gateway 'company.gateway' default_params do check_host_ip 'no' strict_host_key_checking

    'no' user 'alice' port 9822 use_identify_file :company, :company_gateway end host '*.apne.aws.example.com' host 'alice.apne.aws.example.com' do hostname '10.16.16.16' user 'white_rabbit' port 7777 end end 17
  13. Gateway use_gateway で先に定義した gateway をグルー プに 適用できる default_params でグルー プ内のホストにデフォルト

    で適用するパラメー タをまとめて書いておける default_params は上書き可能 18
  14. Gateway # # This config is generated by Nymphia 0.1.1

    # Host company.gateway Hostname gw.example.com User alice Port 19822 Host *.apne.aws.example.com CheckHostIp no StrictHostKeyChecking no User alice Port 9822 IdentityFile ~/.ssh/id_rsa.company IdentityFile ~/.ssh/id_rsa.company.gw ProxyCommand ssh company.gateway -q -W %h:%p 19
  15. Gateway Host alice.apne.aws.example.com CheckHostIp no StrictHostKeyChecking no IdentityFile ~/.ssh/id_rsa.company IdentityFile

    ~/.ssh/id_rsa.company.gw ProxyCommand ssh company.gateway -q -W %h:%p Hostname 10.16.16.16 User white_rabbit Port 7777 20
  16. Future issues 構文解析して SSH con g → Ruby に変換 ほんとはここまでやりたかった..

    Treetop ? Racc ? Racc のほうがよさげ OpenSSH の比較的新しい機能に追従する ProxyJump とか Include とか.. コンパイルなしに SSH できる $ nymphia ssh みたい なサブコマンドを作る 簡易プロビジョニング ホー ムディレクトリ以下に .bashrc 置くとか 21