写在前面的话

做了多年的项目, 一直使用capistrano发布项目, 这个确实带来很大的便利。但是有点比较麻烦的地方,就是每次部署新的服务器,都像做苦力一样,去安装服务器的环境,后来了解到Chef和knife-solo, 其就可以达到类似capistrano所作的事情, 不过一个是一键发布项目,一个是一键安装服务器环境,好了,让我们开始吧!

准备工作

我们需要一台测试服务器,这个我们需要Vagrant帮我们实现。

安装vagrant

  1. 先到这里下载Vagrant : https://www.vagrantup.com/downloads.html > 注意: 旧的版本是通过gem install vagrant 安装

  2. 安装box

1
vagrant init hashicorp/precise32

到这里发现更多的box: http://vagrantcloud.com

  1. 启动
1
vagrant up
  1. 配置ssh登录不需要密码
1
vagrant ssh-config --host   服务器IP >> ~/.ssh/config

## 安装chef-solo

  1. 安装chef 和 chef-solo
1
2
3
4
5
6
7
8
9
10
gem install chef
gem install knife-solo
或者
bundle init
编辑Gemfile
添加:
source "https://rubygems.org"
gem "knife-solo"
执行:
bundle install --path=vendor/bundle
  1. 初始化knife-solo项目
1
2
3
4
5
knife solo init chef-repo
cd chef-repo
git init
git commit -a -m "initial commit"
knife solo prepare ServerIP --bootstrap-version 11.12.0 # 如果这里不指定版本号, 会提示找不到文件的错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14
需要指定这个版本号 --bootstrap-version 11.12.0 # 如果这里不指定版本号, 会提示找不到文件的错误
wnloading Chef 12.0.0.alpha.2 for ubuntu...
downloading https://www.opscode.com/chef/metadata?v=12.0.0.alpha.2&prerelease=false&nightlies=false&p=ubuntu&pv=12.04&m=i686
  to file /tmp/install.sh.5074/metadata.txt
trying wget...
ERROR 404
Unable to retrieve a valid package!
Please file a bug report at http://tickets.opscode.com
Project: Chef
Component: Packages
Label: Omnibus
Version: 12.0.0.alpha.2
Please detail your operating system type, version and any other relevant details
Metadata URL: https://www.opscode.com/chef/metadata?v=12.0.0.alpha.2&prerelease=false&nightlies=false&p=ubuntu&pv=12.04&m=i686

通过Knife Solo 安装Nginx

  1. 生成模板文件
1
knife cookbook create nginx -o site-cookbooks
  1. 编辑模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
site-cookbooks/nginx/recipes/default.rb
package "nginx" do
    action :install
end
service "nginx" do
    supports :status => true, :restart => true, :reload => true
    action [:enable, :start]
end
template "nginx.conf" do
    path "/etc/nginx/nginx.conf"
    source "nginx.conf.erb"
    owner "root"
    group "root"
    mode 0644
    notifies :reload , "service[nginx]"
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
user vagrant;  # 这里可以用nginx,但是需要新建这个用户
worker_processes    1;
error_log   /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    server {
        listen <%= node['nginx']['port'] %>;
        server_name localhost;
        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
    }
}
  1. 在服务器上安装nginx
1
knife solo cook SERVER_IP

参考

  1. http://qiita.com/torufurukawa/items/e20bdb9791c49d00672e
  2. http://gogojimmy.net/2013/06/01/Chef-Solo-Basic-with-Vagrant/
  3. https://docs.vagrantup.com/v2/getting-started/index.html
  4. http://vagrantcloud.com
1
2
obj.should ...
expect(obj).to ...
1
2
obj.should_not ...
expect(obj).not_to ...
1
2
obj.should =~ //
expect(obj).to match(//)
1
2
[1, 2, 3].should =~ [3, 2, 1]
expect([1, 2, 3]).to match_array([3, 2, 1])
1
2
obj.should > 3
expect(obj).to be > 3
1
2
lambda { ... }.should raise_error
expect { ... }.to raise_error

RSpec 2.14.0 or later

1
2
obj.stub(:foo)
allow(obj).to receive(:foo)
1
2
SomeClass.any_instance.should_receive(:foo)
expect_any_instance_of(SomeClass).to receive(:foo)
1
2
SomeClass.any_instance.stub(:foo)
allow_any_instance_of(SomeClass).to receive(:foo)

RSpec 2.99.0.beta1 or later

1
2
it { should eq(something) }
it { is_expected.to eq(something) }

RSpec 3.0.0.beta1 or later

1
2
obj.stub_chain(:foo, :bar).and_return(something)
allow(obj).to receive_message_chain(:foo, :bar).and_return(something)

如果你的rubymine 不能输入中文,请做这样的修改:

1
 vim /Applications/RubyMine.app/bin/idea.vmoptions

加入下面一行: <div class=’bogus-wrapper’>

<figcaption></figcaption><div class=”highlight”><table><tr><td class=”gutter”><pre class=”line-numbers”>1 </pre></td><td class=’code’><pre>-J-Djava.awt.im.style=on-the-spot </pre></td></tr></table></div>
</div> 所以长得这样子:

1
2
3
4
5
-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:+UseCompressedOops
-J-Djava.awt.im.style=on-the-spot

–EOF–

Attribute Isolated Scope

Defined with an @ symbol Binds a local scope property to the value of a DOM attribute The binding is uni-directional from parent to directive The result is always a string because DOM attributes are strings

images

Binding Isolated Scope

Defined with an = symbol Bi-directional binding between parent and directive You can define the binding as optional via =? Optimal for dealing with objects and collections

images

Expression Isolated Scope

Defined using an & symbol Allows you to execute an expression on the parent scope To pass variables from child to parent expressions you must use an object map

images

值得再去一次的地方, 吃的喝的都免费

离4月19日度假归来已经4天, 但是一回到家,就伴随着耳鸣、咳嗽,流鼻涕、全身乏力, 一直到今天还是如此;-(, 相当难受!

虽然归来已经几天,但是想到在那宛如天堂的地方, 都会不由自主的发自内心的笑…

我们这次的目的地是马尔代夫卡尼岛(参考:

http://baike.baidu.com/view/481080.htm

), 行程为6日4晚, 意思就是两天在飞机, 4天在岛上。

我们4月14日启程, 刚开始不顺利, 早上我闹钟不醒, 我没有洗漱就出门, 接着是我的Parter 忘记带了护照, 还好有磁悬浮, 最终我们顺利赶到机场, 乘坐新加坡航空飞6个小时到新加坡,然后等7个小时, 再从新加坡飞4个小时到达马尔代夫马累机场,然后坐30分钟的船, 晚上10点(北京时间4月15日凌晨1点)到达卡尼岛。

因为到达岛上已经晚上10点多, 我们放好行李,就直奔岛上的酒吧喝酒了, 在海边,享受海风, 端着酒,抽着烟, 就这样开始我们的卡尼岛度假了…

一早起来, 去吃完丰盛的早餐,然后去参加台湾姑娘G.O关于岛上 活动的说明会, 岛上的很多活动都是免费的, 当然包括吃的。我们今天的计划是去浮潜, 参加测试后, 工作人员发给我们工具, 然后坐船离岛10分钟的路程, 带好潜水用具,就到海里看鱼了。

由于是第一次潜水,还不是很熟悉, 而且海浪比较大, 一不小心,我的相机掉到海里了;(, 有些郁闷, 不过遨游在海里, 谁会介意这些小事?看着海中哪些以前只有电视看到的漂亮的鱼, 你会觉得爽呆了…

图片

浮潜45分钟后,我们就返回岛上了, 我们到游泳池占了两个位置, 点了饮料(当然都是免费的), 就开始边游泳,边看晒太阳,看着远处的美景。岛上以欧美人比较多,特别是法国人,其次有来自中国大陆,台湾、香港,泰国,韩国、日本等国家,也许欧美人享受习惯了, 他们或许都是以生活为主, 感觉这就是他们的生活。他们是不介意阳光爆晒的。晚上7:30开饭, 有意大利菜,法国菜,泰国菜,中国菜,很多点心。

接着晚上9:30,是岛上每天都举行的主题晚会,一直到11点多,一天的行程结束了。

16日

因为前一天已经玩的太累, 这天主要是环岛游,划船,帆船,游泳池晒太阳为主。晚上还是酒吧…

17日

今天就要搬去水上屋,所以一大早起来,就直接在游泳池等了,下午2点钟才搬过去。水上屋有专门的保安,一进去才知道那才是整个岛的精华所在,我震撼了。吃的、住的都比外面高一个级别啊。 水上屋才有免费的WIFI,吧台精致的点心,各种饮料等等。屋下面,可以直接游泳,看鱼,或者看远方的美景。一切是那么的和谐。需要注意的是14岁以下的小孩是不可以住水上屋的。 晚上还可以看到魔鬼鱼。屋内也准备了香槟、咖啡,放着CD,早餐有服务员送来,终于感受到了什么叫做被服务了,原来这才是生活啊。 至少我再一次被震撼了,即使住怎么样的5星级酒店都感觉不如卡尼岛的水上屋啊, 因为那种风景是一般的酒店没有的。

18日

因为今天离岛时间,但是要等到晚上8:25分, 所以今天我们的计划还是浮潜, 因为今天涨潮,又看到了之前没有看到的鱼,收获颇丰啊。

图片

晚上8:25分,在卡尼岛G.O的热情欢送下,我们去了马尔代夫机场。 晚上11:25的航班, 飞了4个小时,到达新加坡机场,候机2个小时, 再飞6个小时,北京时间4月19日15点钟, 到达上海浦东国际机场,旅程结束。

推荐

水上屋

tips:

那里是岛上的精华,记得保安说过,之前有一个法国人,包了岛上的全部水上屋,住了两个星期。

西餐

岛上的西餐厅,需要提前一天预定, 但是那是免费的

浮潜

浮潜可以看到很多漂亮的鱼,还有珊瑚,那时其他地方没有的。且也是免费的。

其他

如果到那个地方, 就不要带伞去了,那里就是去晒太阳的。如果不会讲英文,岛上有讲中文的G.O, 他们大部分来自台湾。好像大陆有一个。

不要在岛上买东西了,一个打火机就两美金,其他东西贵到什么程度呢?

其实文中叙述的,都不能道出在那边的感受的十分之一, 而且很重要的一点,那里中国人很少, 你不会看到不和谐的事情发生。

–EOF–

转载请注明:韦旭红的点点滴滴 » 马尔代夫-卡尼岛(Kani)