Hi allen,
Momenteel ben ik bezig met het bouwen van een script t.b.v. switch fault tolerance binnen OSX server. Mogelijk zou dit topic ook onder PNS/ASD kunnen vallen, echter betreft het een non-windows OS, dus probeer ik het eerst hier.
Binnen ons bedrijf hebben wij een tweetal OSX servers welke indesign documenten genereren. Deze servers zijn verbonden met een tweetal switches (Dell Powerconnect 6248's). Binnen OSX heb je helaas enkel de mogelijkheid om de twee aanwezige ethernet adapters in een LAG (bond) te zetten, laat het nu zo zijn dat een LAG verdeeld over 2 switches niet mogelijk is.
In mijn zoektocht naar een oplossing om ethernet failover te realiseren ben ik het volgende artikel tegen gekomen. Helaas betreft dit een oude oplossing, welke in OSX 10.6.4 niet meer werkt. Nu komen we dus uit op een scripte oplossing. De volgende oplossing heb ik geschreven, echter zitten er nog een aantal haken en ogen aan:
- Fout gevoelig.
- Scripting niet de voorkeur voor kritische handelingen.
- Geen output buiten de server (oplosbaar).
- Elif regex op packet loss is erg kort door de bocht.
- Wat te doen bij twee inactive adapters.
Het betreft het volgende script:
Graag hoor ik van jullie welke suggesties er nog zijn. Ook vraag ik me af hoe jullie over een bepaald scenario denken. De werking van het script is als volgt (globaal):
- Check via ifconfig / grep welke adapter actief is.
- Bepaal a.d.h.v. de output welke adapter standby is.
- Ping de gateway van de actieve adapter 10 keer.
- Grep op de output, onderneem actie indien nodig.
- Indien de output niet begrepen wordt, doe niets.
Opzich werk het script naar behoren, indien er een link is, maar geen verkeer mogelijk, wordt de tweede adapter actief gemaakt. In de volgende loop zal deze gechecked worden.
Wanneer er echter geen link meer is (switch geheel dood / uit), worden beide adapters op inactive gezet door OSX, hierdoor kan de actieve adapter niet bepaald worden. Dit wordt afgevangen en gelogd in het script (eerste 2 if's), echter vraag ik mij af wat voor een actie ik hierop het beste kan ondernemen.
Het is in dit stadium voor het script niet meer mogelijk te bepalen welke adapter actief is / was, en zodoende weet het script niet welke adapter hierna geactiveerd moet worden. Hoe zouden jullie dit aanpakken? Ik kan simpelweg de eerste adapter actief maken / test / ok = niets doen, indien niet ok tweede adapter zelfde riedeltje, is echter imho niet de mooiste oplossing.
Wie heeft er hier nog ideeen / suggesties / opmerkingen? Alles is welkom!
Momenteel ben ik bezig met het bouwen van een script t.b.v. switch fault tolerance binnen OSX server. Mogelijk zou dit topic ook onder PNS/ASD kunnen vallen, echter betreft het een non-windows OS, dus probeer ik het eerst hier.
Binnen ons bedrijf hebben wij een tweetal OSX servers welke indesign documenten genereren. Deze servers zijn verbonden met een tweetal switches (Dell Powerconnect 6248's). Binnen OSX heb je helaas enkel de mogelijkheid om de twee aanwezige ethernet adapters in een LAG (bond) te zetten, laat het nu zo zijn dat een LAG verdeeld over 2 switches niet mogelijk is.
In mijn zoektocht naar een oplossing om ethernet failover te realiseren ben ik het volgende artikel tegen gekomen. Helaas betreft dit een oude oplossing, welke in OSX 10.6.4 niet meer werkt. Nu komen we dus uit op een scripte oplossing. De volgende oplossing heb ik geschreven, echter zitten er nog een aantal haken en ogen aan:
- Fout gevoelig.
- Scripting niet de voorkeur voor kritische handelingen.
- Geen output buiten de server (oplosbaar).
- Elif regex op packet loss is erg kort door de bocht.
- Wat te doen bij twee inactive adapters.
Het betreft het volgende script:
code:
1
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
| #!/bin/bash ############################################################################################################## # # Declare server settings # SERVER_NAME=$HOSTNAME SERVER_IP="192.168.1.171" SERVER_MASK="255.255.255.0" SERVER_GW="192.168.1.254" SERVER_DNS="192.168.0.31 192.168.0.32 192.168.0.33" SERVER_SD="domain.local" # ############################################################################################################## # Start /usr/bin/logger "$SERVER_NAME: NicFailover: Start. `/bin/date`." # Get active adapter ACTIVE_ETH=`/sbin/ifconfig -a | grep -B 2 -A 2 "inet $SERVER_IP" | grep -o -w en[[:digit:]] | cut -c 1-3` # Set standby adapter if [ "$ACTIVE_ETH" = "en0" ]; then STANDBY_ETH="en1" elif [ "$ACTIVE_ETH" = "en1" ]; then STANDBY_ETH="en0" else ACTIVE_ETH="error" STANDBY_ETH="error" # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: No active adapter was found. `/bin/date`." fi # Set OS adapter names if [ "$ACTIVE_ETH" = "en0" ]; then ACTIVE_ETHNAME="Ethernet 1" STANDBY_ETHNAME="Ethernet 2" elif [ "$ACTIVE_ETH" = "en1" ]; then ACTIVE_ETHNAME="Ethernet 2" STANDBY_ETHNAME="Ethernet 1" else ACTIVE_ETHNAME="error" STANDBY_ETHNAME="error" # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: OS adapter names cannot be determined. `/bin/date`." fi if [ "$ACTIVE_ETH" != "error" ] or [ "$ACTIVE_ETHNAME" != "error" ]; then # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: Current active adapter is $ACTIVE_ETHNAME ($ACTIVE_ETH), standby adapter is $STANDBY_ETHNAME ($STANDBY_ETH). `/bin/date`." # Check network connectivity /usr/bin/logger "$SERVER_NAME: NicFailover: Testing current active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) against $SERVER_GW. `/bin/date`." TEST_COMMAND=`ping -c 10 $SERVER_GW | grep '0.0% packet loss' | cut -c 46-61` # Process results if [ "$TEST_COMMAND" = "0.0% packet loss" ]; then # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: Active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is fully functional ($TEST_COMMAND). Nothing to do. `/bin/date`." # End /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`." exit 0 elif [[ "$TEST_COMMAND" =~ [1-9] ]]; then # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: Active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) detected packet loss ($TEST_COMMAND). Switching to standby adapter $STANDBY_ETHNAME ($STANDBY_ETH). `/bin/date`." # Disable current active adapter /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$ACTIVE_ETHNAME\" off. `/bin/date`." /usr/sbin/networksetup -setnetworkserviceenabled "$ACTIVE_ETHNAME" off # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: Former active adapter $ACTIVE_ETHNAME ($ACTIVE_ETH) is now disabled and inactive. `/bin/date`" # Enable current standby adapter /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setnetworkserviceenabled \"$STANDBY_ETHNAME\" on. `/bin/date`." /usr/sbin/networksetup -setnetworkserviceenabled "$STANDBY_ETHNAME" on sleep 3 # Set IP address /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setmanual \"$STANDBY_ETHNAME\" $SERVER_IP $SERVER_MASK $SERVER_GW. `/bin/date`." /usr/sbin/networksetup -setmanual "$STANDBY_ETHNAME" $SERVER_IP $SERVER_MASK $SERVER_GW # Set DNS servers /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setdnsservers \"$STANDBY_ETHNAME\" $SERVER_DNS. `/bin/date`." /usr/sbin/networksetup -setdnsservers "$STANDBY_ETHNAME" $SERVER_DNS # Set search domains /usr/bin/logger "$SERVER_NAME: NicFailover: Executing: networksetup -setsearchdomains \"$STANDBY_ETHNAME\" $SERVER_SD. `/bin/date`." /usr/sbin/networksetup -setsearchdomains "$STANDBY_ETHNAME" $SERVER_SD # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: Former standby adapter $STANDBY_ETHNAME ($STANDBY_ETH) is now enabled and active. `/bin/date`" # End /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`." exit 0 else # Something is wrong, check the output of the different grep commands # Results from ping / grep where not "0.0% packet loss" and did not contain any numbers # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: Unable to determine networking state. Check TEST_COMMAND output. `/bin/date`." # End /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`." exit 1 fi else # Something is wrong, check the output of the different grep commands # Results from ifconfig / grep where not an adapter name # Log results /usr/bin/logger "$SERVER_NAME: NicFailover: ERROR: Unable to determine adapter state. Check ACTIVE_ETH output. `/bin/date`." # End /usr/bin/logger "$SERVER_NAME: NicFailover: End. `/bin/date`." exit 1 fi |
Graag hoor ik van jullie welke suggesties er nog zijn. Ook vraag ik me af hoe jullie over een bepaald scenario denken. De werking van het script is als volgt (globaal):
- Check via ifconfig / grep welke adapter actief is.
- Bepaal a.d.h.v. de output welke adapter standby is.
- Ping de gateway van de actieve adapter 10 keer.
- Grep op de output, onderneem actie indien nodig.
- Indien de output niet begrepen wordt, doe niets.
Opzich werk het script naar behoren, indien er een link is, maar geen verkeer mogelijk, wordt de tweede adapter actief gemaakt. In de volgende loop zal deze gechecked worden.
Wanneer er echter geen link meer is (switch geheel dood / uit), worden beide adapters op inactive gezet door OSX, hierdoor kan de actieve adapter niet bepaald worden. Dit wordt afgevangen en gelogd in het script (eerste 2 if's), echter vraag ik mij af wat voor een actie ik hierop het beste kan ondernemen.
Het is in dit stadium voor het script niet meer mogelijk te bepalen welke adapter actief is / was, en zodoende weet het script niet welke adapter hierna geactiveerd moet worden. Hoe zouden jullie dit aanpakken? Ik kan simpelweg de eerste adapter actief maken / test / ok = niets doen, indien niet ok tweede adapter zelfde riedeltje, is echter imho niet de mooiste oplossing.
Wie heeft er hier nog ideeen / suggesties / opmerkingen? Alles is welkom!
[ Voor 3% gewijzigd door wasted247 op 10-08-2010 20:34 ]