knife-oneandone 1.0.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|