create_vlan.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #!/usr/bin/env bash
  2. #
  3. # Copyright (c) 2017-2018 Joe Clarke <jclarke@cisco.com>
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions
  8. # are met:
  9. # 1. Redistributions of source code must retain the above copyright
  10. # notice, this list of conditions and the following disclaimer.
  11. # 2. Redistributions in binary form must reproduce the above copyright
  12. # notice, this list of conditions and the following disclaimer in the
  13. # documentation and/or other materials provided with the distribution.
  14. #
  15. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  16. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  19. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. # SUCH DAMAGE.
  26. function usage() {
  27. echo "$0: [-d] -v <VLAN_ID> -n <VLAN_NAME> [-t <TRUNK_PORT1[,TRUNK_PORT2[,...]]] [-s [-D <SVI_DESCRIPTION>] -4 <SVI_IPV4_3_OCTETS> -m <SVI_IPV4_CIDR> [-6 <SVI_IPV6_8_WORDS> -M <SVI_IPV6_LEN>] [-r <HSRP_IPV4_VIRTUAL_IP] [-R <HSRP_IPV6_VIRTUAL_IP]]"
  28. exit 1
  29. }
  30. . ./dc.cfg
  31. export PERL_LWP_SSL_VERIFY_HOSTNAME=0
  32. delete_vlan=0
  33. vid=-1
  34. vname=""
  35. svi=0
  36. svi_descr=""
  37. ipv4=""
  38. cidr=""
  39. ipv6=""
  40. plen=""
  41. hsrpv4=""
  42. hsrpv6=""
  43. trunks=""
  44. while getopts ":v:n:s4:6:m:M:dD:r:R:t:" opt; do
  45. case $opt in
  46. d)
  47. delete_vlan=1
  48. ;;
  49. v)
  50. vid=$OPTARG
  51. ;;
  52. n)
  53. vname=$OPTARG
  54. ;;
  55. s)
  56. svi=1
  57. ;;
  58. D)
  59. svi_descr=$OPTARG
  60. ;;
  61. 4)
  62. ipv4=$OPTARG
  63. ;;
  64. m)
  65. cidr=$OPTARG
  66. ;;
  67. 6)
  68. ipv6=$OPTARG
  69. ;;
  70. M)
  71. plen=$OPTARG
  72. ;;
  73. r)
  74. hsrpv4=$OPTARG
  75. ;;
  76. R)
  77. hsrpv6=$OPTARG
  78. ;;
  79. t)
  80. trunks=$OPTARG
  81. ;;
  82. :)
  83. echo "Option -${OPTARG} requires an argument"
  84. usage
  85. ;;
  86. \?)
  87. echo "Invalid option, -${OPTARG}"
  88. usage
  89. ;;
  90. esac
  91. done
  92. if [ ${vid} = "-1" ]; then
  93. echo "Error: VLAN ID is required"
  94. usage
  95. fi
  96. if [ -z "${vname}" ]; then
  97. echo "Error: VLAN name is required"
  98. usage
  99. fi
  100. if [ ${svi} -eq 1 -a ${delete_vlan} -eq 0 ]; then
  101. if [ -z "${ipv4}" ]; then
  102. echo "Error: SVI IPv4 address is required"
  103. usage
  104. fi
  105. if [ -z "${cidr}" ]; then
  106. echo "Error: SVI IPv4 CIDR bits are required"
  107. usage
  108. fi
  109. if [ -n "${ipv6}" -a -z "${plen}" ]; then
  110. echo "Error: IPv6 prefix length is required with IPv6 address"
  111. usage
  112. fi
  113. if [ -n "${hsrpv6}" -a -z "${ipv6}" ]; then
  114. echo "Error: IPv6 address is required if an HSRP IPv6 address is provided"
  115. usage
  116. fi
  117. fi
  118. if [ ${delete_vlan} = 1 ]; then
  119. echo -n "Are you sure you want to delete VLAN ${vid} (${vname}): [y/N]? "
  120. read resp
  121. if echo ${resp} | grep -qvE '^[Yy]'; then
  122. exit 0
  123. fi
  124. fi
  125. if [ -z "${VI_USERNAME}" ]; then
  126. VI_USERNAME=${ADMIN_USERNAME}
  127. fi
  128. export VI_USERNAME
  129. if [ -z "${ADMIN_PASSWORD}" ]; then
  130. echo "Error: Environment variable ADMIN_PASSWORD must be set to the password for ${ADMIN_USERNAME}"
  131. exit 1
  132. fi
  133. if [ -z "${NXOS_ADMIN_PW}" ]; then
  134. NXOS_ADMIN_PW=${ADMIN_PASSWORD}
  135. fi
  136. export NXOS_ADMIN_PW
  137. if [ -z "${UCS_ADMIN_PW}" ]; then
  138. UCS_ADMIN_PW=${ADMIN_PASSWORD}
  139. fi
  140. export UCS_ADMIN_PW
  141. for sw in ${SWITCHES}; do
  142. old_IFS=${IFS}
  143. IFS=","
  144. sw_parts=(${sw})
  145. hn=${sw_parts[0]}
  146. pri=${sw_parts[1]}
  147. v4=${sw_parts[2]}
  148. v6=${sw_parts[3]}
  149. #echo "${hn} : ${pri} : ${v4} : ${v6}"
  150. IFS=${old_IFS}
  151. if [ ${delete_vlan} -eq 1 ]; then
  152. echo -n "Deleting VLAN ${vid} from switch ${hn}..."
  153. nxos_add_delete_vlan.py -D -v ${vid} -d ${hn} -u ${ADMIN_USERNAME}
  154. if [ $? = 0 ]; then
  155. echo "DONE."
  156. else
  157. echo "ERROR."
  158. fi
  159. else
  160. args="-v ${vid} -n ${vname} -d ${hn} -u ${ADMIN_USERNAME}"
  161. if [ -n "${trunks}" ]; then
  162. old_IFS=${IFS}
  163. IFS=","
  164. args="${args} -t"
  165. for trunk in ${trunks}; do
  166. args="${args} ${trunk}"
  167. done
  168. IFS=${old_IFS}
  169. fi
  170. if [ ${svi} -eq 1 ]; then
  171. args="${args} -s -4 ${ipv4}.${v4}/${cidr}"
  172. if [ -n "${svi_descr}" ]; then
  173. args="${args} -e '${svi_descr}'"
  174. fi
  175. if [ -n "${ipv6}" ]; then
  176. args="${args} -6 ${ipv6}::${v6}/${plen}"
  177. fi
  178. if [ -n "${hsrpv4}" ]; then
  179. args="${args} -p ${pri} -r ${hsrpv4}"
  180. fi
  181. if [ -n "${hsrpv6}" ]; then
  182. args="${args} -R ${hsrpv6}"
  183. fi
  184. fi
  185. echo -n "Adding VLAN ${vid} to switch ${hn}..."
  186. nxos_add_delete_vlan.py ${args}
  187. if [ $? = 0 ]; then
  188. echo "DONE."
  189. else
  190. echo "ERROR."
  191. fi
  192. fi
  193. done
  194. for ucs in ${UCSES}; do
  195. old_IFS=${IFS}
  196. IFS=","
  197. ucs_parts=(${ucs})
  198. hn=${ucs_parts[0]}
  199. vnica=${ucs_parts[1]}
  200. vnicb=${ucs_parts[2]}
  201. policy=${ucs_parts[3]}
  202. #echo "${hn} : ${vnica} : ${vnicb} : ${policy}"
  203. IFS=${old_IFS}
  204. if [ ${delete_vlan} = 1 ]; then
  205. echo -n "Deleting VLAN ${vid} from UCS ${hn}..."
  206. ucs_add_delete_vlan.py -D -v ${vid} -d ${hn} -u ${ADMIN_USERNAME}
  207. if [ $? = 0 ]; then
  208. echo "DONE."
  209. else
  210. echo "ERROR."
  211. fi
  212. else
  213. args="-v ${vid} -n ${vname} -d ${hn} -u ${ADMIN_USERNAME} -p ${policy} -a ${vnica} -b ${vnicb}"
  214. echo -n "Adding VLAN ${vid} to UCS ${hn}..."
  215. ucs_add_delete_vlan.py ${args}
  216. if [ $? = 0 ]; then
  217. echo "DONE."
  218. else
  219. echo "ERROR."
  220. fi
  221. fi
  222. done
  223. for host in ${VMHOSTS}; do
  224. old_IFS=${IFS}
  225. IFS=","
  226. host_parts=(${host})
  227. hn=${host_parts[0]}
  228. vsw=${host_parts[1]}
  229. #echo "${hn} : ${vsw}"
  230. IFS=${old_IFS}
  231. if [ ${delete_vlan} = 1 ]; then
  232. echo -n "Deleting VLAN ${vid} from VM host ${hn}..."
  233. vicfg-vswitch --server ${VCENTER} --vihost ${hn} --username ${ADMIN_USERNAME} -D ${vname} ${vsw}
  234. if [ $? = 0 ]; then
  235. echo "DONE."
  236. else
  237. echo "ERROR."
  238. fi
  239. else
  240. echo -n "Adding VLAN ${vid} to VM host ${hn}..."
  241. vicfg-vswitch --server ${VCENTER} --vihost ${hn} --username ${ADMIN_USERNAME} -A ${vname} ${vsw}
  242. if [ $? = 0 ]; then
  243. vicfg-vswitch --server ${VCENTER} --vihost ${hn} --username ${ADMIN_USERNAME} -v ${vid} -p ${vname} ${vsw}
  244. if [ $? = 0 ]; then
  245. echo "DONE."
  246. else
  247. echo "ERROR."
  248. fi
  249. else
  250. echo "ERROR."
  251. fi
  252. fi
  253. done