sunzi 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +14 -15
- data/lib/sunzi/cli.rb +57 -8
- data/lib/sunzi/version.rb +1 -1
- data/lib/templates/{here/attributes.yml → attributes.yml} +1 -1
- data/lib/templates/{there → remote}/install.sh +0 -0
- data/lib/templates/{there → remote}/recipes/ssh_key.sh +4 -2
- data/sunzi.gemspec +1 -1
- metadata +7 -9
- data/lib/templates/here/compile.rb +0 -11
- data/lib/templates/here/deploy.sh +0 -25
data/README.md
CHANGED
@@ -26,17 +26,17 @@ Go to your project directory, then:
|
|
26
26
|
|
27
27
|
$ sunzi create
|
28
28
|
|
29
|
-
It generates a `sunzi` folder
|
29
|
+
It generates a `sunzi` folder along with subdirectories and templates. Inside `sunzi`, there's `attributes.yml`, which defines dynamic attributes to be used from recipes. Also there's the `remote` folder, which will be transferred to the remote server, that contains recipes and dynamic variables compiled from `attributes.yml`.
|
30
30
|
|
31
|
-
Go into the `
|
31
|
+
Go into the `sunzi` directory, then run the `sunzi deploy`:
|
32
32
|
|
33
|
-
$ cd sunzi
|
34
|
-
$
|
33
|
+
$ cd sunzi
|
34
|
+
$ sunzi deploy root@example.com
|
35
35
|
|
36
36
|
Now, what it actually does is:
|
37
37
|
|
38
38
|
1. SSH to `example.com` and login as `root`
|
39
|
-
1. Transfer the content of the `
|
39
|
+
1. Transfer the content of the `remote` directory to the remote server and extract in `$HOME/sunzi`
|
40
40
|
1. Run `install.sh` in the remote server
|
41
41
|
|
42
42
|
As you can see, what you need to do is edit `install.sh` and add some shell commands. That's it.
|
@@ -48,23 +48,22 @@ Here's the directory structure that `sunzi create` automatically generates:
|
|
48
48
|
|
49
49
|
```
|
50
50
|
sunzi/
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
deploy.sh ---- invoke this script
|
55
|
-
there/ ---- transferred to the remote server
|
56
|
-
attributes/ ---- compiled from attributes.yml at deploy
|
51
|
+
attributes.yml ---- add custom variables here
|
52
|
+
remote/ ---- everything under this folder will be transferred to the remote server
|
53
|
+
attributes/ ---- compiled from attributes.yml at deploy
|
57
54
|
env
|
58
55
|
ssh_key
|
59
|
-
recipes/
|
56
|
+
recipes/ ---- put commonly used scripts here, referred from install.sh
|
60
57
|
ssh_key.sh
|
61
|
-
install.sh
|
58
|
+
install.sh ---- main scripts that gets run on the remote server
|
62
59
|
```
|
63
60
|
|
64
61
|
Vagrant
|
65
62
|
-------
|
66
63
|
|
67
|
-
If you're using Sunzi with [Vagrant](http://vagrantup.com/), make sure you allowed SSH access for root
|
64
|
+
If you're using Sunzi with [Vagrant](http://vagrantup.com/), make sure you allowed SSH access for root.
|
65
|
+
|
66
|
+
Since it uses port 2222 for SSH, you need to specify the port number:
|
68
67
|
|
69
68
|
$ vagrant up
|
70
|
-
$
|
69
|
+
$ sunzi deploy root@localhost 2222
|
data/lib/sunzi/cli.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
require 'thor'
|
2
|
+
require 'yaml'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'open3'
|
2
5
|
|
3
6
|
module Sunzi
|
4
7
|
CONFIG_DIR = File.join(ENV['HOME'],'.config','sunzi')
|
@@ -13,18 +16,64 @@ module Sunzi
|
|
13
16
|
end
|
14
17
|
|
15
18
|
map "c" => :create
|
19
|
+
map "d" => :deploy
|
16
20
|
|
17
21
|
desc "create [PROJECT]", "Create sunzi project (Shortcut: c)"
|
18
22
|
def create(project = 'sunzi')
|
19
23
|
empty_directory project
|
20
|
-
empty_directory "#{project}/
|
21
|
-
empty_directory "#{project}/
|
22
|
-
|
23
|
-
template "templates/
|
24
|
-
template "templates/
|
25
|
-
template "templates/here/deploy.sh", "#{project}/here/deploy.sh"
|
26
|
-
template "templates/there/install.sh", "#{project}/there/install.sh"
|
27
|
-
template "templates/there/recipes/ssh_key.sh", "#{project}/there/recipes/ssh_key.sh"
|
24
|
+
empty_directory "#{project}/remote"
|
25
|
+
empty_directory "#{project}/remote/recipes"
|
26
|
+
template "templates/attributes.yml", "#{project}/attributes.yml"
|
27
|
+
template "templates/remote/install.sh", "#{project}/remote/install.sh"
|
28
|
+
template "templates/remote/recipes/ssh_key.sh", "#{project}/remote/recipes/ssh_key.sh"
|
28
29
|
end
|
30
|
+
|
31
|
+
desc "deploy [USER@HOST] [PORT]", "Deploy sunzi project (Shortcut: d)"
|
32
|
+
def deploy(*target)
|
33
|
+
if target.empty? or !target.first.match(/@/)
|
34
|
+
puts "Usage: sunzi deploy root@example.com"
|
35
|
+
abort
|
36
|
+
end
|
37
|
+
|
38
|
+
# Compile attributes.yml
|
39
|
+
unless File.exists?('attributes.yml')
|
40
|
+
puts "You must be in the sunzi folder"
|
41
|
+
abort
|
42
|
+
end
|
43
|
+
hash = YAML.load(File.read('attributes.yml'))
|
44
|
+
FileUtils.mkdir_p('remote/attributes')
|
45
|
+
hash.each do |key, value|
|
46
|
+
File.open("remote/attributes/#{key}", 'w'){|file| file.write(value) }
|
47
|
+
end
|
48
|
+
|
49
|
+
host, port = target
|
50
|
+
port ||= 22
|
51
|
+
user, domain = host.split('@')
|
52
|
+
|
53
|
+
commands = <<-EOS
|
54
|
+
ssh-keygen -R #{domain}
|
55
|
+
cd remote
|
56
|
+
tar cz . | ssh -o 'StrictHostKeyChecking no' #{host} -p #{port} '
|
57
|
+
rm -rf ~/sunzi &&
|
58
|
+
mkdir ~/sunzi &&
|
59
|
+
cd ~/sunzi &&
|
60
|
+
tar xz &&
|
61
|
+
bash install.sh'
|
62
|
+
EOS
|
63
|
+
|
64
|
+
Open3.popen3(commands) do |stdin, stdout, stderr|
|
65
|
+
stdin.close
|
66
|
+
t = Thread.new(stderr) do |terr|
|
67
|
+
while (line = terr.gets)
|
68
|
+
print "\e[31m#{line}\e[0m"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
while (line = stdout.gets)
|
72
|
+
print "\e[32m#{line}\e[0m"
|
73
|
+
end
|
74
|
+
t.join
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
29
78
|
end
|
30
79
|
end
|
data/lib/sunzi/version.rb
CHANGED
File without changes
|
@@ -11,7 +11,9 @@ else
|
|
11
11
|
chmod 700 ~/.ssh
|
12
12
|
chmod 600 ~/.ssh/authorized_keys
|
13
13
|
else
|
14
|
-
echo
|
15
|
-
echo
|
14
|
+
echo "The public key file is not found! Try the following command:"
|
15
|
+
echo "cp ~/.ssh/$1 remote"
|
16
|
+
echo "If the file name found in ~/.ssh is different from \"$1\", edit attributes.yml as appropriate."
|
17
|
+
exit 1
|
16
18
|
fi
|
17
19
|
fi
|
data/sunzi.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.email = ["kenn.ejima@gmail.com"]
|
10
10
|
s.homepage = "http://github.com/kenn/sunzi"
|
11
11
|
s.summary = %q{Server provisioning tool for minimalists}
|
12
|
-
s.description = %q{
|
12
|
+
s.description = %q{Server provisioning tool for minimalists}
|
13
13
|
|
14
14
|
s.rubyforge_project = "sunzi"
|
15
15
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sunzi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-25 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &2160735500 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,8 +21,8 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
-
description:
|
24
|
+
version_requirements: *2160735500
|
25
|
+
description: Server provisioning tool for minimalists
|
26
26
|
email:
|
27
27
|
- kenn.ejima@gmail.com
|
28
28
|
executables:
|
@@ -39,11 +39,9 @@ files:
|
|
39
39
|
- lib/sunzi/base.rb
|
40
40
|
- lib/sunzi/cli.rb
|
41
41
|
- lib/sunzi/version.rb
|
42
|
-
- lib/templates/
|
43
|
-
- lib/templates/
|
44
|
-
- lib/templates/
|
45
|
-
- lib/templates/there/install.sh
|
46
|
-
- lib/templates/there/recipes/ssh_key.sh
|
42
|
+
- lib/templates/attributes.yml
|
43
|
+
- lib/templates/remote/install.sh
|
44
|
+
- lib/templates/remote/recipes/ssh_key.sh
|
47
45
|
- sunzi.gemspec
|
48
46
|
homepage: http://github.com/kenn/sunzi
|
49
47
|
licenses: []
|
@@ -1,11 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'yaml'
|
4
|
-
hash = YAML.load(File.read('attributes.yml'))
|
5
|
-
|
6
|
-
require 'fileutils'
|
7
|
-
FileUtils.mkdir_p('../there/attributes')
|
8
|
-
|
9
|
-
hash.each do |key, value|
|
10
|
-
File.open("../there/attributes/#{key}", 'w'){|file| file.write(value) }
|
11
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
# Usage: bash deploy.sh [host] [-p 2222]
|
4
|
-
|
5
|
-
if [ -z "$1" ]; then
|
6
|
-
echo "Usage: bash deploy.sh user@example.com"
|
7
|
-
exit 1
|
8
|
-
fi
|
9
|
-
|
10
|
-
# Compile attributes
|
11
|
-
ruby compile.rb
|
12
|
-
|
13
|
-
# The host key might change when we instantiate a new VM, so
|
14
|
-
# we remove (-R) the old host key from known_hosts
|
15
|
-
host="$1"
|
16
|
-
ssh-keygen -R "${host#*@}" 2> /dev/null
|
17
|
-
|
18
|
-
# Connect to the remote server and deploy
|
19
|
-
cd ../there
|
20
|
-
tar cz . | ssh -o 'StrictHostKeyChecking no' "$host" "$2" "$3" '
|
21
|
-
rm -rf ~/sunzi &&
|
22
|
-
mkdir ~/sunzi &&
|
23
|
-
cd ~/sunzi &&
|
24
|
-
tar xz &&
|
25
|
-
bash install.sh'
|