2017年7月7日金曜日

Excel VBAでネットワーク機器のConfigをテキストに出力する

こちらの記事でExcelを使用した効率化を紹介しました。

Excelの計算式でConfigが作成できるなら、
テキスト化も同時にできた方が効率的です。

今回はVBAというプログラミング技術が含まれますが、
テキスト化をするだけなので細かい知識は不要です。
※ボタンの設置方法やコードの貼り付け箇所も解説しています。

ただ、VBAを習得すると非常に便利ですので、
個人的には下記の書籍を手に取ることをお勧めします。


自動計算欄や途中計算欄、「Main」「Sub」シートを、
事前に作成済みであることを前提としますが、
下記、「DATA」シートの黄色枠を入力して、
「Config出力」ボタンのクリックによるテキスト化を紹介します。











正系のConfigが表示される「Main」シートはこのような状態です。
B列にConfig、出力するファイル名がC1セルに表示することに留意してください。











副系のConfigが表示される「Sub」シートはこのような状態です。











ボタンの設置とマクロの登録を行います。
VBAを利用するため、Excelオプションから「開発」タブを表示します。



















「開発」タブから「コードの表示」を選択します。







 
VBAProjectを右クリックし、「挿入」→「標準モジュール」を選択します。


















下記のVBAコードをコピーしてください。

 Sub OutputTextWithoutBlanks()

    Dim fileNum As Integer
    Dim txtLine As String
    Dim myRow As Long
    Dim endRow As Long
  
    'ファイル名の取得
    confFileName = "\" & Range("C1")
              
    '最終行の取得
    endRow = Range("B65536").End(xlUp).Row
  
    'FreeFile値を利用してファイル番号の重複を防ぐ
    fileNum = FreeFile
  
    'ファイルを上書きモードで開く
    Open ThisWorkbook.Path & confFileName For Output As #fileNum
  
    '1行目から開始
    myRow = 1
    '最終行まで繰り返す
    Do Until myRow > endRow
        'B列内容をレコードにセット
        txtLine = Cells(myRow, 2).Value
      
        '空白じゃなかった場合だけ
        If txtLine <> "" Then
            'テキストに書き出し
            Print #fileNum, txtLine
        End If
        '行を加算
        myRow = myRow + 1
    Loop
    'ファイルを閉じる
    Close #infFF
End Sub

Sub SheetProtect()
    ActiveSheet.Protect Password:="administrator"
End Sub

Sub SheetUnprotect()
    ActiveSheet.Unprotect Password:="administrator"
End Sub

Sub CreateTextMain()
    Sheets("Main").Activate
End Sub

Sub CreateTextSub()
    Sheets("Sub").Activate
End Sub

Sub SaveBook()
    ActiveWorkbook.Save
End Sub

Sub QuitWithoutSaving()
    ActiveWorkbook.Saved = True
    ActiveWorkbook.Close
End Sub

Private Sub Button1_Click()
    Call SaveBook
    Call CreateTextMain
    Call SheetUnprotect
    Call OutputTextWithoutBlanks
    Call SheetProtect
    Call CreateTextSub
    Call SheetUnprotect
    Call OutputTextWithoutBlanks
    Call SheetProtect
    Call QuitWithoutSaving
End Sub

コピーしたコードを「Module1」内に貼り付けたら、
上書き保存してください。
















Excelブックの「DATA」シートに戻り、
「開発」タブの「挿入」→「ボタン」を選択し設置します。















マクロ名に「Button1_Click()」と入力し、
マクロの保存先に現在のブック名を選択します。




















ボタンの表示名を変更したい場合は、ボタンを右クリックし、
「テキストの編集」で変更してください。















F12を押し、Excel マクロ有効ブック(*.xlsm)で保存します。











以上で、ボタンをクリックすればConfigがテキスト出力されます。

■補足

保存時、下記のようなメッセージが表示されることがあります。
動作に問題はありませんが、このメッセージを非表示にすることもできます。








非表示にするには、
「ファイル」→「オプション」→「セキュリティセンター」→「セキュリティセンターの設定」を開き、
「ファイルを保存するときにファイルのプロパティから個人情報を削除する」
のチェックを外してください。

2017年7月6日木曜日

サブインタフェースのVLAN単位で最低保証帯域を設定する

複数のユーザが共用するネットワーク機器を設定する場合は、
QoSを設定することが多いです。

今回紹介するのは、Ciscoルータにおける、
サブインタフェースのVLAN単位での最低保証帯域です。
"最低保証"ですので、他ユーザが帯域をたくさん使用していても、
最低限守られるという意味合いであり、
ここで設定した帯域を超えて使用できなくなるわけではありません。

物理インタフェースを全ユーザが利用でき、
部分的に各ユーザの専用区画が確保されるイメージです。










本記事は複雑な内容ではないと思いますが、
理解を深めたいという方は是非下記の書籍をご検討ください。


■設定例

class-map match-all Class_USER_A
 match vlan  501
class-map match-all Class_USER_B
 match vlan  502
!
policy-map Policy_Child
 class Class_USER_A
  bandwidth 10000
 class Class_USER_B
  bandwidth 5000
policy-map Policy_Parent
 class class-default
  shape average 100000000
   service-policy Policy_Child
!
interface GigabitEthernet1/0
 description *** WAN ***
 no ip address
 service-policy output Policy_Parent
!
interface GigabitEthernet1/0.501
 description *** USER_A ***
 encapsulation dot1Q 501
!
interface GigabitEthernet1/0.502
 description *** USER_A ***
 encapsulation dot1Q 502

■補足

上記の例では、ユーザの通信にのみフォーカスしていますが、
実務においては運用監視通信なども考慮が必要な点、ご注意ください。

Excel関数でIPアドレスを含むNW機器Config作成を補助する

少量であれば問題ありませんが、
Configを作成する際、テキストエディタのみで作成していると、
誤りの原因になったり、時間が多くかかります。

ご存知の方も多いと思いますが、
Excelの関数を工夫することで、効率的にConfigを作成することが可能です。

ユーザからStaticルート、NAT、ACL等の、
設定追加依頼を下記のような電子媒体で入手する場合に便利です。
Cisco機器を例にしていますが、Juniper等でも応用可能と思います。
















上記のパラメータを利用してConfigが出来上がるような
計算式を用意してしまえば、以降は効率化できます。

初歩の学習としては、下記の書籍がお勧めです。


ただ、実際の要件では例外的な考慮が必要になる場合も多く、
全てを効率化することは難しいのが実情ではありますが、
このようなことを意識するかによって効率が大きく変わることがあります。

非常に初歩的な計算式を含みますが、下記ご参考までに。

■基本編

上記の表ですと、NATが簡単です。
""(ダブルクォーテーション)による文字列表現と、
"="(イコール)による参照と、"&"(アンド)による文字列結合を使います。

【計算式】
="ip nat inside source static "&C12&" "&D12

【結果】
ip nat inside source static 10.1.1.1 172.16.100.1

■応用編1

次にStaticルートに取り掛かりますが、
悩ましいのがCIDR表記(192.168.1.0/24等のスラッシュを含む表記)です。

同様の意味をConfigではサブネットマスクで表記する必要があります。

よって、当該セルのPrefix部を取り出し、Prefixから
サブネットマスクに変換します。

①IPアドレス部を取り出します。

【計算式】
=MID(C4,1,FIND("/",C4)-1)

【結果】
10.0.0.0

②Prefix部を取り出します。

【計算式】
=MID(C4,FIND("/",C4)+1,2)

【結果】
8

③変換テーブルを用意します。

このテーブルを使用してPrefixをサブネットマスクに変換します。

1 128.0.0.0 127.255.255.255
2 192.0.0.0 63.255.255.255
3 224.0.0.0 31.255.255.255
4 240.0.0.0 15.255.255.255
5 248.0.0.0 7.255.255.255
6 252.0.0.0 3.255.255.255
7 254.0.0.0 1.255.255.255
8 255.0.0.0 0.255.255.255
9 255.128.0 0.127.255.255
10 255.192.0.0 0.63.255.255
11 255.224.0.0 0.31.255.255
12 255.240.0.0 0.15.255.255
13 255.248.0.0 0.7.255.255
14 255.252.0.0 0.3.255.255
15 255.254.0.0 0.1.255.255
16 255.255.0.0 0.0.255.255
17 255.255.128.0 0.0.127.255
18 255.255.192.0 0.0.63.255
19 255.255.224.0 0.0.31.255
20 255.255.240.0 0.0.15.255
21 255.255.248.0 0.0.7.255
22 255.255.252.0 0.0.3.255
23 255.255.254.0 0.0.1.255
24 255.255.255.0 0.0.0.255
25 255.255.255.128 0.0.0.127
26 255.255.255.192 0.0.0.63
27 255.255.255.224 0.0.0.31
28 255.255.255.240 0.0.0.15
29 255.255.255.248 0.0.0.7
30 255.255.255.252 0.0.0.3
31 255.255.255.254 0.0.0.1
32 255.255.255.255 0.0.0.0

上記がセル:C30~E61に用意されたものとします。

④VLOOKUPで参照させる(Prefixをサブネットマスクに変換)

VLOOKUPの最初の引数は②をVALUE関数で値に変換したものです。

【計算式】
=VLOOKUP(VALUE(MID(C4,FIND("/",C4)+1,2)),$C$30:$E$61,2,0)

【結果】
255.0.0.0 

⑤基本編と同様に、"="と"&"を使ってip route コマンドに組み立てます。

■応用編2

ACLの場合もこれまでの内容で計算式化が可能ですが、
今までに記述しなかった箇所について説明します。

①VLOOKUPで参照させる(Prefixをワイルドカードに変換)

「応用編1」で記述した内容に近いです。
 最後から2番目の数値を2から3に変更することでワイルドカードになります。

【計算式】
=VLOOKUP(VALUE(MID(E21,FIND("/",E21)+1,2)),$C$30:$E$61,3,0)

【結果】
0.255.255.255

②ポート番号が省略される場合や、範囲指定を考慮する。

anyは空白、ハイフンがなければ eq 数値、
ハイフンがあればrange 前半数値 後半数値 という規則で表示させます。
※計算式及び結果1~3は参照するセルがH21~H23で変化しているのみです。

【計算式1】
=IF(H21="any","",IF(ISERROR(FIND("-",H21)),"eq "&H21,"range "&LEFT(H21,FIND("-",H21)-1)&" "&MID(H21,FIND("-",H21)+1,5)))

【結果1】
(空白)

【計算式2】
=IF(H22="any","",IF(ISERROR(FIND("-",H22)),"eq "&H22,"range "&LEFT(H22,FIND("-",H22)-1)&" "&MID(H22,FIND("-",H22)+1,5)))

【結果2】
eq 80

【計算式3】
=IF(H23="any","",IF(ISERROR(FIND("-",H23)),"eq "&H23,"range "&LEFT(H23,FIND("-",H23)-1)&" "&MID(H23,FIND("-",H23)+1,5)))

【結果3】
range 20 21

■番外編

以下はメモです。
セル:G21はCIDR表記「172.31.100.0/24」が記入されています。

(A)と(B)は、NATで1オクテット目が変換される場合に便利です。

(C)と(D)を利用すれば、ネットワークアドレスを記入するだけで、
環境の規則に従い、正系を若番、副系を老番等という計算式も作成可能です。
※(C)に、(D)に1や2を足したものを"&"で結合すればOKです。


(A)1オクテット目を取得する

【計算式】
=MID(G21,1,FIND(".",G21)-1)

【結果】
172

(B)2オクテット目以降を取得する

【計算式】
=MID(MID(G21,1,FIND("/",G21)-1),FIND(".",MID(G21,1,FIND("/",G21)-1))+1,11)

【結果】
31.100.0
※1オクテット目の後のドットも含めたい場合は、後ろの方の"+1"を削除

(C)3オクテット目までを取得する

【計算式】
=MID(G21,1,FIND("$",SUBSTITUTE(G21,".","$",LEN(G21)-LEN(SUBSTITUTE(G21,".",""))))-1)

【結果】
172.31.100

(D)4オクテット目を取得する

【計算式】
=MID(G21,SEARCH(".",G21,SEARCH(".",G21,SEARCH(".",G21,1)+1)+1)+1,SEARCH("/",G21,SEARCH(".",G21,SEARCH(".",G21,1)+1)+1)-SEARCH(".",G21,SEARCH(".",G21,SEARCH(".",G21,1)+1)+1)-1)

【結果】
0

2017年7月2日日曜日

リストから複数機器のログを取得するTeratermマクロ

ネットワーク機器はコマンドでログを取得するのが一般的と思います。

しかし、CiscoやJuniperなど、複数のメーカが混じっていたり、
作業の都度、複数機器に手動でログインしてコマンドを実行するのは、
大変手間が掛かります。

よって、ネットワーク環境に応じたTeratermマクロを、
作成・運用しているところも多いと思います。

どなたかが似たようなものを公開しているかと思いましたが、
以下機能のものは見つけられませんでしたので公開します。

■機能
・複数機器を一度にログ取得可能
・機器ごとに実行コマンドを定義可能
・機器ごとにアカウント、パスワードを定義可能
・機器ごとにプロンプトを定義可能
・機器ごとにSSH / Telnetを定義可能
・機器ごとにenableパスワードの有無を吸収可能
・ログファイルの格納先をマクロ実行時に指定できる
・ログファイル名にホスト名と日付が付与される
・ログイン先リストファイルは部分的にコメントアウトが可能
・ログインできない機器があってもマクロが停止しない

■説明
・マクロは以下の①~③の3点を全て同じフォルダに格納してください。
 ①Teratermマクロ
 ②ログイン先リストファイル
 ③コマンドリストファイル

・事前にTeratermのTCP/IP設定で、
「自動的にウインドウを閉じる」をOFFにしてください。

・ ログイン先リストファイルは、以下の特徴があります。
 - 環境に応じて変更してください。
 - 先頭に #  がある機器は処理がスキップ(コメントアウト)
 - enableパスワードが空白の機器は特権モードへの移行処理がスキップ
 - コマンドリスト列のファイルに列挙されたコマンドを取得する

・ コマンドリストファイル
 - Ciscoは「ter len 0」、Junosは「 | no-more」などを含めてください。

・ローカル環境で動作は確認していますが、自己責任でご利用ください。



■マクロ
①Teratermマクロ
 (この下の行からを拡張子 .ttl として保存してください。)

;##########################################
;設定
;##########################################

;ログ保存先の親フォルダ
logDir = 'C:\work\'

;ログイン先リストファイル名
listFile = 'list.csv'

;エラーログファイル名
errorFile = 'error.txt'

;リストファイル内のコメントアウト文字
commentMark = '#'

;SSH/Telnet接続時のタイムアウト(秒)
accessTimeout = '5'

;ログ取得時のタイムアウト(秒)
logTimeout = 120

;##########################################
;実行処理
;##########################################

;エラー数の初期化
errorCounter = 0

call MAKEDIRECTORY
call OPENLISTFILE
call MAIN
call CLOSELISTFILE
call ENDPROCESS
end

;##########################################
;サブルーチン
;##########################################

;---------------------------------------------------------
;フォルダ作成
;---------------------------------------------------------

:MAKEDIRECTORY

  inputbox 'ログ格納フォルダ名を入力してください:' ''

  ;空入力だったら終了
  strcompare inputstr ''
  if result = 0 then
    end
  endif

  mkdirName = inputstr

  ;フォルダ作成コマンド生成
  mkdir = 'cmd /c md '
  strconcat mkdir logDir
  strconcat mkdir mkdirName

  exec mkdir
  pause 1
return

;---------------------------------------------------------
;ループ処理
;---------------------------------------------------------
:MAIN

  ;ループ終了判定フラグ
  mainLoopEnd = 1

  while mainLoopEnd
    comment = 0
    timeoutChk = 0
    filereadln hosts line

    ;ログイン先リストファイルがEOFでなければ、ループ終了判定フラグをクリア
    if result then
      mainLoopEnd = 0
    endif

    if mainLoopEnd <> 0 then
      call GETPARAM
      ;コメントアウトでなければログイン処理へ
      if comment = 0 then
        call LOGIN
        if timeoutChk = 0 then
          log_1 = mkdirName
          call MAKELOGFILE
          call GETLOG
          call LOGOUT
        else
          call WRITEERROR
          call CONNECTTIMEOUT
        endif
      endif
    endif
  endwhile
return

;---------------------------------------------------------
;ログイン先リストファイルからパラメータ取得
;---------------------------------------------------------

:GETPARAM

  ;コメントアウトチェック
  strcopy line 1 1 commentOut
  strcompare commentOut commentMark

  ;一致したらループ処理へ戻る
  if result = 0 then
    comment = 1
      return
  endif

  ;ホスト名取得
  strscan line ','
  column = result-1
  strcopy line 1 column hostname
  strlen line
  column = column+2
  strcopy line column result line

  ;IPアドレス取得
  strscan line ','
  column = result-1
  strcopy line 1 column ipAddress
  strlen line
  column = column+2
  strcopy line column result line

  ;ログインユーザ取得
  strscan line ','
  column = result-1
  strcopy line 1 column user
  strlen line
  column = column+2
  strcopy line column result line

  ;ログインパスワード取得
  strscan line ','
  column = result-1
  strcopy line 1 column passwd
  strlen line
  column = column+2
  strcopy line column result line

  ;ログイン時のプロンプト取得
  strscan line ','
  column = result-1
  strcopy line 1 column promptLogin
  strlen line
  column = column+2
  strcopy line column result line

  ;enableパスワード取得
  strscan line ','
  column = result-1
  strcopy line 1 column enaPasswd
  strlen line
  column = column+2
  strcopy line column result line

  ;ログ取得時のプロンプト取得
  strscan line ','
  column = result-1
  strcopy line 1 column promptInput
  strlen line
  column = column+2
  strcopy line column result line

  ;アクセス方法取得
  strscan line ','
  column = result-1
  strcopy line 1 column access
  strlen line
  column = column+2
  strcopy line column result line

  ;コマンドリスト取得
  cmdList = line

return

;---------------------------------------------------------
;ログイン実行
;---------------------------------------------------------

:LOGIN

  ;接続方法がSSHだったらSSHのTeratermコマンドを生成
  strcompare access 'ssh'
  if result = 0 then

    sshCommand = ipAddress

    strconcat sshCommand ':22 /ssh /2 /auth=password /user='
    strconcat sshCommand user
    strconcat sshCommand ' /passwd='
    strconcat sshCommand passwd
    strconcat sshCommand ' /timeout='
    strconcat sshCommand accessTimeout

    connect sshCommand

  ;そうでなければtelnet
  else

    telnetCommand = ipAddress

    strconcat telnetCommand ':23 /nossh /timeout='
    strconcat telnetCommand accessTimeout

    connect telnetCommand

    ;ログイン時に待ち受ける文字列は必要に応じて追加する
    wait 'Username:'
    sendln user

    wait 'Password:'
    sendln passwd

  endif

  ;ログインアカウント送信後、ログイン時のプロンプトが返ってこなければタイムアウト
  wait promptLogin
  if result = 0 then
    timeoutMessage = '接続タイムアウト'
    timeoutChk = 1
    return
  endif

  ;enableパスワードが空でなければ特権モードにログイン

  strcompare enaPasswd ''
  if result = 1 then
    sendln 'en'
    wait 'Password:'
    sendln enaPasswd
    wait promptInput
  endif

return

;---------------------------------------------------------
;ログファイル作成
;---------------------------------------------------------

:MAKELOGFILE

  ;日付時刻取得
  getdate date
  strcopy date 1 4 datey
  strcopy date 6 2 datem
  strcopy date 9 2 dated

  ;時刻取得
  gettime hhmmss "-%H%M%S"

  logFile = logDir
  strconcat logFile mkdirName
  strconcat logFile '\'
  strconcat logFile hostname

  strconcat logFile '_'
  strconcat logFile datey
  strconcat logFile datem
  strconcat logFile dated

  strconcat logFile hhmmss
 
  strconcat logFile '.txt'

return

;---------------------------------------------------------
;ログ書き込み
;---------------------------------------------------------

:GETLOG

  logopen logFile 0 1
  timeout = logTimeout
  logLoopEnd = 1
  fileopen command cmdList 0
  while logLoopEnd
    comment = 0
    filereadln command line
    if result then
      logLoopEnd = 0
    endif

    ;コメントアウトチェック
    strcopy line 1 1 commentOut
    strcompare commentOut commentMark
    if result = 0 then
      comment = 1
    endif

    if comment = 0 then
      sendln line
      wait promptInput
    endif
  endwhile
  logclose
return

;---------------------------------------------------------
;ログアウト
;---------------------------------------------------------

:LOGOUT
  sendln 'quit'
  wait promptInput
return

;---------------------------------------------------------
;接続タイムアウト
;---------------------------------------------------------

:CONNECTTIMEOUT
  fileopen errorLog logFile 1
  filewrite errorLog hostname
  filewrite errorLog ':'
  filewrite errorLog timeoutMessage
  filewrite errorLog #13#10
  fileclose errorLog

  errorCounter = errorCounter + 1

return

;---------------------------------------------------------
;エラーログファイル生成
;---------------------------------------------------------

:WRITEERROR

  logFile = logDir
  strconcat logFile mkdirName
  strconcat logFile '\'
  strconcat logFile errorFile

return

;---------------------------------------------------------
;ログイン先リストファイルを開く
;---------------------------------------------------------

:OPENLISTFILE

  fileopen hosts listFile 0

return

;---------------------------------------------------------
;ログイン先リストファイルを閉じる
;---------------------------------------------------------

:CLOSELISTFILE

  fileclose hosts

return

;---------------------------------------------------------
;終了処理
;---------------------------------------------------------

:ENDPROCESS

  ;エラーメッセージ
  errorMessage = 'エラー数:'

  int2str str errorCounter
  strconcat errorMessage str
  messagebox errorMessage 'マクロ終了'

return

②ログイン先リストファイル
 (この下の行からをlist.csv として保存してください。)

#ホスト名,IPアドレス,ログインユーザ,ログインパスワード,ログイン時のプロンプト,enableパスワード(不要なら空白),ログ取得時のプロンプト,アクセス方法,コマンドリスト
R1,10.1.1.1,admin,testpw,R1>,enapw,R1#,ssh,cisco1.txt
R2,10.1.1.2,admin,testpw,R2>,enapw,R2#,ssh,cisco2.txt
R3,10.1.1.3,admin,testpw,R3>,enapw,R3#,telnet,cisco1.txt
R4,10.1.1.4,admin,testpw,R4#,,R4#,ssh,cisco2.txt

③コマンドリストファイル
 (この下の行からをcisco1.txt として保存してください。)
ter len 0
show run
show ver

2017年6月25日日曜日

CCIE R&S Written v5.1(400-101)受験記

Web上では
「筆記試験が難化している」
「周囲でCCIE認定を失効する人が続出している」
という意見が散見されたため、非常に身構えていたのですが、

この度CCIE R&S Written v5.1にPassし、
CCIE認定の更新に成功しましたので、簡単ですが学習方法等をまとめます。

■所感

私が前回受験したときは、Written: v4、Lab: v5

という組み合わせだったため、
IOS-XEのアーキテクチャについてや、EIGRP OTPや、
ISISや、Evolving Technologies(後述)は当時出題範囲外だったわけです。
PfRなんかもWrittenでは出題されていなかったと思います。

前回Writtenを受けたのは2014年3月ですので、
3年以上経過したことになります。
1度PassしたTrackとはいえ、それなりに苦労しました。

■受験Trackの選択

もともと、キャリアや共用ネットワークで使用される技術に興味があったため、
CCIE Service Providerで更新を目指しており、少しずつ学習をしていたものの、
日々の業務や転職活動により新規分野の学習時間確保が難しいことから、
保有TrackであるRouting and Switching(以下、R&S)を再度受験しました。

■出題範囲の確認

まずはこちらのページで出題範囲を確認します。
PDFでダウンロードし、自信の無い項目をチェックすると良いでしょう。

上記には日本語のページもあるのですが、
英語版をお勧めします。

理由は、英語の項目をそのままGoogle等で検索すると、
Ciscoの公式ページがHITしたり、そうでなくとも、
当該項目についてまとめられた有意義なページに辿り着けるからです。

チェックした項目に関連するページで知識を吸収しましょう。

■学習時間

通勤時間や昼休み、休日を利用して学習しました。
休日は3時間、平日は1時間を3ヶ月程度です。
合計で150時間程度かと思います。

■学習教材

CCIE Routing and Switching v5.0 Official Cert Guide Library

やはり公式本は安心感があります。

CCIE Routing and Switching v5.1 Foundations: Bridging the Gap Between CCNP and CCIE (Practical Studies)

CCNPからCCIEを目指している方にピッタリの良書です。

Evolving Technologies Study Guide

クラウド/SDN/OpenStackなどの出題範囲がコンパクトにまとまっており、
非常にお勧めです。なお「過去にダウンロードした」という方も、
定期的に更新されていますので、最新版をダウンロードすべきです。

2017年6月12日月曜日

ネットワークエンジニアの転職

転職先が決まったので、現在の状況や気持ちをまとめます。

■そもそもなぜ転職しようとしたか?
私は現在、客先常駐のネットワークエンジニアとして仕事をしています。
正社員として雇用され、自社ではなく他社のオフィスに通勤します。
いわゆる「特定派遣」というものです。

フィジビリティ検証~詳細設計~構築~運用が主な担当範囲でした。
経験を積む分には悪くない現場だと思いましたが、
一歩引いて現状の業務を考えると、以下であると気付きました。

・機器選定、要件定義などの上流工程や重要な意思決定に関われない
・類似の案件を繰り返すことになり、職務を通じた成長に限界を感じる
・1人月でいくらという契約なので、実績を上げても自社の売り上げに影響しない

私はもう何年も同じ現場に常駐しており、
担当案件は定期的に変わりましたが、
上記の3点が変わることはありませんでした。

職務を通じて成長できることがエンジニアの醍醐味だと思いますので、
類似のネットワーク構成を何度も構築して、
テストケースを作っては消化することは、
もはや私の成長には繋がらないと考えました。

構成の不備が見つかりながらも代替案を提案してリリースを成功させ、
大規模ユーザが利用開始しても、
どんなにしっかりとトラブルの解析をして報告資料を作っても、
運用のためマニュアルやツール等を整備して工数を削減しても、
これらは常駐先社員様の実績で、常駐先企業の売り上げに計上されるわけです。

常駐先企業の売り上げが上がったところで、
私の給与や賞与が高くなったりはしません。

やはり私は「社員」として売り上げに貢献したいと思いますし、
現在の立場を苦痛と思うようになってしまったため、転職することにしました。

■客先常駐の良い点は?
何かと悪く言われがちな客先常駐ですが、良い点もあります。
現場によって大きく変わると思いますが、
私の現場では以下の良い点がありました。

(1)大企業のネットワークシステムや設計資料を読み解くことで理解を深められる(2)様々な機器に触れられ、実務を通して機器の挙動を理解できる
(3)トラブル時でも、エンドユーザから直接責任追及されない
(4)機器が想定外の挙動をしたときは、ベンダに問い合わせをすることができる

元請けとなる大手SIerの正社員や、機器ベンダに所属していると、
上記(3)と(4)のどちらかに強い責任が発生すると思いますので、
徹夜なども厭わないものと思われます。(その分、給与は高いと思われますが )

一方で、協力会社という立場であれば、責任が薄まるため精神衛生上楽です。
(もちろん、雑な仕事で良いという意味ではありません)

■客先常駐の困った点は?
こちらも現場や所属会社によって大きく変わると思いますが、
私の現場では以下の点に困っていました。

(1)業務範囲が決まっていないため、依頼された仕事は断れない
(2)自社の売り上げに貢献するには、増員するか単価UPするしかない
(3)セミナーなどで名刺交換しても、自社に席がないため連絡を受けられない
(4)自社の管理職が同じオフィスにいないため、人事評価が不透明

(1)が本当にキツイところだと思います。
当初、対応予定ではなかったところまで急遽「お願いします!」と
言われてしまえば、基本的には対応する方針で動きます。

もしあなたが、客先常駐であり、自社チームのリーダがメンバの負荷を考慮して、
「対応可否は担当営業含めてご相談ください」等と言えるのであれば、
とてもいいチームですし、お客様とも良い関係であると言えます。

私のチームはとにかく引き受けるばかりで、
増員も「予算の都合」で断られることが続いていたため、
メンバの負荷が高くなる一方でした。

無茶な納期の業務を引き受けるなら、
せめて超過工数は精算を要求すべきかと思いますが、
これも自社の立場が常駐先に対して弱いため、ほぼ精算も成立しませんでした。

■転職するには?
特に難しいことはなく、職務経歴書と履歴書を電子版で作成し、
転職サイトに登録してWebから応募するだけです。
1度登録してしまえば、情報を使いまわせるので非常に効率的です。

私はエージェントサービスも使用して活動しました。
想定される質問や、過去、採用見送りとなった方の理由を開示してもらえるため、
対策がしやすいというメリットがあると思います。

サイトに登録すると大量に求人情報のメールが来ると思いますが、
面談確約だとかスカウトなどのワードがあっても、
書類を提出すると音沙汰がなかったり、不採用になったりするケースも多いため、
あまりアテにならないと思いました。

利用するサイトによって、求人内容が違ったりするので、
複数のサイトを利用すると良いでしょう。

また、志望する企業が具体的に決まっている場合、
エージェントや求人サイト経由ではなく、
企業のHPで直接応募できないかも確認しましょう。