TFTPサーバ構築メモ

先日TFTPサーバを構築したのでその時の手順やらのメモ書きです。

TFTPサーバのモジュールインストール

[root@localhost ~]# yum install tftp tftp-server
読み込んだプラグイン:fastestmirror
Determining fastest mirrors
base                                                     | 3.6 kB     00:00
centosplus                                               | 3.4 kB     00:00
extras                                                   | 3.4 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/7/x86_64/primary_db                                | 1.3 MB   00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ tftp.x86_64 0:5.2-22.el7 を インストール
---> パッケージ tftp-server.x86_64 0:5.2-22.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 Package              アーキテクチャー
                                      バージョン            リポジトリー   容量
================================================================================
インストール中:
 tftp                 x86_64          5.2-22.el7            base           38 k
 tftp-server          x86_64          5.2-22.el7            base           47 k

トランザクションの要約
================================================================================
インストール  2 パッケージ

総ダウンロード容量: 85 k
インストール容量: 117 k
Is this ok [y/d/N]: y
Downloading packages:
(1/2): tftp-5.2-22.el7.x86_64.rpm                          |  38 kB   00:00
(2/2): tftp-server-5.2-22.el7.x86_64.rpm                   |  47 kB   00:00
--------------------------------------------------------------------------------
合計                                               227 kB/s |  85 kB  00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : tftp-5.2-22.el7.x86_64                          1/2
  インストール中          : tftp-server-5.2-22.el7.x86_64                   2/2
  検証中                  : tftp-server-5.2-22.el7.x86_64                   1/2
  検証中                  : tftp-5.2-22.el7.x86_64                          2/2

インストール:
  tftp.x86_64 0:5.2-22.el7            tftp-server.x86_64 0:5.2-22.el7

完了しました!
[root@localhost ~]#

xinetdのインストールも忘れずに

[root@localhost ~]# yum install xinetd
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ xinetd.x86_64 2:2.3.15-13.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 Package         アーキテクチャー
                                 バージョン                 リポジトリー   容量
================================================================================
インストール中:
 xinetd          x86_64          2:2.3.15-13.el7            base          128 k

トランザクションの要約
================================================================================
インストール  1 パッケージ

総ダウンロード容量: 128 k
インストール容量: 261 k
Is this ok [y/d/N]: y
Downloading packages:
xinetd-2.3.15-13.el7.x86_64.rpm                            | 128 kB   00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : 2:xinetd-2.3.15-13.el7.x86_64                   1/1
  検証中                  : 2:xinetd-2.3.15-13.el7.x86_64                   1/1

インストール:
  xinetd.x86_64 2:2.3.15-13.el7

完了しました!
[root@localhost ~]#

xinetdの設定変更

[root@localhost ~]# cat /etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        disable                 = no ←★デフォルトだとyesなのでnoに変更する
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

ファイアウォールの設定

[root@localhost ~]# firewall-cmd --zone=public --add-port=69/udp --permanent←ポートで指定する場合
[root@localhost ~]# firewall-cmd --add-service=tftp --zone=public --permanent←サービスで指定する場合
[root@localhost ~]# firewall-cmd --reload←ファイアウォールの再読み込み

xinetdサービスの起動

[root@localhost ~]# systemctl start xinetd

動作確認

TFTPサーバに向けてテキトーなファイルのアップロードを行う。
今回は192.168.2.161の別サーバからtest.cfgと言うファイルをアップロードしてみます。

192.168.2.161側の操作
[root@localhost ~]# tftp -v 192.168.151.2 -c put test.cfg
Connected to 192.168.151.2 (192.168.151.2), port 69
putting test.cfg to 192.168.151.2:test.cfg [netascii]
Sent 17618 bytes in 0.0 seconds [4469595 bit/s]
[root@localhost ~]#
TFTPサーバ側の操作
[root@localhost tftpboot]# ll
合計 24
-rw-rw-rw-. 1 nobody nobody 17618  1月 16 13:53 test.cfg
-rwxrwxrwx. 1 root   root       5  1月 16 11:30 test.txt
[root@localhost tftpboot]#

jinja2を使ってコンフィグの自動生成をやってみた

最近業務で似たような検証環境をいくつも構築する事が多くなり、構築するたびにコンフィグを用意するのは面倒になっていました。
なのでjinja2を使って自動でコンフィグを生成するようにしてみました。

実行環境

  • Winodows7 64bit
  • Python 3.7.0
  • pip 18.1
  • jinja2 2.10

jinja2のインストール

pip install jinja2

テンプレートファイルの準備

※一部のコンフィグのみ載せています。

★OSPF設定
set protocols ospf area {{area_number}} interface lo0.0 passive
set protocols ospf area {{area_number}} interface lo0.0 metric 10
set protocols ospf area {{area_number}} interface ge-0/0/0.0 interface-type p2p
set protocols ospf area {{area_number}} interface ge-0/0/0.0 metric 100

★BGP設定
set routing-options router-id {{Loopback}}
set routing-options autonomous-system {{AS_number}}
set protocols bgp group VPN local-address {{Loopback}}
set protocols bgp group VPN cluster {{Loopback}}
set protocols bgp group VPN peer-as {{AS_number}}
set protocols bgp group VPN neighbor {{Opp_address}} import passall
set protocols bgp group VPN neighbor {{Opp_address}} export passall

jinja2で生成するスクリプトの準備

#! /usr/bin/env python
# -*- coding: utf-8 -*-
from jinja2 import Template, Environment, FileSystemLoader


env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('template.txt')

data = {
    "area_number": "0.0.0.0",                    
    "Loopback": "192.168.27.129",                
    "AS_number": "65000",                        
    "Opp_address": "192.168.27.3",                  
}

rendered = template.render(data)

print(str(rendered))a

実行結果

$ python config_generate.py
★OSPF設定
set protocols ospf area 0.0.0.0 interface lo0.0 passive
set protocols ospf area 0.0.0.0 interface lo0.0 metric 10
set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 interface-type p2p
set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 metric 100

★BGP設定
set routing-options router-id 192.168.27.129
set routing-options autonomous-system 65000
set protocols bgp group VPN local-address 192.168.27.129
set protocols bgp group VPN cluster 192.168.27.129
set protocols bgp group VPN peer-as 65000}
set protocols bgp group VPN neighbor 192.168.27.3 import passall
set protocols bgp group VPN neighbor 192.168.27.3 export passall

以上です。
上手くコンフィグが生成されていますね。
本当はこのコンフィグを機器に流し込むところまでやりたいんですが、それはまたの機会と言う事で!

Juniper QFXでdel intを実行する際は注意しよう!

タイトル通りQFXでdelete interfaceを実行する際は注意しましょうって話です。
まぁQFXに限らず、deleteコマンドを実行する際は注意は必要なんですけどね。。。
私は業務中にdelete interface実行後、commitを実行してしまい見事にマネージメントインタフェースの設定を消してしまい、SSH接続を弾き出された経験があります。
その後はサーバ室まで走ってコンソールケーブルでマネージメントインタフェースの再設定を行い復旧しました。

もしdelete interfaceを実行するならコミット前に再度マネージメントインタフェースの設定を投入して、それからコミットの実行する事で今回の減少は回避できますので次回からはそうしましょう。

そもそも何故delete intefaceを実行する事になったかと言うと、QFXに設定を入れようとコンフィグを確認するとすでに別のコンフィグが設定されていて一度設定を消す必要があったからですね。
大量にインタフェースの設定がされていて個別に消すのが面倒で、delete intefaceで横着してしまったわけです。。
いやー反省ですね。
次からは十分注意したいと思います。

Vue.jsとFirebaseで作るミニWebサービス 1回目

2019年あけましておめでとうございます。
最近ブログ更新しなさ過ぎて、運営様からそろそろ記事を書けとメールをいただきました。
2019年はなるべく更新できるよう頑張りたいと思います。

そんなわけで、今日からVue.jsを使ってミニWebサービスを作ってみたいと思います。
今回参考にさせて頂く参考書はこちら
【Vue.jsとFirebaseで作るミニWebサービス】です。

簡単に本書の紹介から

はじめにこの本の目的とターゲット

本書のターゲットとしては次のように明記されています。

・HTML,CSS,Javascriptを利用して、簡単なWebサイトを作ったことがある人  
・複数のページや状態管理をJavascript使って自力で行い、ごちゃついてしまい消耗している人  
・普段デザイナーとしてマークアップしており、フロントエンドの新しめな環境でのサイト構築を経験してみたい人  
・シングルページアプリーケーション、Vue.jsってものを触ってみたい、またはそれらの挫折経験がある人  
・やったことないけどとにかくWebサービスを作ってみたい人
・FirebaseのWeb版を使ってみたい人、どんなことができるのか知りたい人
・普段サーバーサイドやネイティブアプリを作っていて、Webフロントエンドをさらっと触ってみたい人

私の場合は「やった事ないけどとにかくWebサービスを作ってみたい人」に当てはまります。
ターゲット層を見てわかる通り、初心者向けにも対応しています。
気になる方は是非お手にとってご覧になって下さい。

SPA(シングルページアプリケーション)について

そもそもシングルページアプリケーションってなんなの?
簡単に要約すると、Webページを遷移させずに情報を更新する事、今までのWebサイトの仕組みだとページのURLやセッションの情報に紐付き、サーバから出力するHTMLを変更する事でコンテンツ(情報)を切り替えていた。

SPAフレームワークを使うメリット

ページの再読み込みがなくてもサイトの内容を切り替える事ができるです。
そのためにURLやキャッシュにページの内容を記録しておくような機能、それらに応じて適切なデータを返すといった仕組みが必要になってきます。
そのあたりの機能を使いやすまとめたものがSPAフレームワークとなっています。

Firebaseで何ができるのか

今までWebサービスを作る上でサーバサイドプログラムが必要だった部分の一部が、コードを書かずに利用できる。
・Hosting:静的サイトのホスティング及びSSL対応
・Authentication:Googleアカウントを利用してログイン、アカウント情報の取得
・Realtime Database:NoSQLなデータベースの読み書き
これらの機能を利用する事で、Webサービスを公開まで開発することが非常に簡単に可能になっている。

作業用端末(Mac)で事前準備

macbrewをインストールする

brew本家サイトにアクセスすると下記のようにコマンドが紹介されているのでそのままコピーしてmacのターミナルで実行する。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

実行後、以下コマンドで確認する。

$ which brew
/usr/local/bin/brew
nodebrewのインストール

下記コマンドでnodebrewをインストールしよう。

$ brew install nodebrew

コマンド実行後、下記コマンドで確認

$ brew list
nodebrew
nodebrewのセットアップ

下記コマンドでnodebrewをセットアップしよう

$ nodebrew setup

セットアップ実行時のターミナルログにPATHを追加するような指示が出るのでPATHの追加を行い.bash_profileの反映を行う。

$ export PATH=$HOME/.nodebrew/current/bin:$PATH
$ source .bash_profile 
Node.jsとnpmのインストール

現在の安定板をインストールするのでオプションは「stable」を使う。実行後「Installed Successfully」と出ればOK

$ nodebrew install-binary stable

問題なく任意のバージョンがインストールされていることを確認する。

$ nodebrew list
v10.15.0
v11.6.0

current: none

私は安定版と最新版の2つを入れておきました。
今回は安定版を使用する。下記コマンドで安定版を有効にしよう。

$ nodebrew use v10.15.0

下記コマンドでNode.jsとnpmがインストールされている事を確認する。

$ node -v
v10.15.0
$ npm -v
6.4.1

開発環境のセットアップ

ここから本書に沿って手順を進める。

vue-templateのダウンロードとセットアップ

下記コマンドで「vue-cli」をインストールする

$ npm install -g vue-cli

問題なくインストールできたか次のコマンドで確認する

vue -h

作業用ディレクトリに移動して、テンプレートダウンロードの準備を進める

$ cd 作業ディレクトリ名
$ vue init webpack-simple Test_Markdown

いくつか質問されますが、最後の「Use sass?」以外はそのままEnterでOK
ちなみに私の場合はこんな感じでした。
Project nameの箇所だけ小文字にしています。
最初大文字にしていたんですが、大文字は使えないみたいで怒られました・・・

$ vue init webpack-simple Test_Markdown

? Project name test_markdown
? Project description A Vue.js project
? Author 
? License MIT
? Use sass? Yes

作成したプロジェクトディレクトリに移動し、npmのインストールを実行

$ cd Test_Markdown/
$ npm install

最後にnpmを起動させる

$ npm dev run

するとブラウザが立ち上がりVue.jsの画面が表示されます。

f:id:kyamisama:20190105153730p:plain
Vue.js起動画面

ひとまず今日はここままで。
頑張って2回目の更新ができるように努力します!
ではでは〜

Seleniumを使ったスクレイピング

えー以前からUdemyと呼ばれるオンライン学習プログラムで勉強する為に色々と教材を買っていましたが、買ってそのままというのが常態化してきたので最近消化し始めました今日この頃です。

なので今回はUdemyで学習したことを書こうと思います!

Seleniumを使ってスクレイピングします!

と言うことで、タイトル通りスクレイピングします。
しかも今回はJupyter Notebookを使ってみました!
以前にJupyter Notebookをインストールしてそのまま放置してたやつですね。。。

ではでは早速Jupyter Notebookを起動してみます。

Jupyter Notebookの起動

以下のコマンドで起動してみる。

$ jupyter notebook

するとブラウザが立ち上がり以下の様な画面が表示される。
これで起動は完了。

f:id:kyamisama:20181201223353p:plain
Jupyter Notebook起動画面

Jupyter Notebookのワークディレクトリの作成

デフォルトで”Untitled Folder”ってフォルダ名がありますが、今回は別途作業フォルダを作成します。
作成方法はとても簡単で下記図の通り、左端の”NEW”と言うタブから”Folder”をクリックする事で新規でフォルダを作成できます。

f:id:kyamisama:20181201223932p:plain
New Create Folder

作成するとこんな感じ↓
”Untitled Folder 1”ってのが新しくできると思います。

f:id:kyamisama:20181201224207p:plain
New Create Folder2

フォルダの名前を変更したければ、ゴミ箱マークの横に”Rename”ってあるのでそこから変更できます。

Seleniumを使ったスクレイピング

作業フォルダも出来たので次に実際にPythonのコマンドを書いていく作業ファイルを準備します。
作業フォルダを作成した方法と同様に”New”→”Python [Root]”をクリックします。

f:id:kyamisama:20181201224717p:plain
New Create Work File

すると新しくブラウザタブが追加されます。基本的にはこの新しく追加されたページで作業を行います。
今回は練習みたいなものなので比較的スクレイピングがやり易いページから情報を取得したいと思います。
よくあるランキングサイトからのスクレイピングをやってみたいと思います。

ランキングサイトからの情報を取得する

今回はスクレイピングさせて頂くWebサイトはこちら
[ランキング] 頂上決戦!一番うまいインスタント袋麺ランキング1位から10位|サッポロ一番,うまかっちゃん,チキンラーメン|他 - gooランキング

インスタントラーメンのランキングサイトから以下の3つの情報を取得してみます。

  • 順位
  • 商品名
  • 投票数

まずは、Seleniumをインポートします。ちなみにこれを動作させるとGoogle Chromeが起動します。

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://ranking.goo.ne.jp/column/5524/ranking/51628/')

次に、順位のみを取得します。

all_rank = []
elem_rank = browser.find_elements_by_class_name('ranking-number')
for rank in elem_rank:
    elem_rank = rank.text
    all_rank.append(elem_rank)
all_rank

f:id:kyamisama:20181201230422p:plain
Ranking

そして、商品名の取得。

all_name = []
elem_name = browser.find_elements_by_class_name('hdg')
for name in elem_name:
    elem_name = name.text
    all_name.append(elem_name)
all_name

f:id:kyamisama:20181201230526p:plain
Product Name

最後に投票数の取得。

points = browser.find_elements_by_class_name('article-meta')
all_point = []
for _point in points:
    point = _point.text
    all_point.append(point)
all_point

f:id:kyamisama:20181201230817p:plain
Ranking2

これで3つの情報を取得できました。
ただ取得した情報がバラバラだと味気ないのでこの情報を合体させたいと思います。

最後に取得した情報をCSVに纏めて保存

それぞれ取得した情報をPandasを使って綺麗に整理して保存してみます。

import pandas as pd
df = pd.DataFrame()
df['ランキング'] = all_rank
df['商品名'] = all_name
df['投票数'] = all_point
df

f:id:kyamisama:20181201231221p:plain
Export to CSV

以上でSeleniumを使ったスクレイピング終了です!
思ってたより上手にスクレイピング出来たんじゃないかと思います。
実はスクレイピングで取得してみたい情報があるので完成した際にはここでお披露目出来ればと思っています。
またUdemyも素晴らしいWeb教材です。
たまに90%OFFセールをやっているのでその時はお買い得ですので、興味のある方は是非やってみてください。

bash使用時のシングルクォーテーションとダブルクォーテーションの違いについて

今日の業務中にRESTコマンドを叩くBashスクリプトを書いていた際に、少し手間取った箇所があったので戒めとして残します。
まぁ簡潔に言えば、Bashスクリプト内の「"」と「'」の動作の違いを知らなかったと言うお話です。

分かりやすい様にサンプルコードを用意してみました。

localuser$ cat test.sh 
test="pwd"
echo "$test"
echo '$test'
echo `$test`
localuser$ sh test.sh 
pwd
$test
/Users/
localuser$ 

変数testをechoで画面出力する方法として、変数testを「"」「'」「`」の3種類で囲い実行してみた結果です。
結果は見ての通り、「"」は変数の中身を出力、「’」は文字列として出力、最後の「`」は変数の中身をコマンドとして実行しています。
とても勉強になりました。これでもう間違えない!

QFX5100から設定コンフィグを自動取得する方法

常日頃の業務でNW機器の設定を行なっているとちょっとした作業を自動化できれば業務の負担が減るのになぁ。。。と思い始めて早1ヶ月
今回はNW機器から自動で設定コンフィグを取得するPythonスクリプトを作ってみたのでその辺のメモ書きを残します!

NWの自動化なんてググればすぐ見つかる情報なのでまずはググってみた。
こちらの記事はとてもわかりやすく丁寧な内容だった為、参考にさせていただきます。
qiita.com

参考記事によると、NETCONFなるものを使ってNW機器の情報を取得するようですね。。

NETCONFとは

マルチベンダーに対応しており、NW機器の情報を取得するプロトコルだそうです。
主要どころのベンダーだとCisco、Juniper、Arista、Brocadeが対応しているそうです。

NETCONFを使ったスクリプトコード

検証端末PCがWindowsなのでコンフィグファイルを保存するパスがWindows仕様になっています。
またPythonのバージョンは3.6.5でWindows OSは7です。

from ncclient import manager

username = 'admin'
password = 'admin'
ipv4 = '192.168.2.x'
port = 22

connection = manager.connect(host = ipv4, port = port, username = username, password = password, timeout = 20, device_params={'name':'junos'}, hostkey_verify=False )

print('1. run show command')
print('='*40)

config=str(connection.command('show configuration',format="text"))
print('='*40)
config2=str(connection.command('show configuration | display set',format="text"))


file="C:\\Users\\Desktop\\log.txt"
with open(file,"a")as f:
    f.write(config)
    f.write(config2)

たったこれだけの行数で見事に設定情報を取得する事ができました!
これでわざわざSSHしてコマンドを打つ手間が省けますね。

と言う訳でここまで駆け足で過ぎて行きましたが、詳細については参考にさせて頂いた記事をご覧になってください。