knife-oneandone 1.0.0 → 1.2.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.
- checksums.yaml +4 -4
- data/.gitignore +12 -12
- data/.rspec +2 -2
- data/.rubocop.yml +29 -26
- data/.travis.yml +5 -5
- data/Gemfile +4 -4
- data/LICENSE +201 -201
- data/README.md +358 -278
- data/Rakefile +6 -6
- data/knife-oneandone.gemspec +30 -31
- data/lib/1and1/helpers.rb +29 -29
- data/lib/chef/knife/oneandone_appliance_list.rb +39 -39
- data/lib/chef/knife/oneandone_base.rb +32 -32
- data/lib/chef/knife/oneandone_block_storage_attach.rb +33 -0
- data/lib/chef/knife/oneandone_block_storage_create.rb +64 -0
- data/lib/chef/knife/oneandone_block_storage_delete.rb +59 -0
- data/lib/chef/knife/oneandone_block_storage_detach.rb +28 -0
- data/lib/chef/knife/oneandone_block_storage_list.rb +42 -0
- data/lib/chef/knife/oneandone_block_storage_rename.rb +38 -0
- data/lib/chef/knife/oneandone_datacenter_list.rb +33 -33
- data/lib/chef/knife/oneandone_firewall_create.rb +97 -97
- data/lib/chef/knife/oneandone_firewall_delete.rb +59 -59
- data/lib/chef/knife/oneandone_firewall_list.rb +33 -33
- data/lib/chef/knife/oneandone_ip_list.rb +39 -39
- data/lib/chef/knife/oneandone_loadbalancer_create.rb +147 -147
- data/lib/chef/knife/oneandone_loadbalancer_delete.rb +59 -59
- data/lib/chef/knife/oneandone_loadbalancer_list.rb +39 -39
- data/lib/chef/knife/oneandone_mp_list.rb +37 -37
- data/lib/chef/knife/oneandone_server_baremetal_model_list.rb +31 -0
- data/lib/chef/knife/oneandone_server_create.rb +193 -163
- data/lib/chef/knife/oneandone_server_delete.rb +63 -63
- data/lib/chef/knife/oneandone_server_hdd_add.rb +60 -60
- data/lib/chef/knife/oneandone_server_hdd_delete.rb +55 -55
- data/lib/chef/knife/oneandone_server_hdd_list.rb +44 -44
- data/lib/chef/knife/oneandone_server_hdd_resize.rb +59 -59
- data/lib/chef/knife/oneandone_server_list.rb +35 -35
- data/lib/chef/knife/oneandone_server_modify.rb +80 -80
- data/lib/chef/knife/oneandone_server_reboot.rb +41 -41
- data/lib/chef/knife/oneandone_server_rename.rb +37 -37
- data/lib/chef/knife/oneandone_server_size_list.rb +39 -39
- data/lib/chef/knife/oneandone_server_start.rb +35 -35
- data/lib/chef/knife/oneandone_server_stop.rb +41 -41
- data/lib/chef/knife/oneandone_ssh_key_create.rb +54 -0
- data/lib/chef/knife/oneandone_ssh_key_delete.rb +59 -0
- data/lib/chef/knife/oneandone_ssh_key_list.rb +44 -0
- data/lib/chef/knife/oneandone_ssh_key_rename.rb +37 -0
- data/lib/knife-oneandone/version.rb +5 -5
- metadata +24 -13
data/README.md
CHANGED
@@ -1,278 +1,358 @@
|
|
1
|
-
# Knife
|
2
|
-
|
3
|
-
##
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
*
|
10
|
-
*
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
knife oneandone
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
```
|
190
|
-
knife oneandone
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
```
|
238
|
-
|
239
|
-
```
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
2
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
1
|
+
# 1&1 Chef Knife Plugin
|
2
|
+
|
3
|
+
## Table of Contents
|
4
|
+
* [Description](#description)
|
5
|
+
* [Requirements](#requirements)
|
6
|
+
* [Installation](#installation)
|
7
|
+
* [Configuration](#configuration)
|
8
|
+
* [Sub-Commands](#sub-commands)
|
9
|
+
* [Usage](#usage)
|
10
|
+
* [Development](#development)
|
11
|
+
* [Contribute to the Project](#contribute-to-the-project)
|
12
|
+
|
13
|
+
## Description
|
14
|
+
|
15
|
+
1&1 Chef Knife plugin for managing 1&1 Cloud servers. For more information on the 1&1 Chef Knife plugin, see the [1&1 Community Portal](https://www.1and1.com/cloud-community/).
|
16
|
+
|
17
|
+
## Requirements
|
18
|
+
|
19
|
+
* Chef 12.3.0 or higher
|
20
|
+
* Ruby 2.1.x or higher
|
21
|
+
|
22
|
+
## Installation
|
23
|
+
|
24
|
+
Add this line to your application's Gemfile:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
gem 'knife-oneandone'
|
28
|
+
```
|
29
|
+
|
30
|
+
And then execute:
|
31
|
+
|
32
|
+
$ bundle
|
33
|
+
|
34
|
+
Or install it yourself as:
|
35
|
+
|
36
|
+
$ gem install knife-oneandone
|
37
|
+
|
38
|
+
|
39
|
+
## Configuration
|
40
|
+
|
41
|
+
The 1&1 Chef Knife plugin requires a valid 1&1 API key. Add your 1&1 API key in a ```knife.rb``` configuration file (for example in ```~/.chef/knife.rb```).
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
knife[:oneandone_api_key] = '_YOUR_API_KEY_'
|
45
|
+
```
|
46
|
+
|
47
|
+
## Sub-Commands
|
48
|
+
|
49
|
+
The following sub-commands are available with the plugin.
|
50
|
+
|
51
|
+
**List all server appliances**
|
52
|
+
|
53
|
+
knife oneandone appliance list
|
54
|
+
|
55
|
+
**List all data centers**
|
56
|
+
|
57
|
+
knife oneandone datacenter list
|
58
|
+
|
59
|
+
**Create a new firewall policy**
|
60
|
+
|
61
|
+
knife oneandone firewall create
|
62
|
+
|
63
|
+
**Delete one or more firewall policies**
|
64
|
+
|
65
|
+
knife oneandone firewall delete
|
66
|
+
|
67
|
+
**List available firewall policies**
|
68
|
+
|
69
|
+
knife oneandone firewall list
|
70
|
+
|
71
|
+
**List allocated public IP addresses**
|
72
|
+
|
73
|
+
knife oneandone ip list
|
74
|
+
|
75
|
+
**Create a new load balancer**
|
76
|
+
|
77
|
+
knife oneandone loadbalancer create
|
78
|
+
|
79
|
+
**Delete one or more load balancers**
|
80
|
+
|
81
|
+
knife oneandone loadbalancer delete
|
82
|
+
|
83
|
+
**List available load balancers**
|
84
|
+
|
85
|
+
knife oneandone loadbalancer list
|
86
|
+
|
87
|
+
**List available monitoring policies**
|
88
|
+
|
89
|
+
knife oneandone mp list
|
90
|
+
|
91
|
+
**Create a new server**
|
92
|
+
|
93
|
+
knife oneandone server create
|
94
|
+
|
95
|
+
**Delete one or more servers**
|
96
|
+
|
97
|
+
knife oneandone server delete
|
98
|
+
|
99
|
+
**Add one or more hard disks to server**
|
100
|
+
|
101
|
+
knife oneandone server hdd add
|
102
|
+
|
103
|
+
**Remove server's hard disk**
|
104
|
+
|
105
|
+
knife oneandone server hdd delete
|
106
|
+
|
107
|
+
**List server's hard disks**
|
108
|
+
|
109
|
+
knife oneandone server hdd list
|
110
|
+
|
111
|
+
**Resize server's hard disk**
|
112
|
+
|
113
|
+
knife oneandone server hdd resize
|
114
|
+
|
115
|
+
**List available servers**
|
116
|
+
|
117
|
+
knife oneandone server list
|
118
|
+
|
119
|
+
**Modify server's hardware configuration: CPU/cores count, RAM amount and/or fixed server size.**
|
120
|
+
|
121
|
+
knife oneandone server modify
|
122
|
+
|
123
|
+
**Reboot one or more servers**
|
124
|
+
|
125
|
+
knife oneandone server reboot
|
126
|
+
|
127
|
+
**Update server's name and/or description**
|
128
|
+
|
129
|
+
knife oneandone server rename
|
130
|
+
|
131
|
+
**List available fixed-server-size configurations**
|
132
|
+
|
133
|
+
knife oneandone server size list
|
134
|
+
|
135
|
+
**Start one or more servers**
|
136
|
+
|
137
|
+
knife oneandone server start
|
138
|
+
|
139
|
+
**Stop one or more servers**
|
140
|
+
|
141
|
+
knife oneandone server stop
|
142
|
+
|
143
|
+
**Creates a new block storage**
|
144
|
+
|
145
|
+
knife oneandone block storage create
|
146
|
+
|
147
|
+
**Lists available block storages.**
|
148
|
+
|
149
|
+
knife oneandone block storage list
|
150
|
+
|
151
|
+
**Updates block storage's name and/or description**
|
152
|
+
|
153
|
+
knife oneandone block storage rename
|
154
|
+
|
155
|
+
**Deletes one or more block storages**
|
156
|
+
|
157
|
+
knife oneandone block storage delete
|
158
|
+
|
159
|
+
**Attaches a block storage to a server**
|
160
|
+
|
161
|
+
knife oneandone block storage attach
|
162
|
+
|
163
|
+
**Detaches a block storage from a server**
|
164
|
+
|
165
|
+
knife oneandone block storage detach
|
166
|
+
|
167
|
+
**Creates a new ssh key**
|
168
|
+
|
169
|
+
knife oneandone ssh key create
|
170
|
+
|
171
|
+
**Lists available ssh keys**
|
172
|
+
|
173
|
+
knife oneandone ssh key list
|
174
|
+
|
175
|
+
**Updates ssh key's name and/or description**
|
176
|
+
|
177
|
+
knife oneandone ssh key rename
|
178
|
+
|
179
|
+
**Deletes one or more ssh keys**
|
180
|
+
|
181
|
+
knife oneandone ssh key delete
|
182
|
+
|
183
|
+
## Usage
|
184
|
+
|
185
|
+
Before deploying a server to your 1&1 Cloud environment, you may want set up a dedicated firewall policy or a load balancer for the server.
|
186
|
+
|
187
|
+
To create a firewall policy and allow the access from any IP address:
|
188
|
+
|
189
|
+
```
|
190
|
+
knife oneandone firewall create -n my-firewall -p TCP,UDP,ICMP --port-from 80,161 --port-to 80,162
|
191
|
+
```
|
192
|
+
|
193
|
+
A load balancer can be created as follows:
|
194
|
+
|
195
|
+
```
|
196
|
+
knife oneandone loadbalancer create -n my-LB -m ROUND_ROBIN \
|
197
|
+
-p TCP,UDP --port-balancer 80,161 --port-server 8080,161
|
198
|
+
```
|
199
|
+
|
200
|
+
To restrict the access to a particular IP address or network, specify ```--source``` option for the load balancer and firewall policy.
|
201
|
+
|
202
|
+
**Note:** When multiple (firewall or load balancer) rules are specified, make sure that the protocols, ports and sources are separated by a comma and in the same order. In a firewall policy create command, specify GRE, ICMP and IPSEC protocols last, for instance
|
203
|
+
```--protocol TCP,TCP,UDP,TCP/UDP,GRE,ICMP,IPSEC```.
|
204
|
+
|
205
|
+
|
206
|
+
Furthermore, use the list commands to find out IDs of the fixed-size configurations, server appliances, monitoring policies, existing IPs, data centers etc.
|
207
|
+
|
208
|
+
```
|
209
|
+
knife oneandone server size list
|
210
|
+
ID Name RAM (GB) Processor No. Cores per Processor Disk Size (GB)
|
211
|
+
65929629F35BBFBA63022008F773F3EB M 1 1 1 40
|
212
|
+
591A7FEF641A98B38D1C4F7C99910121 L 2 2 1 80
|
213
|
+
E903FA4F907B5AAF17A7E987FFCDCC6B XL 4 2 1 120
|
214
|
+
57862AE452473D551B1673938DD3DFFE XXL 8 4 1 160
|
215
|
+
3D4C49EAEDD42FBC23DB58FE3DEF464F S 0.5 1 1 30
|
216
|
+
6A2383038420110058C77057D261A07C 3XL 16 8 1 240
|
217
|
+
EED49B709368C3715382730A604E9F6A 4XL 32 12 1 360
|
218
|
+
EE48ACD55FEFE57E2651862A348D1254 5XL 48 16 1 500
|
219
|
+
```
|
220
|
+
|
221
|
+
The format option may be used with the list commands to output JSON or yaml (e.g. ```-F json```, ```--format yaml```).
|
222
|
+
|
223
|
+
|
224
|
+
To create a cloud server, you can either specify a fixed-size ID or a flex configuration of the hardware. For baremetal servers, you have to specify a baremetal_model_id.
|
225
|
+
|
226
|
+
```
|
227
|
+
knife oneandone server create -n Demo-Server \
|
228
|
+
--appliance-id FF696FFE6FB96FC54638DB47E9321E25 \
|
229
|
+
--datacenter-id 5091F6D8CBFEF9C26ACE957C652D5D49 \
|
230
|
+
--fixed-size-id 65929629F35BBFBA63022008F773F3EB
|
231
|
+
Deploying, wait for the operation to complete...
|
232
|
+
ID: D67F6B24C9C0AED76B8573D267B0EDAB
|
233
|
+
Name: Demo-Server
|
234
|
+
First IP: 109.228.53.48
|
235
|
+
First Password: Qc9knjVAK1
|
236
|
+
done
|
237
|
+
```
|
238
|
+
|
239
|
+
```
|
240
|
+
knife oneandone server create -n chef-baremetal-server \
|
241
|
+
--appliance-id 33352CCE1E710AF200CD1234BFD18862 \
|
242
|
+
--datacenter-id 4EFAD5836CE43ACA502FD5B99BEE44EF \
|
243
|
+
--baremetal-model-id 81504C620D98BCEBAA5202D145203B4B \
|
244
|
+
--server-type baremetal
|
245
|
+
Deploying, wait for the operation to complete...
|
246
|
+
ID: A022DD2CD1629BBCD7873086C113C1D4
|
247
|
+
Name: chef-baremetal-server
|
248
|
+
First IP: 82.165.251.137
|
249
|
+
First Password: Ur37Ncwwpf
|
250
|
+
done
|
251
|
+
```
|
252
|
+
|
253
|
+
```
|
254
|
+
knife oneandone server create -n FS1 -I B5F778B85C041347BCDCFC3172AB3F3C -P 2 -C 1 -r 2 -H 40 -F yaml
|
255
|
+
Deploying, wait for the operation to complete...
|
256
|
+
---
|
257
|
+
id: 341EB3FF15E861309C4D1C3BC6A8B17B
|
258
|
+
cloudpanel_id: 23A0543
|
259
|
+
name: FS1
|
260
|
+
description: ''
|
261
|
+
datacenter:
|
262
|
+
id: 908DC2072407C94C8054610AD5A53B8C
|
263
|
+
country_code: US
|
264
|
+
location: United States of America
|
265
|
+
creation_date: '2016-08-05T12:26:27+00:00'
|
266
|
+
first_password: Zf1jtd1WH9
|
267
|
+
rsa_key: 0
|
268
|
+
status:
|
269
|
+
state: POWERED_ON
|
270
|
+
percent:
|
271
|
+
hardware:
|
272
|
+
fixed_instance_size_id:
|
273
|
+
vcore: 2
|
274
|
+
cores_per_processor: 1
|
275
|
+
ram: 2
|
276
|
+
hdds:
|
277
|
+
- id: 430C1E70E1737690E5A71F9D63BE80B2
|
278
|
+
size: 40
|
279
|
+
is_main: true
|
280
|
+
image:
|
281
|
+
id: B5F778B85C041347BCDCFC3172AB3F3C
|
282
|
+
name: centos7-64std
|
283
|
+
dvd:
|
284
|
+
snapshot:
|
285
|
+
ips:
|
286
|
+
- id: DC9F635EA2B3144FC047532C6FD56B84
|
287
|
+
ip: 62.151.178.250
|
288
|
+
type: IPV4
|
289
|
+
reverse_dns:
|
290
|
+
firewall_policy:
|
291
|
+
id: A4D6302FA44955C797772E34880CBA42
|
292
|
+
name: centos7-64cpanel
|
293
|
+
load_balancers: []
|
294
|
+
alerts: []
|
295
|
+
monitoring_policy:
|
296
|
+
private_networks:
|
297
|
+
```
|
298
|
+
|
299
|
+
To attach new hard disks to the server, specify a size for each new volume:
|
300
|
+
|
301
|
+
```
|
302
|
+
knife oneandone server hdd add 20 80 160 --server-id 341EB3FF15E861309C4D1C3BC6A8B17B
|
303
|
+
```
|
304
|
+
|
305
|
+
List the server disks in the following way:
|
306
|
+
|
307
|
+
```
|
308
|
+
knife oneandone server hdd list 341EB3FF15E861309C4D1C3BC6A8B17B
|
309
|
+
ID Size (GB) Main
|
310
|
+
430C1E70E1737690E5A71F9D63BE80B2 40 true
|
311
|
+
26D593F10CF0FE666004A594A08B5C0A 20 false
|
312
|
+
602690CAA4BFE5724356148112918C79 80 false
|
313
|
+
BA5486B5C0F1861307F80DEB880A4041 160 false
|
314
|
+
```
|
315
|
+
|
316
|
+
Specify the ID of any server you intend to start, stop, reboot or delete. The next example shows a delete operation with auto-confirming all prompts for deletion.
|
317
|
+
|
318
|
+
```
|
319
|
+
knife oneandone server delete 341EB3FF15E861309C4D1C3BC6A8B17B D67F6B24C9C0AED76B8573D267B0EDAB -y
|
320
|
+
```
|
321
|
+
|
322
|
+
A block storage can be created as follows:
|
323
|
+
|
324
|
+
```
|
325
|
+
knife oneandone block storage create -n chef-blk -s 30 --description test_chef_blkstore -D 5091F6D8CBFEF9C26ACE957C652D5D49
|
326
|
+
```
|
327
|
+
|
328
|
+
An ssh key can be created as follows:
|
329
|
+
|
330
|
+
```
|
331
|
+
knife oneandone ssh key create -n chef-ssh-key --description test_chef_sshkey
|
332
|
+
```
|
333
|
+
|
334
|
+
To create a server with ssh keys, pass the comma-separated list of ssh key ids (or just a single id) using `--public-key` parameter:
|
335
|
+
```
|
336
|
+
knife oneandone server create -n chef-serverssh -I C5A349786169F140BCBC335675014C08 -P 2 -C 1 -r 2 -H 40 --public-key E07CA9CA5D8F09A2872FC27160EE28D2
|
337
|
+
```
|
338
|
+
|
339
|
+
## Development
|
340
|
+
|
341
|
+
After checking out the repository, run `bundle install` to install dependencies.
|
342
|
+
|
343
|
+
Use the bundler to run the tests. Declare the `ONEANDONE_API_KEY` environment variable before running the tests.
|
344
|
+
|
345
|
+
$ export ONEANDONE_API_KEY="_YOUR_API_KEY_"
|
346
|
+
$ bundle exec rspec
|
347
|
+
|
348
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
349
|
+
|
350
|
+
## Contribute to the Project
|
351
|
+
|
352
|
+
1. Fork the repository (`https://github.com/1and1/oneandone-cloudserver-chef/fork`).
|
353
|
+
2. Create a new feature branch (`git checkout -b my-new-feature`).
|
354
|
+
3. Commit the changes (`git commit -am 'New feature description'`).
|
355
|
+
4. Push to the branch (`git push origin my-new-feature`).
|
356
|
+
5. Create a new pull request.
|
357
|
+
|
358
|
+
Bug reports and pull requests are welcome.
|