dust-deploy 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. data/LICENSE +5 -0
  2. data/README.md +17 -4
  3. data/bin/dust +20 -12
  4. data/lib/dust/examples/nodes/_default.yaml +15 -0
  5. data/lib/dust/examples/nodes/_newrelic.yaml +10 -0
  6. data/lib/dust/examples/nodes/db-staging.yaml +21 -0
  7. data/lib/dust/examples/nodes/home.yaml +11 -0
  8. data/lib/dust/examples/nodes/mail.yaml +7 -0
  9. data/lib/dust/examples/nodes/mysql-production.yaml +10 -0
  10. data/lib/dust/examples/nodes/proxy-staging.yaml +21 -0
  11. data/lib/dust/examples/templates/aliases/aliases +4 -0
  12. data/lib/dust/examples/templates/basic_setup/.your-inputrc +0 -0
  13. data/lib/dust/examples/templates/basic_setup/.your-vimrc +0 -0
  14. data/lib/dust/examples/templates/duplicity/cronjob.erb +61 -0
  15. data/lib/dust/examples/templates/etc_hosts/hosts +1 -0
  16. data/lib/dust/examples/templates/motd/motd.erb +16 -0
  17. data/lib/dust/examples/templates/nginx/nginx.conf +11 -0
  18. data/lib/dust/examples/templates/nginx/sites/othersite.erb +1 -0
  19. data/lib/dust/examples/templates/nginx/sites/somesite.erb +1 -0
  20. data/lib/dust/examples/templates/postgres/pacemaker.sh.erb +157 -0
  21. data/lib/dust/examples/templates/postgres/pg_hba.conf.erb +86 -0
  22. data/lib/dust/examples/templates/postgres/pg_ident.conf +42 -0
  23. data/lib/dust/examples/templates/postgres/postgresql.conf.erb +62 -0
  24. data/lib/dust/examples/templates/postgres/recovery.conf.erb +122 -0
  25. data/lib/dust/examples/templates/ssh_authorized_keys/users.yaml +13 -0
  26. data/lib/dust/examples/templates/zabbix_agent/zabbix_agentd.conf.erb +129 -0
  27. data/lib/dust/version.rb +1 -1
  28. metadata +26 -3
data/LICENSE ADDED
@@ -0,0 +1,5 @@
1
+ this project is released under the gpl version 3.
2
+ it comes with zero warranty.
3
+
4
+ https://www.gnu.org/copyleft/gpl.html
5
+
data/README.md CHANGED
@@ -22,11 +22,8 @@ let's start by creating a new directory skeleton
22
22
 
23
23
  $ dust new mynetwork
24
24
  - spawning new dust directory skeleton into 'mynetwork.dust' [ ok ]
25
- - copying example yaml node configuration files - copying _debian.yaml [ ok ]
26
- - copying _default.yaml [ ok ]
27
- - copying myhost.yaml [ ok ]
28
25
 
29
- this will create a directory called mynetwork.dust, the nodes, templates and recipes subdirectories and will create some example configuration files in the nodes directory. hop into your new dust directory and see what's going on:
26
+ this will create a directory called mynetwork.dust, the nodes, templates and recipes subdirectories and will copy over example templates and node configurations. hop into your new dust directory and see what's going on:
30
27
 
31
28
  $ cd mynetwork.dust
32
29
 
@@ -141,6 +138,22 @@ you can also overwrite settings in the template with the ones in yourhost.yaml
141
138
 
142
139
 
143
140
 
141
+ filters and proxy
142
+ ------------
143
+
144
+ because that's not awesome enough, you can also filter your hosts using the --filter flag
145
+ $ dust deploy --filter hostname:myhost-1,otherhost
146
+
147
+ $ dust deploy --filter group:debian
148
+
149
+
150
+ and even more, it supports socks proxys, so you can maintain your whole infrastructure without setting up a vpn from the outside via ssh
151
+
152
+ $ ssh user@gateway.yourcompany.net -D 1080
153
+
154
+ $ dust deploy --proxy localhost:1080
155
+
156
+
144
157
 
145
158
  using recipes (and their templates)
146
159
  ------------
data/bin/dust CHANGED
@@ -55,6 +55,7 @@ module Dust
55
55
  :restart => :boolean, :reload => :boolean
56
56
 
57
57
  def deploy yaml=''
58
+ return unless check_dust_dir
58
59
  initialize_thorfiles
59
60
  Dust.print_failed 'no servers match this filter' if load_servers(yaml).empty?
60
61
 
@@ -68,6 +69,7 @@ module Dust
68
69
  method_options :filter => :hash, :recipes => :array, :proxy => :string
69
70
 
70
71
  def status yaml=''
72
+ return unless check_dust_dir
71
73
  initialize_thorfiles
72
74
  Dust.print_failed 'no servers match this filter' if load_servers(yaml).empty?
73
75
 
@@ -78,23 +80,29 @@ module Dust
78
80
  # creates directory skeleton for a dust setup
79
81
  desc 'new <name>', 'creates a dust directory skeleton for your network'
80
82
  def new name
81
- Dust.print_msg "spawning new dust directory skeleton into '#{name}.dust'"
82
- Dir.mkdir "#{name}.dust"
83
- Dir.mkdir "#{name}.dust/nodes"
84
- Dir.mkdir "#{name}.dust/recipes"
85
- Dir.mkdir "#{name}.dust/templates"
83
+ Dust.print_msg "spawning new dust directory skeleton with examples into '#{name}.dust'"
84
+ FileUtils.cp_r File.dirname(__FILE__) + '/../lib/dust/examples', "#{name}.dust"
86
85
  Dust.print_ok
87
-
88
- Dust.print_msg "copying example yaml node configuration files\n"
89
- Dir[File.dirname(__FILE__) + '/../lib/dust/examples/nodes/*.yaml'].each do |file|
90
- Dust.print_msg "copying #{File.basename file}", 2
91
- FileUtils.cp file, "#{name}.dust/nodes/#{File.basename file}"
92
- Dust.print_ok
93
- end
94
86
  end
95
87
 
88
+
96
89
  private
97
90
 
91
+ def check_dust_dir
92
+ if Dir.pwd.split('.').last != 'dust'
93
+ Dust.print_failed 'current directory does not end with .dust, are you in your dust directory?'
94
+ Dust.print_msg "try running 'dust new mynetwork' to let me create one for you with tons of examples!\n", 0
95
+ return false
96
+ end
97
+
98
+ unless File.directory? './nodes'
99
+ Dust.print_failed 'could not find \'nodes\' folder in your dust directory. cannot continue.'
100
+ return false
101
+ end
102
+
103
+ true
104
+ end
105
+
98
106
  # run specified recipes in the given context
99
107
  def run_recipes context
100
108
  @nodes.each do |node|
@@ -2,3 +2,18 @@
2
2
  domain: example.com
3
3
  port: 22
4
4
  user: root
5
+
6
+ recipes:
7
+
8
+ # default duplicity configuration
9
+ duplicity:
10
+ default:
11
+ backend: "--ftp-passive ftp://user:pass@host"
12
+ interval: daily
13
+ nice: 10
14
+ keep-n-full: 5
15
+ full-if-older-than: 7D
16
+ archive: /tmp/duplicity
17
+ include: [ '/etc/', '/root/', '/var/log/' ]
18
+ exclude: [ "'**'" ]
19
+ options: [ 'cleanup' ]
@@ -0,0 +1,10 @@
1
+ recipes:
2
+ repositories:
3
+ newrelic:
4
+ url: "http://apt.newrelic.com/debian/"
5
+ release: "newrelic"
6
+ key: "http://download.newrelic.com/548C16BF.gpg"
7
+ components: "non-free"
8
+ source: false
9
+
10
+ newrelic: "<your new relic key here>"
@@ -0,0 +1,21 @@
1
+ hostname: [ db-1, db-2, db-3-]
2
+ inherits: [ _default, _newrelic ]
3
+
4
+ recipes:
5
+ postgres:
6
+ cluster: main
7
+ version: 9.1
8
+ dbuser: 'postgres:postgres'
9
+
10
+ iptables:
11
+ ports:
12
+ - 22
13
+ - port: 5432
14
+ source: 10.13.37.0/24
15
+ interface: eth1
16
+ ip-version: 4
17
+ - port: [ 5404, 5405 ]
18
+ interface: eth1
19
+ protocol: udp
20
+
21
+ rc_local: blockdev --setra 8192 /dev/vda
@@ -0,0 +1,11 @@
1
+ hostname: home
2
+ inherits: [ _default ]
3
+
4
+ recipes:
5
+ duplicity:
6
+ default:
7
+ passphrase: 'your duplicity passphrase'
8
+ include: [ /etc/, /root/, /var/log/, /home/ ]
9
+ archive: /home/.duplicity-tmp
10
+
11
+ iptables: disabled
@@ -0,0 +1,7 @@
1
+ hostname: 10.0.0.1
2
+ inherits: [ _default, _debian ]
3
+
4
+ recipes:
5
+ aliases: true
6
+ iptables:
7
+ ports: [ 22, 25 ]
@@ -0,0 +1,10 @@
1
+ hostname: mysql
2
+ inherits: [ _default, _debian ]
3
+ group: mysql
4
+
5
+ recipes:
6
+ iptables:
7
+ ports: [ 22, 3306 ]
8
+ rc_local: blockdev --setra 8192 /dev/vdc
9
+ mysql:
10
+ bind_address: 0.0.0.0
@@ -0,0 +1,21 @@
1
+ hostname: reverse-proxy
2
+ inherits: [ _default, _debian ]
3
+
4
+ recipes:
5
+ etc_hosts: dnsmasq
6
+ nginx:
7
+ sites-enabled: [ proxy ]
8
+
9
+ iptables:
10
+ ports:
11
+ - [ 22, 80, 443 ]
12
+ - port: 53
13
+ protocol: tcp
14
+ source: 10.13.37.0/24
15
+ interface: eth1
16
+ ip-version: 4
17
+ - port: 53
18
+ protocol: udp
19
+ source: 10.13.37.0/24
20
+ interface: eth1
21
+ ip-version: 4
@@ -0,0 +1,4 @@
1
+ postmaster: root
2
+ hostmaster: root
3
+ root: your-address
4
+ no-reply: /dev/null
@@ -0,0 +1,61 @@
1
+ #!/bin/bash
2
+
3
+ # the duplicity password
4
+ export PASSPHRASE=<%= config['passphrase'] %>
5
+
6
+ mkdir -p <%= config['archive'] %> &> /dev/null
7
+
8
+ % if config['options'].include?('cleanup')
9
+ # remove old backups
10
+ nice -n <%= config['nice'] %> duplicity remove-all-but-n-full <%= config['keep-n-full'] %> --force \
11
+ --archive-dir <%= config['archive'] %> \
12
+ <%= File.join(config['backend'], config['directory']) %> &> /dev/null
13
+
14
+ # clean up
15
+ nice -n <%= config['nice'] %> duplicity cleanup --force \
16
+ --archive-dir <%= config['archive'] %> \
17
+ <%= File.join(config['backend'], config['directory']) %> &> /dev/null
18
+ % end
19
+
20
+ % if config['options'].include?('postgres-base-backup')
21
+ # make a base backup of the database
22
+ psql -U postgres -c "SELECT pg_start_backup('postgres-base-backup');" &> /dev/null
23
+ % end
24
+
25
+ % if config['options'].include?('postgres-dump')
26
+ su postgres -c pg_dumpall 2> /dev/null > /root/.postgres-dump-<%= config['interval'] %>
27
+ % end
28
+
29
+ % if config['options'].include?('mysql-locksync')
30
+ mysql --defaults-file=/etc/mysql/debian.cnf -e "FLUSH TABLES WITH READ LOCK"
31
+ sync; sync; sync
32
+ % end
33
+
34
+ % if config['options'].include?('ldap-dump')
35
+ # dump ldap database
36
+ /etc/init.d/slapd stop &> /dev/null
37
+ nice -n $NICE slapcat > /root/.ldap-<%= config['interval'] %> &> /dev/null
38
+ /etc/init.d/slapd start &> /dev/null
39
+ % end
40
+
41
+ # backup selected directories
42
+ nice -n <%= config['nice'] %> duplicity --archive-dir <%= config['archive'] %> \
43
+ --full-if-older-than <%= config['full-if-older-than'] %> --exclude-device-files / \
44
+ % config['include'].each do |dir|
45
+ --include <%= dir %> \
46
+ % end
47
+ % config['exclude'].each do |dir|
48
+ --exclude <%= dir %> \
49
+ % end
50
+ <%= File.join(config['backend'], config['directory']) %> &> /dev/null
51
+
52
+ unset PASSPHRASE
53
+
54
+ % if config['options'].include?('postgres-base-backup')
55
+ # stop backup
56
+ psql -U postgres -c "SELECT pg_stop_backup();" &> /dev/null
57
+ % end
58
+
59
+ % if config['options'].include?('mysql-locksync')
60
+ mysql --defaults-file=/etc/mysql/debian.cnf -e "UNLOCK TABLES"
61
+ % end
@@ -0,0 +1 @@
1
+ 127.0.0.1 localhost
@@ -0,0 +1,16 @@
1
+ this is <%= Dust.blue %><%= node['hostname'] %><%= Dust.none %>, a <%= node['domain'] %> <%= node['environment'] %> server
2
+
3
+ % if node['environment'] == 'production'
4
+ just in case you didn't notice the line above, maybe this cow helps:
5
+
6
+ ___________________________________
7
+ < <%= Dust.red %>YOU ARE ON A PRODUCTION SERVER!<%= Dust.none %> >
8
+ -----------------------------------
9
+ <%= Dust.yellow %>
10
+ \ ^__^
11
+ \ (oo)\_______
12
+ (__))\/\
13
+ ||----w |
14
+ || ||
15
+ <%= Dust.none %>
16
+ % end
@@ -0,0 +1,11 @@
1
+ # your nginx config here
2
+
3
+ http {
4
+ access_log /var/log/nginx/access.log;
5
+
6
+ sendfile on;
7
+
8
+ include /etc/nginx/conf.d/*.conf;
9
+ include /etc/nginx/sites-enabled/*;
10
+ }
11
+
@@ -0,0 +1 @@
1
+ and another site
@@ -0,0 +1 @@
1
+ and this is your sites configuration
@@ -0,0 +1,157 @@
1
+ #!/bin/bash
2
+
3
+ # user as which postgres runs
4
+ PG_USER=<%= config['dbuser'] %>
5
+
6
+ # path to postgres directory (data and archives)
7
+ PG_DATA=<%= config['data-dir'] %>
8
+ PG_ARCHIVE=<%= config['archive-dir'] %>
9
+
10
+ # path to recovery.conf (on slaves)
11
+ RECOVERY=$PG_DATA/recovery.conf
12
+ RECOVERY_DONE=$PG_DATA/recovery.done
13
+
14
+ # path to postgresql init script
15
+ % if node.is_gentoo? true
16
+ PG_INIT=/etc/init.d/postgresql-<%= config['version'] %>
17
+ % else
18
+ PG_INIT=/etc/init.d/postgresql
19
+ % end
20
+
21
+ # the clustered IP
22
+ DB_MASTER=db-<%= node['environment'] %>-master.<%= node['domain'] %>
23
+
24
+
25
+ start() {
26
+ # get current status
27
+ status
28
+
29
+ # if configured as slave, touch the trigger file
30
+ # and promote slave to master
31
+ if [ $? -eq 3 ]; then
32
+ TRIGGER=$(grep trigger_file $RECOVERY |cut -d\' -f2)
33
+
34
+ if [ "$TRIGGER" = "" ]; then
35
+ echo "no trigger file configured in recover.conf!"
36
+ return 1
37
+ fi
38
+
39
+ # check if slave runs postgres
40
+ $PG_INIT status
41
+ if [ $? -ne 0 ]; then
42
+ echo "postgresql not running!"
43
+ return 1
44
+ fi
45
+
46
+ touch $TRIGGER
47
+ fi
48
+
49
+ return 0
50
+ }
51
+
52
+ stop() {
53
+ # if configured as master, stop postgresql
54
+ if [ ! -e $RECOVERY_DONE ]; then
55
+ $PG_INIT stop
56
+
57
+ # always return success, because we want pacemaker
58
+ # to setup a new master no matter what.
59
+ # return $?
60
+ return 0
61
+ fi
62
+
63
+ return 0
64
+ }
65
+
66
+ status() {
67
+ if [ -e $RECOVERY ]; then
68
+ echo "postgresql configured as slave"
69
+ return 3
70
+ elif [ -e $RECOVERY_DONE ]; then
71
+ echo "postgres configured as master"
72
+
73
+ # check if postgres status is ok, return
74
+ $PG_INIT status
75
+ return $?
76
+ else
77
+ echo "couldn't determine configuration status"
78
+ return 1
79
+ fi
80
+ }
81
+
82
+
83
+ resync() {
84
+ # check if this is a master
85
+ status
86
+
87
+ if [ $? -eq 0 -a -e $RECOVERY_DONE ]; then
88
+ echo "found recovery.done file, NOT syncing, because this is probably running a master!"
89
+ echo "if you want to sync, remove $RECOVERY_DONE and try again."
90
+ return 1
91
+ fi
92
+
93
+ $PG_INIT stop
94
+
95
+ # remove old (x)logs
96
+ rm -r $PG_DATA/pg_xlog $PG_DATA/pg_log $PG_DATA/postmaster.log $PG_DATA/postmaster.pid &> /dev/null
97
+
98
+ # start backup mode, sync files, stop backup mode
99
+ ssh $DB_MASTER "psql -U postgres -c \"SELECT pg_start_backup('automatic-resync', true)\""
100
+ rsync -aze 'ssh' $DB_MASTER:/$PG_DATA/ $PG_DATA --delete --progress \
101
+ --exclude pg_xlog --exclude postmaster.pid --exclude pg_log --exclude postmaster.log
102
+ ssh $DB_MASTER "psql -U postgres -c \"SELECT pg_stop_backup()\""
103
+
104
+ # create missing directories, change user
105
+ mkdir $PG_DATA/pg_log $PG_DATA/pg_xlog
106
+ chown $PG_USER -R $PG_DATA
107
+ chmod 700 -R $PG_DATA
108
+
109
+ # actually, only the wal files during backup need to be synced
110
+ # but parsing this out is complicated.
111
+ mkdir $PG_ARCHIVE &> /dev/null
112
+ rsync -aze 'ssh' $DB_MASTER:/$PG_ARCHIVE/ $PG_ARCHIVE --delete --progress
113
+
114
+ # remove the trigger file
115
+ TRIGGER=$(grep trigger_file $RECOVERY_DONE |cut -d\' -f2)
116
+ rm $TRIGGER &> /dev/null
117
+
118
+ # activate slave mode
119
+ mv $RECOVERY_DONE $RECOVERY
120
+
121
+ $PG_INIT start
122
+ }
123
+
124
+
125
+ case "$1" in
126
+ start)
127
+ start
128
+ exit $?
129
+ ;;
130
+
131
+ stop)
132
+ stop
133
+ exit $?
134
+ ;;
135
+
136
+ status)
137
+ status
138
+ exit $?
139
+ ;;
140
+
141
+ restart|reload|force-reload)
142
+ echo "Error: argument '$1' not supported" >&2
143
+ exit 3
144
+ ;;
145
+
146
+ resync)
147
+ resync
148
+ exit 0
149
+ ;;
150
+
151
+ *)
152
+ echo "Usage: $0 [start|stop|status]" >&2
153
+ exit 3
154
+ ;;
155
+
156
+ esac
157
+
@@ -0,0 +1,86 @@
1
+ # PostgreSQL Client Authentication Configuration File
2
+ # ===================================================
3
+ #
4
+ # Refer to the "Client Authentication" section in the PostgreSQL
5
+ # documentation for a complete description of this file. A short
6
+ # synopsis follows.
7
+ #
8
+ # This file controls: which hosts are allowed to connect, how clients
9
+ # are authenticated, which PostgreSQL user names they can use, which
10
+ # databases they can access. Records take one of these forms:
11
+ #
12
+ # local DATABASE USER METHOD [OPTIONS]
13
+ # host DATABASE USER CIDR-ADDRESS METHOD [OPTIONS]
14
+ # hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTIONS]
15
+ # hostnossl DATABASE USER CIDR-ADDRESS METHOD [OPTIONS]
16
+ #
17
+ # (The uppercase items must be replaced by actual values.)
18
+ #
19
+ # The first field is the connection type: "local" is a Unix-domain
20
+ # socket, "host" is either a plain or SSL-encrypted TCP/IP socket,
21
+ # "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a
22
+ # plain TCP/IP socket.
23
+ #
24
+ # DATABASE can be "all", "sameuser", "samerole", "replication", a
25
+ # database name, or a comma-separated list thereof.
26
+ #
27
+ # USER can be "all", a user name, a group name prefixed with "+", or a
28
+ # comma-separated list thereof. In both the DATABASE and USER fields
29
+ # you can also write a file name prefixed with "@" to include names
30
+ # from a separate file.
31
+ #
32
+ # CIDR-ADDRESS specifies the set of hosts the record matches. It is
33
+ # made up of an IP address and a CIDR mask that is an integer (between
34
+ # 0 and 32 (IPv4) or 128 (IPv6) inclusive) that specifies the number
35
+ # of significant bits in the mask. Alternatively, you can write an IP
36
+ # address and netmask in separate columns to specify the set of hosts.
37
+ # Instead of a CIDR-address, you can write "samehost" to match any of
38
+ # the server's own IP addresses, or "samenet" to match any address in
39
+ # any subnet that the server is directly connected to.
40
+ #
41
+ # METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
42
+ # "krb5", "ident", "pam", "ldap", "radius" or "cert". Note that
43
+ # "password" sends passwords in clear text; "md5" is preferred since
44
+ # it sends encrypted passwords.
45
+ #
46
+ # OPTIONS are a set of options for the authentication in the format
47
+ # NAME=VALUE. The available options depend on the different
48
+ # authentication methods -- refer to the "Client Authentication"
49
+ # section in the documentation for a list of which options are
50
+ # available for which authentication methods.
51
+ #
52
+ # Database and user names containing spaces, commas, quotes and other
53
+ # special characters must be quoted. Quoting one of the keywords
54
+ # "all", "sameuser", "samerole" or "replication" makes the name lose
55
+ # its special character, and just match a database or username with
56
+ # that name.
57
+ #
58
+ # This file is read on server startup and when the postmaster receives
59
+ # a SIGHUP signal. If you edit the file on a running system, you have
60
+ # to SIGHUP the postmaster for the changes to take effect. You can
61
+ # use "pg_ctl reload" to do that.
62
+
63
+ # Put your actual configuration here
64
+ # ----------------------------------
65
+ #
66
+ # If you want to allow non-local connections, you need to add more
67
+ # "host" records. In that case you will also need to make PostgreSQL
68
+ # listen on a non-local interface via the listen_addresses
69
+ # configuration parameter, or via the -i or -h command line switches.
70
+
71
+ # CAUTION: Configuring the system for local "trust" authentication
72
+ # allows any local user to connect as any PostgreSQL user, including
73
+ # the database superuser. If you do not trust all your local users,
74
+ # use another authentication method.
75
+
76
+
77
+ # TYPE DATABASE USER CIDR-ADDRESS METHOD
78
+
79
+ # IPv4 local connections:
80
+ #host all all 127.0.0.1/32 trust
81
+ # IPv6 local connections:
82
+ #host all all ::1/128 trust
83
+
84
+
85
+ # "local" is for Unix domain socket connections only
86
+ local all postgres trust
@@ -0,0 +1,42 @@
1
+ # PostgreSQL User Name Maps
2
+ # =========================
3
+ #
4
+ # Refer to the PostgreSQL documentation, chapter "Client
5
+ # Authentication" for a complete description. A short synopsis
6
+ # follows.
7
+ #
8
+ # This file controls PostgreSQL user name mapping. It maps external
9
+ # user names to their corresponding PostgreSQL user names. Records
10
+ # are of the form:
11
+ #
12
+ # MAPNAME SYSTEM-USERNAME PG-USERNAME
13
+ #
14
+ # (The uppercase quantities must be replaced by actual values.)
15
+ #
16
+ # MAPNAME is the (otherwise freely chosen) map name that was used in
17
+ # pg_hba.conf. SYSTEM-USERNAME is the detected user name of the
18
+ # client. PG-USERNAME is the requested PostgreSQL user name. The
19
+ # existence of a record specifies that SYSTEM-USERNAME may connect as
20
+ # PG-USERNAME.
21
+ #
22
+ # If SYSTEM-USERNAME starts with a slash (/), it will be treated as a
23
+ # regular expression. Optionally this can contain a capture (a
24
+ # parenthesized subexpression). The substring matching the capture
25
+ # will be substituted for \1 (backslash-one) if present in
26
+ # PG-USERNAME.
27
+ #
28
+ # Multiple maps may be specified in this file and used by pg_hba.conf.
29
+ #
30
+ # No map names are defined in the default configuration. If all
31
+ # system user names and PostgreSQL user names are the same, you don't
32
+ # need anything in this file.
33
+ #
34
+ # This file is read on server startup and when the postmaster receives
35
+ # a SIGHUP signal. If you edit the file on a running system, you have
36
+ # to SIGHUP the postmaster for the changes to take effect. You can
37
+ # use "pg_ctl reload" to do that.
38
+
39
+ # Put your actual configuration here
40
+ # ----------------------------------
41
+
42
+ # MAPNAME SYSTEM-USERNAME PG-USERNAME
@@ -0,0 +1,62 @@
1
+ data_directory = '<%= config['data-dir'] %>'
2
+ hba_file = '<%= config['conf-dir'] %>/pg_hba.conf'
3
+ ident_file = '<%= config['conf-dir'] %>/pg_ident.conf'
4
+
5
+ listen_addresses = '*'
6
+ port = 5432
7
+ ssl = on
8
+
9
+ % if node['environment'] == 'production'
10
+ max_connections = 200
11
+ % else
12
+ max_connections = 100
13
+ % end
14
+
15
+
16
+ % if node['environment'] == 'production'
17
+ shared_buffers = 1152MB # min 128kB
18
+ work_mem = 12MB # min 64kB
19
+ maintenance_work_mem = 288MB # min 1MB
20
+ % else
21
+ shared_buffers = 24MB # min 128kB
22
+ work_mem = 16MB # min 64kB
23
+ maintenance_work_mem = 128MB # min 1MB
24
+ % end
25
+
26
+ full_page_writes = yes # make xfs usage safe
27
+
28
+ wal_level = hot_standby # minimal, archive, or hot_standby
29
+
30
+ % if node['environment'] == 'production'
31
+ wal_buffers = 8MB # min 32kB
32
+ checkpoint_segments = 16 # in logfile segments, min 1, 16MB each
33
+ checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
34
+ % else
35
+ #wal_buffers = 64kB # min 32kB
36
+ #checkpoint_segments = 3 # in logfile segments, min 1, 16MB each
37
+ #checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
38
+ % end
39
+
40
+
41
+ archive_mode = yes
42
+ archive_command = 'cp -i %p <%= config['archive-dir'] %>/%f < /dev/null'
43
+
44
+ max_wal_senders = 5
45
+ wal_keep_segments = 32
46
+ hot_standby = on
47
+
48
+ % if node['environment'] == 'production'
49
+ effective_cache_size = 3584MB
50
+ % else
51
+ #effective_cache_size = 128MB
52
+ % end
53
+
54
+ default_statistics_target = 50 # range 1-10000
55
+ constraint_exclusion = on # on, off, or partition
56
+
57
+ datestyle = 'iso, mdy'
58
+ lc_messages = 'en_US.UTF-8' # locale for system error message
59
+ lc_monetary = 'en_US.UTF-8' # locale for monetary formatting
60
+ lc_numeric = 'en_US.UTF-8' # locale for number formatting
61
+ lc_time = 'en_US.UTF-8' # locale for time formatting
62
+ default_text_search_config = 'pg_catalog.english'
@@ -0,0 +1,122 @@
1
+ # -------------------------------
2
+ # PostgreSQL recovery config file
3
+ # -------------------------------
4
+ #
5
+ # Edit this file to provide the parameters that PostgreSQL needs to
6
+ # perform an archive recovery of a database, or to act as a log-streaming
7
+ # replication standby.
8
+ #
9
+ # If "recovery.conf" is present in the PostgreSQL data directory, it is
10
+ # read on postmaster startup. After successful recovery, it is renamed
11
+ # to "recovery.done" to ensure that we do not accidentally re-enter
12
+ # archive recovery or standby mode.
13
+ #
14
+ # This file consists of lines of the form:
15
+ #
16
+ # name = 'value'
17
+ #
18
+ # (The quotes around the value are NOT optional, but the "=" is.)
19
+ #
20
+ # Comments are introduced with '#'.
21
+ #
22
+ # The complete list of option names and allowed values can be found
23
+ # in the PostgreSQL documentation.
24
+ #
25
+ #---------------------------------------------------------------------------
26
+ # ARCHIVE RECOVERY PARAMETERS
27
+ #---------------------------------------------------------------------------
28
+ #
29
+ # restore_command
30
+ #
31
+ # specifies the shell command that is executed to copy log files
32
+ # back from archival storage. The command string may contain %f,
33
+ # which is replaced by the name of the desired log file, and %p,
34
+ # which is replaced by the absolute path to copy the log file to.
35
+ #
36
+ # This parameter is *required* for an archive recovery, but optional
37
+ # for streaming replication.
38
+ #
39
+ # It is important that the command return nonzero exit status on failure.
40
+ # The command *will* be asked for log files that are not present in the
41
+ # archive; it must return nonzero when so asked.
42
+ #
43
+ # NOTE that the basename of %p will be different from %f; do not
44
+ # expect them to be interchangeable.
45
+ #
46
+ restore_command = 'cp -i <%= config['archive-dir'] %>/%f %p < /dev/null'
47
+ #
48
+ #
49
+ # archive_cleanup_command
50
+ #
51
+ # specifies an optional shell command to execute at every restartpoint.
52
+ # This can be useful for cleaning up the archive of a standby server.
53
+ #
54
+ #archive_cleanup_command = ''
55
+ #
56
+ # recovery_end_command
57
+ #
58
+ # specifies an optional shell command to execute at completion of recovery.
59
+ # This can be useful for cleaning up after the restore_command.
60
+ #
61
+ #recovery_end_command = ''
62
+ #
63
+ #---------------------------------------------------------------------------
64
+ # RECOVERY TARGET PARAMETERS
65
+ #---------------------------------------------------------------------------
66
+ #
67
+ # By default, recovery will rollforward to the end of the WAL log.
68
+ # If you want to stop rollforward at a specific point, you
69
+ # must set a recovery target.
70
+ #
71
+ # You may set a recovery target either by transactionId, or
72
+ # by timestamp. Recovery may either include or exclude the
73
+ # transaction(s) with the recovery target value (ie, stop either
74
+ # just after or just before the given target, respectively).
75
+ #
76
+ #recovery_target_time = '2011-07-25 14:10:00 CEST' # e.g. '2004-07-14 22:39:00 EST'
77
+ #
78
+ #recovery_target_xid = ''
79
+ #
80
+ #recovery_target_inclusive = 'true'
81
+ #
82
+ #
83
+ # If you want to recover into a timeline other than the "main line" shown in
84
+ # pg_control, specify the timeline number here, or write 'latest' to get
85
+ # the latest branch for which there's a history file.
86
+ #
87
+ #recovery_target_timeline = 'latest'
88
+ #
89
+ #---------------------------------------------------------------------------
90
+ # STANDBY SERVER PARAMETERS
91
+ #---------------------------------------------------------------------------
92
+ #
93
+ # When standby_mode is enabled, the PostgreSQL server will work as
94
+ # a standby. It tries to connect to the primary according to the
95
+ # connection settings primary_conninfo, and receives XLOG records
96
+ # continuously.
97
+ #
98
+ standby_mode = 'on'
99
+ #
100
+ % if node['environment'] == 'production'
101
+ primary_conninfo = '<your pg connection string here>'
102
+ % elsif node['environment'] == 'staging'
103
+ primary_conninfo = '<your pg connection string here>'
104
+ % end
105
+
106
+ #
107
+ #
108
+ # By default, a standby server keeps streaming XLOG records from the
109
+ # primary indefinitely. If you want to stop streaming and finish recovery,
110
+ # opening up the system in read/write mode, specify path to a trigger file.
111
+ # Server will poll the trigger file path periodically and stop streaming
112
+ # when it's found.
113
+ #
114
+ trigger_file = '/var/lib/postgresql/<%= config['version'] %>/master_trigger'
115
+ #
116
+ #---------------------------------------------------------------------------
117
+ # HOT STANDBY PARAMETERS
118
+ #---------------------------------------------------------------------------
119
+ #
120
+ # Hot Standby related parameters are listed in postgresql.conf
121
+ #
122
+ #---------------------------------------------------------------------------
@@ -0,0 +1,13 @@
1
+ user1:
2
+ name: Some User
3
+ email: some.user@gmail.com
4
+ keys:
5
+ - ssh-rsa AAAA....
6
+
7
+
8
+ user2:
9
+ email: otheruser@otherdomain.org
10
+ keys:
11
+ - ssh-rsa AAAA
12
+ - ssh-rsa AAAA
13
+
@@ -0,0 +1,129 @@
1
+ # This is config file for zabbix_agentd
2
+ # in case the agent is started standalone from init.d (not via inetd).
3
+ #
4
+ # To get more information about ZABBIX, go http://www.zabbix.com
5
+
6
+ ############ GENERAL PARAMETERS #################
7
+
8
+ # List of comma delimited IP addresses (or hostnames) of ZABBIX servers.
9
+ # No spaces allowed. First entry is used for sending active checks.
10
+ # Note that hostnames must resolve hostname->IP address and
11
+ # IP address->hostname.
12
+
13
+ Server=zabbix.<%= node['domain'] %>
14
+
15
+ # Server port for sending active checks
16
+
17
+ #ServerPort=10051
18
+
19
+ # Unique hostname. Required for active checks.
20
+
21
+ Hostname=<%= node['fqdn'] %>
22
+
23
+ # Listen port. Default is 10050
24
+
25
+ #ListenPort=10050
26
+
27
+ # IP address to bind agent
28
+ # If missing, bind to all available IPs
29
+
30
+ #ListenIP=127.0.0.1
31
+
32
+ # Number of pre-forked instances of zabbix_agentd.
33
+ # Default value is 5
34
+ # This parameter must be between 1 and 16
35
+
36
+ StartAgents=5
37
+
38
+ # How often refresh list of active checks. 2 minutes by default.
39
+
40
+ #RefreshActiveChecks=120
41
+
42
+ # Disable active checks. The agent will work in passive mode listening server.
43
+
44
+ #DisableActive=1
45
+
46
+ # Enable remote commands for ZABBIX agent. By default remote commands disabled.
47
+
48
+ #EnableRemoteCommands=1
49
+
50
+ # Specifies debug level
51
+ # 0 - debug is not created
52
+ # 1 - critical information
53
+ # 2 - error information
54
+ # 3 - warnings
55
+ # 4 - information (default)
56
+ # 5 - for debugging (produces lots of information)
57
+
58
+ DebugLevel=3
59
+
60
+ # Name of PID file
61
+
62
+ % if node.uses_apt? true
63
+ PidFile=/var/run/zabbix-agent/zabbix_agentd.pid
64
+ % elsif node.uses_emerge? true
65
+ PidFile=/var/run/zabbix/zabbix_agentd.pid
66
+ % elsif node.uses_rpm? true
67
+ PidFile=/var/run/zabbix/zabbix_agentd.pid
68
+ % end
69
+
70
+ # Name of log file.
71
+ # If not set, syslog will be used
72
+
73
+ % if node.uses_apt? true
74
+ LogFile=/var/log/zabbix-agent/zabbix_agentd.log
75
+ % elsif node.uses_emerge? true
76
+ LogFile=/var/log/zabbix/zabbix_agentd.log
77
+ % elsif node.uses_emerge? true
78
+ LogFile=/var/log/zabbix/zabbix_agentd.log
79
+ % end
80
+
81
+ # Maximum size of log file in MB. Set to 0 to disable automatic log rotation.
82
+ #LogFileSize=1
83
+
84
+ # Spend no more than Timeout seconds on processing
85
+ # Must be between 1 and 30
86
+
87
+ Timeout=30
88
+
89
+ ####### USER-DEFINED MONITORED PARAMETERS #######
90
+ # Format: UserParameter=<key>,<shell command>
91
+ # Note that shell command must not return empty string or EOL only
92
+
93
+ # system updates
94
+ % if node.uses_apt? true
95
+ UserParameter=debian.updates,aptitude search '~U' |wc -l
96
+ UserParameter=debian.security,debsecan --suite squeeze --only-fixed --format packages |wc -l
97
+
98
+ % elsif node.uses_emerge? true
99
+ UserParameter=gentoo.security,glsa-check -t all 2>/dev/null | wc -l
100
+ UserParameter=gentoo.updates,emerge -uNDp @world | grep ebuild|wc -l
101
+ UserParameter=gentoo.portage,emerge --info| grep 'Timestamp of tree' | sed -e s/'Timestamp of tree':// -e 's/\n//' | xargs -I {} date --date={} +%s |xargs -I {} expr $(date +%s) - {}
102
+ UserParameter=gentoo.config,find /etc/ -name '._cfg*' 2>/dev/null|wc -l
103
+
104
+ % elsif node.uses_rpm? true
105
+ UserParameter=centos.updates,yum check-update -q |wc -l
106
+ % end
107
+
108
+ % if node.package_installed?( [ 'postgresql-server', 'postgresql' ], true )
109
+ # postgres
110
+ UserParameter=psql.version,psql --version|head -n1
111
+ UserParameter=psql.server_processes,psql -U zabbix -t -c "select sum(numbackends) from pg_stat_database" postgres
112
+ UserParameter=psql.db_connections,psql -U zabbix -t -c "select count(*) from pg_stat_activity" postgres
113
+ UserParameter=psql.db_fetched,psql -U zabbix -t -c "select sum(tup_fetched) from pg_stat_database" postgres
114
+ UserParameter=psql.db_deleted,psql -U zabbix -t -c "select sum(tup_deleted) from pg_stat_database" postgres
115
+ UserParameter=psql.db_inserted,psql -U zabbix -t -c "select sum(tup_inserted) from pg_stat_database" postgres
116
+ UserParameter=psql.db_returned,psql -U zabbix -t -c "select sum(tup_returned) from pg_stat_database" postgres
117
+ UserParameter=psql.db_updated,psql -U zabbix -t -c "select sum(tup_updated) from pg_stat_database" postgres
118
+ UserParameter=psql.tx_commited,psql -U zabbix -t -c "select sum(xact_commit) from pg_stat_database" postgres
119
+ UserParameter=psql.tx_rolledback,psql -U zabbix -t -c "select sum(xact_rollback) from pg_stat_database" postgres
120
+ UserParameter=psql.blks_hit,psql -U zabbix -t -c "select sum(blks_hit) from pg_stat_database" postgres
121
+ UserParameter=psql.blks_read,psql -U zabbix -t -c "select sum(blks_read) from pg_stat_database" postgres
122
+ % end
123
+
124
+ % if node.package_installed?('arcconf', true)
125
+ # adaptec raid
126
+ UserParameter=raid.smart_warnings,/sbin/arcconf getconfig 1 pd |grep "S.M.A.R.T. warnings" | awk '{SMART += $4} END {print SMART}'
127
+ UserParameter=raid.disk_rpm,/sbin/arcconf getconfig 1 pd |grep "Power State" |grep -v "Full rpm" |wc -l
128
+ UserParameter=raid.disk_state,/sbin/arcconf getconfig 1 pd |grep "\s\sState" |grep -v "Online" |wc -l
129
+ % end
data/lib/dust/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dust
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 3
9
+ version: 0.1.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - kris kechagia
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-12-19 00:00:00 +01:00
17
+ date: 2011-12-20 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -77,6 +77,7 @@ extra_rdoc_files: []
77
77
  files:
78
78
  - .gitignore
79
79
  - Gemfile
80
+ - LICENSE
80
81
  - README.md
81
82
  - Rakefile
82
83
  - bin/dust
@@ -85,7 +86,29 @@ files:
85
86
  - lib/dust/convert_size.rb
86
87
  - lib/dust/examples/nodes/_debian.yaml
87
88
  - lib/dust/examples/nodes/_default.yaml
89
+ - lib/dust/examples/nodes/_newrelic.yaml
90
+ - lib/dust/examples/nodes/db-staging.yaml
91
+ - lib/dust/examples/nodes/home.yaml
92
+ - lib/dust/examples/nodes/mail.yaml
88
93
  - lib/dust/examples/nodes/myhost.yaml
94
+ - lib/dust/examples/nodes/mysql-production.yaml
95
+ - lib/dust/examples/nodes/proxy-staging.yaml
96
+ - lib/dust/examples/templates/aliases/aliases
97
+ - lib/dust/examples/templates/basic_setup/.your-inputrc
98
+ - lib/dust/examples/templates/basic_setup/.your-vimrc
99
+ - lib/dust/examples/templates/duplicity/cronjob.erb
100
+ - lib/dust/examples/templates/etc_hosts/hosts
101
+ - lib/dust/examples/templates/motd/motd.erb
102
+ - lib/dust/examples/templates/nginx/nginx.conf
103
+ - lib/dust/examples/templates/nginx/sites/othersite.erb
104
+ - lib/dust/examples/templates/nginx/sites/somesite.erb
105
+ - lib/dust/examples/templates/postgres/pacemaker.sh.erb
106
+ - lib/dust/examples/templates/postgres/pg_hba.conf.erb
107
+ - lib/dust/examples/templates/postgres/pg_ident.conf
108
+ - lib/dust/examples/templates/postgres/postgresql.conf.erb
109
+ - lib/dust/examples/templates/postgres/recovery.conf.erb
110
+ - lib/dust/examples/templates/ssh_authorized_keys/users.yaml
111
+ - lib/dust/examples/templates/zabbix_agent/zabbix_agentd.conf.erb
89
112
  - lib/dust/print_status.rb
90
113
  - lib/dust/recipes/aliases.rb
91
114
  - lib/dust/recipes/basic_setup.rb