ot2sy39's note

twitter 140文字じゃ書けないときの外部エントリみたいな

NVR510でAnsibleを試してみた

ヤマハRTXシリーズのAnsible対応はないものだと諦めていたのに、昨日突如リリースされた。

www.rtpro.yamaha.co.jp

さっそく、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

結果↓

f:id:ot2sy39:20210330101410p:plain
サンプルコードの実行結果

バッチリ。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

ブログ分離

テック系記事と社会系記事が混ざっているといいことないと思ったので、分離することにした。もともとのこっちはテック系。新しい方は選挙とか政局とか経済とか。日々雑談系はどっちにするか決めていない。新しい方はこちら

ot2sy39-soc’s blog

どっちも寂れそうだが、それでもごちゃまぜよりはよい気がする。

awk:変数でフィールドアクセスする際のメモ

優先順位操作の()を付けないパターン

  1. 変数_に1を代入。

  2. 最初のprint。$_すなわち$1、つまり1を出力。そして$1をインクリメントし2に。変数_は1のまま。

  3. 2個目のprint。$1と$_、つまり$1を2回出力。$1は2になってるので、2 2と出力される。

フィールド参照演算子の後に()を付けるパターン

  1. 変数_に1を代入。

  2. 最初のprint。$_すなわち$1、つまり1を出力。そして変数_をインクリメントし2に。$1は1のまま。

  3. 2個目のprint。$1と$_、つまり$1と$2を出力。出力は1 3

フィールドが非数値の場合

  1. 変数iに1を代入。

  2. 最初のprint。$iすなわち$1を出力するのだが、$1にインクリメント演算子がついているため数字にキャストされてしまうようで、aではなく0になってしまう。$1は0をインクリメントした1に。iは1のまま。

  3. 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 { | } ~

注意しなければならないのは、こんな部分。

  • @;などは数字よりも後
  • 英大文字と英小文字は連続しておらず、間に記号がいくつか入る
  • _は英大文字より後だが英小文字よりは前!
  • カッコが支離滅裂で、()→ 数字 →<>→ 英大文字 →[]→ 英小文字 → {}

特に@_が罠過ぎると思う。

forfiles.exe についてのメモ

条件に合致する多数のファイルに対して一括処理を施したいケースは多い。 Windowsでこれを実現してくれるのが、forfiles.exeというコマンド。

www.atmarkit.co.jp

上の記事でも触れられているが、forfiles.exe の /C オプションの中では、 0x00の形式で特殊文字を使用できる。 記事中では0x09でタブですよと例示されているが、真に必要なのはダブルクォート。

/C オプションの引数はダブルクォートで実行コマンドを記述するのだが、 awksedワンライナーを書こうとするとどうしても入れ子でダブルクォートをする必要がでてくるので、 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を使うにはRubyPHPなどから適当なライブラリ経由でアクセスする必要があると思い込んでいて、職場のリソース逼迫シンクライアントだと環境整えるハードル高いと感じてたのだが、↓のエントリをみて、sqlite3.exeとgawk.exeの2個だけでいけるじゃんと気づいた。

d.hatena.ne.jp

というわけで手元にあった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 まわりの不具合が解消したかだけが気になるが、二日ほど使った感じでは、事象、頻度ともに変わってない。無念。