ansible_module 0.9.1 → 0.9.2
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/CHANGELOG.md +4 -0
- data/README.md +100 -21
- data/VERSION +1 -1
- data/lib/ansible_module.rb +17 -18
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf1b28c2d28267e752955d791b48e7b2a1f90789
|
4
|
+
data.tar.gz: fcc36bebf0600969dd4fbdc437a83bf38365c6ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acfff12953c0ae8c0841c0d7a74cfed39d86ba90f5b83657cc77c913e34f433aa7c652b8b9839c545d3c97500198513ab694a8ef5a04d94f0af0f888ee52eb9d
|
7
|
+
data.tar.gz: 645ebb33640f937a8ee3b3fc7df4ec4f3c2c33704527bd6d69da3699bee1ee6ce6cdb9b96b20e5741cde7609d8a506dbe9ac93acd46f344197dad1286bee154f
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -19,7 +19,7 @@ The following is a typical procedure on Ubuntu Server 14.04:
|
|
19
19
|
```
|
20
20
|
$ sudo add-apt-repository -y ppa:brightbox/ruby-ng
|
21
21
|
$ sudo apt-get update
|
22
|
-
$ sudo apt-get -y install ruby2.1
|
22
|
+
$ sudo apt-get -y install ruby2.1 ruby2.1-dev
|
23
23
|
$ sudo gem install ansible_module
|
24
24
|
```
|
25
25
|
|
@@ -37,6 +37,8 @@ The following is an example for Ubuntu Server 14.04:
|
|
37
37
|
apt_repository: repo='ppa:brightbox/ruby-ng' state=present
|
38
38
|
- name: Install ruby 2.1
|
39
39
|
apt: name=ruby2.1 state=present
|
40
|
+
- name: Install ruby 2.1 headers
|
41
|
+
apt: name=ruby2.1-dev state=present
|
40
42
|
- name: Install ansible_module gem
|
41
43
|
gem: name=ansible_module user_install=false state=present
|
42
44
|
```
|
@@ -50,8 +52,10 @@ $ ansible-playbook -i hosts ruby_environment.yml
|
|
50
52
|
In the above example, the `hosts` file is an [inventory](http://docs.ansible.com/intro_inventory.html) which lists up host names or IP addresses.
|
51
53
|
|
52
54
|
|
53
|
-
Example (1)
|
54
|
-
|
55
|
+
Example (1) -- Simple Calculation
|
56
|
+
---------------------------------
|
57
|
+
|
58
|
+
### Module
|
55
59
|
|
56
60
|
Create a file named `calc` on the `library` directory as follows:
|
57
61
|
|
@@ -62,10 +66,9 @@ require 'ansible_module'
|
|
62
66
|
|
63
67
|
class Calc < AnsibleModule
|
64
68
|
attribute :x, Integer
|
65
|
-
attribute :y, Integer
|
69
|
+
attribute :y, Integer
|
66
70
|
|
67
|
-
validates :x, presence: true, numericality: { only_integer: true }
|
68
|
-
validates :y, numericality: { only_integer: true }
|
71
|
+
validates :x, :y, presence: true, numericality: { only_integer: true }
|
69
72
|
|
70
73
|
def main
|
71
74
|
sum = x + y
|
@@ -81,7 +84,16 @@ The values of attributes `x` and `y` are set during instantiation process by `An
|
|
81
84
|
|
82
85
|
Note that you can validate them with `validates` class method derived from `ActiveModel`.
|
83
86
|
|
84
|
-
|
87
|
+
The class method `instance` returns a singleton instance of `Calc` class,
|
88
|
+
and its `run` method calls the `main` method if validations are successful.
|
89
|
+
|
90
|
+
So, the author of an Ansible module must implement the `main` method at least.
|
91
|
+
|
92
|
+
|
93
|
+
### Playbook
|
94
|
+
|
95
|
+
Now, you can use the `calc` module in your playbook.
|
96
|
+
For example, create a file named `calc.yml` as follows:
|
85
97
|
|
86
98
|
```yaml
|
87
99
|
- hosts: servers
|
@@ -89,19 +101,52 @@ Then, create a file named `calc.yml` as follows:
|
|
89
101
|
- name: Make a calculation
|
90
102
|
calc: x=50 y=50
|
91
103
|
register: result
|
92
|
-
- debug:
|
93
|
-
msg="sum = {{ result['sum'] }}"
|
104
|
+
- debug: msg="sum = {{ result['sum'] }}"
|
94
105
|
```
|
95
106
|
|
96
|
-
|
107
|
+
Then, run the following command on your local host:
|
97
108
|
|
98
109
|
```
|
99
110
|
$ ansible-playbook -i hosts calc.yml
|
100
111
|
```
|
101
112
|
|
102
113
|
|
103
|
-
Example (2)
|
104
|
-
|
114
|
+
Example (2) -- MySQL 5.6 Replication Management
|
115
|
+
-----------------------------------------------
|
116
|
+
|
117
|
+
### Prerequisites
|
118
|
+
|
119
|
+
Install MySQL 5.6 Server, MySQL 5.6 Client, MySQL 5.6 development files and `mysql2` gem.
|
120
|
+
|
121
|
+
The following is a typical procedure on Ubuntu Server 14.04:
|
122
|
+
|
123
|
+
```
|
124
|
+
$ sudo add-apt-repository -y ppa:ondrej/mysql-5.6
|
125
|
+
$ sudo apt-get update
|
126
|
+
$ sudo apt-get -y install mysql-server-5.6 mysql-client-5.6 libmysqlclient-dev
|
127
|
+
$ sudo gem install mysql2
|
128
|
+
```
|
129
|
+
|
130
|
+
You can also install them with the following playbook:
|
131
|
+
|
132
|
+
```yaml
|
133
|
+
- hosts: servers
|
134
|
+
sudo: yes
|
135
|
+
tasks:
|
136
|
+
- name: Add ppa for mysql 5.6
|
137
|
+
apt_repository: repo='ppa:ondrej/mysql-5.6' state=present
|
138
|
+
- name: Install mysql server 5.6
|
139
|
+
apt: name=mysql-server-5.6 state=present
|
140
|
+
- name: Install mysql client 5.6
|
141
|
+
apt: name=mysql-client-5.6 state=present
|
142
|
+
- name: Install libmysqlclient-dev
|
143
|
+
apt: name=libmysqlclient-dev state=present
|
144
|
+
- name: Install mysql2 gem
|
145
|
+
gem: name=mysql2 user_install=false state=present
|
146
|
+
```
|
147
|
+
|
148
|
+
|
149
|
+
### Module
|
105
150
|
|
106
151
|
Create a file named `mysql_change_master` on the `library` directory as follows:
|
107
152
|
|
@@ -109,6 +154,7 @@ Create a file named `mysql_change_master` on the `library` directory as follows:
|
|
109
154
|
#!/usr/bin/ruby
|
110
155
|
|
111
156
|
require 'ansible_module'
|
157
|
+
require 'mysql2'
|
112
158
|
|
113
159
|
class MysqlChangeMaster < AnsibleModule
|
114
160
|
attribute :host, String
|
@@ -117,28 +163,59 @@ class MysqlChangeMaster < AnsibleModule
|
|
117
163
|
attribute :password, String
|
118
164
|
attribute :mysql_root_password, String
|
119
165
|
|
166
|
+
validates :host, :user, :password, presence: true
|
120
167
|
validates :port, inclusion: { in: 0..65535 }
|
168
|
+
validates :password, maximum: 32
|
121
169
|
|
122
170
|
def main
|
171
|
+
done? && exit_json(changed: false)
|
172
|
+
|
123
173
|
statement = %Q{
|
124
|
-
STOP SLAVE;
|
125
174
|
CHANGE MASTER TO
|
126
175
|
MASTER_HOST='#{host}',
|
127
176
|
MASTER_PORT=#{port},
|
128
177
|
MASTER_USER='#{user}',
|
129
178
|
MASTER_PASSWORD='#{password}',
|
130
|
-
MASTER_AUTO_POSITION=1
|
131
|
-
START SLAVE;
|
179
|
+
MASTER_AUTO_POSITION=1
|
132
180
|
}.squish
|
133
181
|
|
134
|
-
|
135
|
-
|
136
|
-
|
182
|
+
mysql_client.query('STOP SLAVE')
|
183
|
+
mysql_client.query(statement)
|
184
|
+
mysql_client.query('START SLAVE')
|
185
|
+
sleep(1)
|
137
186
|
|
138
|
-
|
139
|
-
|
140
|
-
|
187
|
+
if done?
|
188
|
+
exit_json(statement: statement, changed: true)
|
189
|
+
else
|
190
|
+
fail_json(msg: "Last Error: #{@last_error}")
|
191
|
+
end
|
141
192
|
end
|
193
|
+
|
194
|
+
private
|
195
|
+
|
196
|
+
def done?
|
197
|
+
status = mysql_client.query('SHOW SLAVE STATUS').first || {}
|
198
|
+
|
199
|
+
@last_error = [ status['Last_IO_Error'], status['Last_SQL_Error'] ]
|
200
|
+
.compact.join(' ').squish
|
201
|
+
|
202
|
+
status['Master_Host'] == host &&
|
203
|
+
status['Master_User'] == user &&
|
204
|
+
status['Master_Port'].to_i == port &&
|
205
|
+
status['Auto_Position'].to_i == 1 &&
|
206
|
+
status['Slave_IO_State'] != '' &&
|
207
|
+
status['Last_IO_Error'] == '' &&
|
208
|
+
status['Last_SQL_Error'] == ''
|
209
|
+
end
|
210
|
+
|
211
|
+
def mysql_client
|
212
|
+
@client ||= Mysql2::Client.new(
|
213
|
+
host: 'localhost',
|
214
|
+
username: 'root',
|
215
|
+
password: mysql_root_password,
|
216
|
+
encoding: 'utf8'
|
217
|
+
)
|
218
|
+
end
|
142
219
|
end
|
143
220
|
|
144
221
|
MysqlChangeMaster.instance.run
|
@@ -146,6 +223,8 @@ MysqlChangeMaster.instance.run
|
|
146
223
|
|
147
224
|
Note that you can use methods added by `ActiveSupport` like `String#squish`.
|
148
225
|
|
226
|
+
### Playbook
|
227
|
+
|
149
228
|
Then, create a file named `replication.yml` as follows:
|
150
229
|
|
151
230
|
```yaml
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.2
|
data/lib/ansible_module.rb
CHANGED
@@ -24,30 +24,29 @@ class AnsibleModule
|
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
def exit_json(hash)
|
28
|
+
hash = ActiveSupport::HashWithIndifferentAccess.new(hash)
|
29
|
+
print JSON.dump(hash)
|
30
|
+
exit 0
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
def fail_json(hash)
|
34
|
+
hash = ActiveSupport::HashWithIndifferentAccess.new(hash)
|
35
|
+
hash[:failed] = true
|
36
|
+
hash[:msg] ||= "No error message."
|
37
|
+
print JSON.dump(hash)
|
38
|
+
exit 1
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
def invalid_json
|
42
|
+
message = 'Invalid parameters: '
|
43
|
+
message += errors.full_messages.map { |m| "#{m}." }.join(' ')
|
44
|
+
fail_json(msg: message)
|
45
|
+
end
|
46
46
|
|
47
47
|
class << self
|
48
48
|
def instance
|
49
49
|
@instance ||= new(params)
|
50
|
-
@instance
|
51
50
|
end
|
52
51
|
|
53
52
|
def params
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ansible_module
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tsutomu KURODA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 4.1.5
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.0.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.0.0
|
69
83
|
description: AnsibleModule is a Ruby class that provides basic functionalities as
|
70
84
|
an Ansible module.
|
71
85
|
email: t-kuroda@oiax.jp
|
@@ -101,5 +115,5 @@ rubyforge_project:
|
|
101
115
|
rubygems_version: 2.1.10
|
102
116
|
signing_key:
|
103
117
|
specification_version: 4
|
104
|
-
summary:
|
118
|
+
summary: A Ruby base class for Ansible module.
|
105
119
|
test_files: []
|