noharaのブログ

興味のあることについてゆる~く書きます

jinja2で繰り返しのテキストを生成する

flask, ansibleでよくjinja2使っているのですが、単体で使ったことがなかったのでメモ

繰り返しのテキストを生成する2パターンを試した

テンプレートファイルをインポートして表示するパターン

ググったらよく出てくるパターン、説明不要

ソースコード

import jinja2
from jinja2 import Template, Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
tmpl = env.get_template('temp.txt')

weapons = ["スシ", "プラコラ"]
print(tmpl.render(weapons=weapons))

・テンプレートファイル(temp.txt)

{% for w in weapons %}
{
  "type": "message",
  "message": {
    "type": "text",
    "text": "{{ w }}"
  }
},{% endfor %}

・出力

{
  "type": "message",
  "message": {
    "type": "text",
    "text": "スシ" 
  }
},
{
  "type": "message",
  "message": {
    "type": "text",
    "text": "プラコラ"
  }
},

テンプレートをソースコード内で生成する方法

わからなかったので調べた。
jinja2公式によるとfrom_stringというものがあるらしい。

ソースコード

import jinja2
from jinja2 import Template, Environment

temp = """
{% for w in weapons %}
{
  "type": "message",
  "message": {
    "type": "text",
    "text": "{{ w }}"
  }
},{% endfor %}
"""
weapons = ["スシ", "プラコラ"]
tmpl = Environment().from_string(temp)
print(tmpl.render(weapons=weapons))

・出力
1つめのパターンと同じなので省略

ブロードキャストコマンドとしてのansible

複数のホストに入って同じコマンドの結果が欲しいシチュエーションは多いと思います。
Tera Termのブロードキャストコマンドやシェルスクリプトでがんばってもいいのですが、今回はansibleでやってみます。

構成としては、ansible対象ホストにubuntucentosを一台ずつ用意しています。
ansibleのバージョンは2.4で検証してます。

まずは簡単な例から、hostnameを出力するだけのパターン。 -mでモジュールを指定して、-aで引数を渡しています。

ansible -i hosts vagrant -u vagrant -k -m shell -a "hostname"
SSH password:
192.168.33.11 | SUCCESS | rc=0 >>
vagrant-centos

192.168.33.12 | SUCCESS | rc=0 >>
vagrant-ubuntu-trusty-64

ちなみにplaybookとして書くとこう
$ ansible-playbook -i hosts hostname.yml -k -u vagrant

# hostname.yml
---
- hosts: vagrant
  tasks:
  - name: echo hostname
    shell: hostname
    register: result
  - debug: var=result.stdout

次に、上記で書いたplaybookを実行したうえで値を別のplaybookで流用したい場合。
例として、ansible実行ホストのカレントディレクトリにtemp.logとして出力するplaybookを書いてみます。
ポイントは - {{hostvars['192.168.33.1x']['result']['stdout']}}で別のplaybookの値を参照している部分 - connection: localでローカルに対して実行している点

ansible-playbook -i hosts local.yml -k -u vagrant

# local.yml
---
- import_playbook: hostname.yml
- hosts: localhost
  connection: local
  tasks:
    - name: log export
      copy:
        mode: 0644
        dest: "./temp.log"
        content: "{{hostvars['192.168.33.11']['result']['stdout']}}\n{{hostvars['192.168.33.12']['result']['stdout']}}/n"

出力結果

# temp.log
vagrant-centos
vagrant-ubuntu-trusty-64

まとめ

  • ansibleはワンライナーとしての使い方もできる
  • hostvarsを利用することで柔軟な書き方ができる

キーボード初心者がHHKB2つ買いました

先日、ノリと勢いでHHKBを2つ買いました。
初めは有線接続のPD-KB420Bを購入し、家で使用したその日に無線も欲しいなと思ってPD-KB620Bも買いました。

今まではキーボード安くてもいいや派だったのですが、 先日高いマウスMX ERGOを買ってしまったので流れでキーボードも新調しました。

有線無線が変わるだけでスペックとしては同等のようです。(詳しくは↓の公式HP)
個人的な感想としては、PD-KB620(Bluetooth)のほうがキー軽いと思っていたのですが、公式曰く同じとのこと。

どっちがおすすめか

値段は2018年3月現在で、PD-KB620(Bluetooth)が5000円程高かったです。
これを我慢できるのであれば、PD-KB620(Bluetooth)をお勧めします。
バッテリーは単三乾電池2本ですが、最悪USBポートからの給電にも対応しているので。

ちょっとした不具合

PD-KB620(Bluetooth)のほうで、PCとのBluetooth接続がちょくちょく切れるということがありました。 詳しい原因は追えていませんが古い無線キーボード(私の場合はLogicool)のドライバを消してPC再起動でその後問題なく動いています。

皆さんもいいキーボードを買って快適なVim活をしましょう!

Happy Hacking Keyboard HHKB Professional JP | 仕様 | |PFU ← PD-KB420
Happy Hacking Keyboard HHKB Professional BT | 仕様 | |PFU ← PD-KB420(Bluetooth)