NVR510でAnsibleを試してみた
ヤマハRTXシリーズのAnsible対応はないものだと諦めていたのに、昨日突如リリースされた。
【技術情報】#ansible による #ヤマハ #ネットワーク機器 の運用自動化についてhttps://t.co/wiz7XnOaTA#gihyosd
— ヤマハのネットワーク製品 (@yamaha_sn) 2021年3月29日
さっそく、Windows10にWSLのUbuntu 20.04 LTSとAnsibleを入れてサンプルコードを試してみた。
--- - hosts: nvr510 connection: network_cli tasks: - name: get configuration yamaha_network.rtx.rtx_command: commands: show config register: result - name: debug debug: msg: "{{ result.stdout_lines[0] }}" - name: set description yamaha_network.rtx.rtx_config: lines: - description 1 yamaha vars: ansible_network_os: yamaha_network.rtx.rtx ansible_user: loginusername ansible_ssh_pass: sshloginpassword ansible_become: true ansible_become_password: administratorpassword
結果↓
バッチリ。Configにもちゃんとdescription 1 yamaha
と書き込まれている。Ansibleがヤマハでも使えるとなれば、ちゃんと何ができるか調べないといかんな。
作業メモ
Ansibleのインストール作業自体に手間取ったのと、ヤマハのWebで公開されているサンプルコードがそのままコピーするとインデントがyml的におかしくて動かないので少し苦労した。
ymlもAnsibleも詳しくないので、もしかしたら、上に掲載したコードもインデントが正しくない部分があるかも。
やったこと
以下のインストール作業と、ルータにsshログイン用ユーザを作ること、WSLのsshコマンドで1度ルータにアクセスしておくこと。
インストール作業では、ansible.netcommonとparamikoを直接インストールする必要があったが、これは私の手順が悪いのかもしれない。PythonやAnsible、そしてUbuntu自体を使い慣れていないので、以下のコマンド群で(実行順を含めて)正しいのかよくわからない。もっとスマートな方法がある気がする。
sudo apt update sudo apt upgrade sudo apt-get update sudo apt-get install software-properties-common sudo apt-add-repository ppa:ansible/ansible sudo apt-get update sudo apt-get install ansible ansible --version ansible-galaxy collection install yamaha_network.rtx ansible-galaxy collection install ansible.netcommon sudo apt-get install python3-pip pip3 install paramiko
ブログ分離
テック系記事と社会系記事が混ざっているといいことないと思ったので、分離することにした。もともとのこっちはテック系。新しい方は選挙とか政局とか経済とか。日々雑談系はどっちにするか決めていない。新しい方はこちら
どっちも寂れそうだが、それでもごちゃまぜよりはよい気がする。
awk:変数でフィールドアクセスする際のメモ
優先順位操作の()を付けないパターン
echo 1 3 5 | awk '{_=1; print $_++; print $1, $_}'#シェル芸
— ot2sy39 (@ot2sy39) 2018年6月12日
— シェル芸bot (@minyoruminyon) 2018年6月12日
変数_に1を代入。
最初のprint。$_すなわち$1、つまり
1
を出力。そして$1をインクリメントし2に。変数_は1のまま。2個目のprint。$1と$_、つまり$1を2回出力。$1は2になってるので、
2 2
と出力される。
フィールド参照演算子の後に()を付けるパターン
echo 1 3 5 | awk '{_=1; print $(_++); print $1, $_}'#シェル芸
— ot2sy39 (@ot2sy39) 2018年6月12日
— シェル芸bot (@minyoruminyon) 2018年6月12日
変数_に1を代入。
最初のprint。$_すなわち$1、つまり
1
を出力。そして変数_をインクリメントし2に。$1は1のまま。2個目のprint。$1と$_、つまり$1と$2を出力。出力は
1 3
。
フィールドが非数値の場合
echo a 3 5 | awk '{i=1; print $i++; print $1, $i}'#シェル芸
— ot2sy39 (@ot2sy39) 2018年6月12日
— シェル芸bot (@minyoruminyon) 2018年6月12日
変数iに1を代入。
最初のprint。$iすなわち$1を出力するのだが、$1にインクリメント演算子がついているため数字にキャストされてしまうようで、aではなく0になってしまう。$1は0をインクリメントした1に。iは1のまま。
2個目のprint。$1と$i、つまり$1と$1を出力。$1は1になっているので、出力は
1 1
考察
$1="a"
な状態で、print $1++
が0を出力するのが、意外というか直感に反するというか。
ポストインクリメント演算子は評価したあとにインクリメントするのだから、
print $1++
はaを出力し、その後$1=1
になるなら分かるんだけど。
型キャストの方が先に行われてしまうのね。
ソートの注意メモ
テキストをソートするとき、漢数字などが直感に反するというのはある程度意識にあるが、 実は超基本的な半角アスキー文字群の順番もかなり変なことになっていて時々罠にはまるので、 備忘のためメモ。
一般的にどうかは分からないが、自分はゆるふわに「記号→数字→英大文字→英小文字」の順になっているような気がしている。 しかし、実際にはアスキーコード部分(0x01~0x7F)の並びは以下の様になっている。
16進コード | 種別 | 文字 |
---|---|---|
01 - 1F | 制御コード | |
20 | スペース | |
21 - 2F | 記号群1 | ! " # $ % & ' ( ) * + , - . / |
30 - 39 | 数字 | 0 1 2 3 4 5 6 7 8 9 |
3A - 40 | 記号群2 | : ; < = > ? @ |
41 - 5A | 英大文字 | A - Z |
5B - 60 | 記号群3 | [ \ ] ^ _ ` |
61 - 7A | 英小文字 | a - z |
7B - 7E | 記号群4 | { | } ~ |
注意しなければならないのは、こんな部分。
@
や;
などは数字よりも後- 英大文字と英小文字は連続しておらず、間に記号がいくつか入る
_
は英大文字より後だが英小文字よりは前!- カッコが支離滅裂で、
()
→ 数字 →<>
→ 英大文字 →[]
→ 英小文字 →{}
echo '0 9 A Z _ a z ! # @ ( [ {' | tr ' ' '\n' | sort#シェル芸
— ot2sy39 (@ot2sy39) 2018年3月13日
!
— シェル芸bot (@minyoruminyon) 2018年3月13日
#
(
0
9
@
A
Z
[
_
a
z
{ https://t.co/rJ296JfWM4
特に@
と_
が罠過ぎると思う。
forfiles.exe についてのメモ
条件に合致する多数のファイルに対して一括処理を施したいケースは多い。 Windowsでこれを実現してくれるのが、forfiles.exeというコマンド。
上の記事でも触れられているが、forfiles.exe の /C オプションの中では、 0x00の形式で特殊文字を使用できる。 記事中では0x09でタブですよと例示されているが、真に必要なのはダブルクォート。
/C オプションの引数はダブルクォートで実行コマンドを記述するのだが、 awkやsedのワンライナーを書こうとするとどうしても入れ子でダブルクォートをする必要がでてくるので、 0x22でくくってやるわけだ。
> forfiles.exe /S /D -2017/12/31 /M *.log /C "cmd /c gawk 0x22{print $0}0x22 @path"
このコマンドは、カレントディレクトリ以下にある2017/12/31以前の*.logファイルを{print $0}する。
awkでsqlite3.exeの即席フロントエンドを作った
Windowsでsqlite3を使うにはRubyやPHPなどから適当なライブラリ経由でアクセスする必要があると思い込んでいて、職場のリソース逼迫シンクライアントだと環境整えるハードル高いと感じてたのだが、↓のエントリをみて、sqlite3.exeとgawk.exeの2個だけでいけるじゃんと気づいた。
というわけで手元にあったsqlite3のDBを操作するラッパーというか即席フロントエンドをawkで作ってみた。
BEGIN { db = "test.db" command = "sqlite3 -header -column " db " \" %s \"" printf "command? " } /^\.exit$/ { exit } /^!/ { caution=1 sub(/^[!]/, "") } /^[0-9]+$/ { sql=sprintf("select * from testtable where id=%s", $1) } /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ { sql=sprintf("select * from testtable where ip=%s", $1) } /^[a-zA-Z][a-zA-Z0-9_-]+$/ { sql=sprintf("select * from testtable where host like \"%s%\"", $1) } sql!="" { print sql if(caution) { printf("execute? (y/n) ") getline can_execute if(can_execute ~ /^[Yy]/) system(sprintf(command, sql)) } else { system(sprintf(command, sql)) } caution==0 sql="" caution=0 printf "command? " }
骨子はこんな感じ。自分用なので正規表現は超手抜き。実行はgawk.exe -f test.awk
てな感じで実行するだけ。
サンプルはちょっとしたネットワーク管理表を操作するイメージコード。プロンプトで数値を入れると該当idのレコードを、ドット区切りの4つの数値を入れるとipアドレスとみなしてそのIPを持つホストのレコードを、英字で始まる1単語を入れるとその単語に前方一致するホストのレコードを表示する。
実使用しているコードはテーブルも1つじゃないし、もう少し複雑なクエリを出す構文なんかも用意してるけど割愛。常用するクエリをどんどん取り入れてやると捗る。
不安なときは入力の先頭に!をつけると、実行前に本当に実行するか聞いてくるようにした。
まあSQL文を手入力するような工程はあまりないだろうけど、手元のちょっとしたデータ整理用にsqlite3使うにはそこそこ便利で、即席な割にいいもの作った感がある。
言語設計者はこれを一億倍したくらいの充足感あるんだろーなー。
Android 5.1.1 が Nexus7 2012 w/3g に降ってきた
新機能なんかより、APN まわりの不具合が解消したかだけが気になるが、二日ほど使った感じでは、事象、頻度ともに変わってない。無念。
Nexus7 2012 w/3G に Android 5.1.1 キター.゚+.(・∀・)゚+.゚ でも充電不足でアップデート処理を開始してくれない orz pic.twitter.com/1L1KjHm0ot
— ot2sy39 (@ot2sy39) 2015, 5月 27
Android 5.1.1 へのアップデート完了。まだ違いはわからない。しばらく様子をみる。APN 回りの不具合治っていてくれ! pic.twitter.com/xQLsYjsGea
— ot2sy39 (@ot2sy39) 2015, 5月 27
Android511でもAPN周りの不具合が再発した。夢も希望もない。
— ot2sy39 (@ot2sy39) 2015, 5月 27