iii ThreeTreesLight

about me / / /

sshをEC2のタグからpercol経由でよしなにする

掲題の通り辛くなってきたので、雑ですが書きました。

require

  • AWS CLI
  • percol
  • zsh

Install AWS Cli

http://docs.aws.amazon.com/cli/latest/userguide/installing.html

bash $ sudo pip install awscli

Locale周りの設定していなかったのでlocal設定をする

bash $ vim ~/.zshrc export LC_ALL=ja_JP.UTF-8

configure

“`bash

Configuration

$ aws configure AWS Access Key ID: YOUR_AWS_ACCSS_KEY_ID AWS Secret Access Key: YOUR_SECRET_ACCSS_KEY Default region name [us-west-2]: いんすたんすのあるりーじょん Default output format [None]: text “`

ssh-login with ec2 via percol

“`bash

ec2-ip

function ec2-ip() { instances | percol | awk ‘{ print $1 }’ }

function instances() { instances=( $(aws ec2 describe-instances \ —query ‘Reservations[].Instances[].[Tags[?Key==Name].Value[],PublicIpAddress]’ \ —output text) )

for i in seq 1 ${#instances[@]}; do if [ expr $i % 2 -eq 0 ]; then echo ${instances[$i-1]} ${instances[$i]} fi done }

ec2-ssh

function ec2-ssh() { ssh webadmin@ec2-ip -p2222 -i ~/.ssh/id_rsa } “`

1 week ago  Notes (1)

#ssh #percol

ruby scriptをvimから実行すると、rbenvのrubyが読まれない

require

  • rbenv
  • ruby
  • bash or zsh

問題

ruby scriptをvimから実行すると、rbenvのバージョンのrubyが読まれない

原因

intractive shell起動じゃないから。

解決策

zshの場合は、zshenvに記載

bash $ vim ~/.zshenv export PATH="$HOME/.rbenv/bin:$PATH"

boxenの場合はzshevnにこんな感じ

bash $ vim ~/.zshenv source /opt/boxen/env.sh

その他shellの場合

rbenv - Unix shell initialization

3 weeks ago  Notes (3)

#rbenv #vim #ruby

【翻訳】Rubyにはウンザリ!動的型付け、副作用、およびオブジェクト指向プログラミング全般からの考察

madeupmonkeyshit:

AYYEEE MY NIGGA SPONGEBOB TURNNIN UP WITH SOME JELLY FISH DOEEEEE
FUCK WHAT THE NEIGHBORS SAY

madeupmonkeyshit:

AYYEEE MY NIGGA SPONGEBOB TURNNIN UP WITH SOME JELLY FISH DOEEEEE

FUCK WHAT THE NEIGHBORS SAY

(via wideangle)

kanegon-rock:

60s Japan!!
Nice hairstyle with DADA from Ultraman!!

(via meiro)

chefのssl verify warning

man in the middle atack対策として、chef 11.12系からssl verifyが出来るようになった様です。

SSL validation of HTTPS requests is disabled. HTTPS connections are still encrypted, but chef is not able to detect forged replies or man in the middle attacks.

To fix this issue add an entry like this to your configuration file:

“` # Verify all HTTPS connections (recommended) ssl_verify_mode :verify_peer

# OR, Verify only connections to chef-server verify_api_cert true “`

To check your SSL configuration, or troubleshoot errors, you can use the knife ssl check command like so:

knife ssl check -c /home/webadmin/chef-solo/solo.rb

ワーニングを放置するのもうざいので、言われた通り設定します。

対応

$ vim .chef/knife.rb

ssl_verify_mode :verify_peer

これでok

1 month ago  Notes (2)

#chef

nodejsのスクリプトをcapistranoでデプロイ

nodeのデプロイ洗ってみたけど、capistranoでやっていたり、shellでやっていたりベストプラクティスなんなんだろーと色々悩んでました。

必須の要件としてはシンプルに2つ。

  • rollbackできるようにデプロイのバージョニング
  • downtime無しで管理

Require

スクリプト本体+http server

  • nodejs
  • coffee-script

process管理

deploy

  • capistrano

下ごしらえ

packages

$ npm i pm2@latest -g

gems

$ bundle init
$ vim Gemfile
source 'https://rubygems.org'

gem 'capistrano', '~> 3.2.0'
gem 'capistrano-bundler', '~> 1.1.3'
gem 'capistrano-npm'

$ bundle

デプロイ設定

initialize

$ cap init

cap設定

$ vim Capfile
# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'
require 'capistrano/bundler'
require 'capistrano/npm'
require 'capistrano/console'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

pm2をキックするスクリプトを作る

$ vim lib/capistrano/tasks/pm2.rake
require 'json'
require 'pry'

namespace :pm2 do
  def start_app
    within current_path do
      execute :pm2, :start, fetch(:app_command)
    end
  end

  def restart_app
    within current_path do
      execute :pm2, :restart, fetch(:app_command)
    end
  end

  def stop_app
    within current_path do
      execute :pm2, :stop, fetch(:app_command)
    end
  end

  def force_stop_app
    within current_path do
      execute :pm2, :stop, fetch(:app_command), '--force'
    end
  end

  def graceful_reload_app
    within current_path do
      execute :pm2, :gracefulReload, fetch(:app_command)
    end
  end

  def delete_app
    within current_path do
      execute :pm2, :delete, fetch(:app_command)
    end
  end

  def app_status
    within current_path do
      ps = JSON.parse(capture :pm2, :jlist, fetch(:app_command))
      if ps.empty?
        return nil
      else
        # status: online, errored, stopped
        return ps[0]["pm2_env"]["status"]
      end
    end
  end

  desc 'Start app'
  task :start do
    on roles(:app) do
      start_app
    end
  end

  desc 'Stop app'
  task :stop do
    on roles(:app) do
      stop_app
    end
  end

  desc 'Restart app gracefully'
  task :restart do
    on roles(:app) do
      case app_status
      when nil
        info 'App is not registerd'
        start_app
      when 'stopped'
        info 'App is stopped'
        restart_app
      when 'errored'
        info 'App has errored'
        restart_app
      when 'online'
        info 'App is online'
        graceful_reload_app
      end
    end
  end

  desc 'Stop app immediately'
  task :force_stop do
    on roles(:app) do
      force_stop_app
    end
  end

  desc 'Delete app'
  task :delete do
    on roles(:app) do
      delete_app
    end
  end
end

デプロイ設定をごにょごにょ

$ vim config/deploy.rb
lock '3.2.1'

set :application, 'YOUR_APP_NAME'
set :app_command, 'egg.coffee'
set :repo_url,    'git@github.com:foo/foo.git'

set :deploy_to,   "/var/www/#{fetch(:application)}"
set :log_level, :debug

set :linked_dirs,  %w{ bin log node_modules }

set :default_env, { node_env: "local" }

namespace :deploy do

  desc 'Restart application'
  task :restart do
    invoke 'pm2:restart'
  end

  after :publishing, :restart   
end

targetにlocal作る(local VMを対象にしています)

$ vim config/deploy/local.rb
set :branch, ENV['BRANCH'] || 'master'
set :user,   'vagrant'

role :app, [ "#{fetch(:user)}@foo-server" ]

server 'foo-server', user: fetch(:user), roles: %w{ app }

localVMに流す

VMにPM2入れておいて

$ cap local deploy:check
$ cap local deploy

ok

pm2の操作はrakeの通り

P.S.

pm2でもgitによるバージョニングのdeployが可能なので、それでやるほうがnodeの哲学に合ってるかもしれません。

1 month ago  Notes (3)

#node #capistrano #deploy #nodejs