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
|
# File 'lib/opsworks/commands/ssh.rb', line 15
def self.run
options = Trollop::options do
banner " \#{SSH.banner}\n\n Options:\n EOS\n opt :update, \"Update ~/.ssh/config directly\"\n opt :backup, \"Backup old SSH config before updating\"\n opt :quiet, \"Use SSH LogLevel quiet\", default: true\n opt :key_checking,\n \"Check SSH host keys (this can be annoying since dynamic \" <<\n \"instances often change IP number)\", short: 'c', default: false\n end\n\n config = OpsWorks.config\n\n client = AWS::OpsWorks::Client.new\n\n instances = []\n\n stack_ids = if config.stacks.empty?\n stacks = client.describe_stacks[:stacks]\n stacks.map{|s| s[:stack_id]}\n else\n config.stacks\n end\n\n stack_ids.each do |stack_id|\n result = client.describe_instances(stack_id: stack_id)\n instances += result.instances.select { |i| i[:status] != \"stopped\" }\n end\n\n instances.reject! { |i| i[:elastic_ip].nil? && i[:public_ip].nil? }\n instances.map! do |instance|\n ip = instance[:elastic_ip] || instance[:public_ip]\n parameters = {\n \"Host\" => \"\#{instance[:hostname]} \#{ip}\",\n \"HostName\" => ip,\n \"User\" => config.ssh_user_name,\n }\n parameters.merge!({\n \"StrictHostKeyChecking\" => \"no\",\n \"UserKnownHostsFile\" => \"/dev/null\",\n }) unless options[:host_checking]\n parameters[\"LogLevel\"] = \"quiet\" if options[:quiet]\n parameters.map{ |param| param.join(\" \") }.join(\"\\n \")\n end\n\n new_contents = \"\\n\\n\#{SSH_PREFIX}\\n\" <<\n \"\#{instances.join(\"\\n\")}\\n\" <<\n \"\#{SSH_POSTFIX}\\n\\n\"\n\n if options[:update]\n ssh_config = \"\#{ENV['HOME']}/.ssh/config\"\n old_contents = File.read(ssh_config)\n\n if options[:backup]\n base_name = ssh_config + \".backup\"\n if File.exists? base_name\n number = 0\n file_name = \"\#{base_name}-\#{number}\"\n while File.exists? file_name\n file_name = \"\#{base_name}-\#{number += 1}\"\n end\n else\n file_name = base_name\n end\n File.open(file_name, \"w\") { |file| file.puts old_contents }\n end\n\n File.open(ssh_config, \"w\") do |file|\n file.puts old_contents.gsub(\n /\\n?\\n?\#{SSH_PREFIX}.*\#{SSH_POSTFIX}\\n?\\n?/m,\n ''\n )\n file.puts new_contents\n end\n\n puts \"Successfully updated \#{ssh_config} with \" <<\n \"\#{instances.length} instances!\"\n else\n puts new_contents.strip\n end\nend\n".unindent
|