これは Ansible 3 Advent Calendar 2019 の6日目の記事です。(さかのぼり投稿)
■ はじめに
当アドベントカレンダーの 5日目の記事は、既存の 0,1 が書かれているファイルを反転させて別のファイルを生成するという記事でした。
おもわず別解を考えてみたいネタで、「是非 :)」とのことだったので考えました。
■ 使用するファイル
元の記事と同じファイルを用意しおきます。
$ cat before_number.txt 001010101010101010010101 111000101010100111010011 100001010100001010101010 110101010101010010101010 101010100101010101010000 111111100000111010000000
■ Playbook
処理の概要は以下のとおりです。
- とりあえず、
copy モジュールでファイルをそのままコピー replaceモジュール で0をxに、1をyに置換replaceモジュール でxを1に、yを0に置換
Playbook は以下のとおりです。
- main.yml
- hosts: localhost connection: local gather_facts: no tasks: # まずそのままコピー - name: copy copy: src: before_number.txt dest: after_number.txt # 0 と 1 をそれぞれ仮の文字に置換 - name: replace to temporary chars replace: path: after_number.txt regexp: "{{ item.regexp }}" replace: "{{ item.replace }}" loop: - regexp: 0 replace: "x" - regexp: 1 replace: "y" # True にならないようにクォーテーションが必要 # 仮の文字を反転した 0/1に置換 - name: replace to 0/1 replace: path: after_number.txt regexp: "{{ item.regexp }}" replace: "{{ item.replace }}" loop: - regexp: "x" # もともと 0 だったところ replace: 1 # 1 に置換 - regexp: "y" # もともと 1 だったところ replace: 0 # 0 に置換
■ Playbook実行
Playbook を実行します
$ ansible-playbook -i localhost, main.yml
PLAY [localhost] **************************************************************************************************
TASK [copy] *******************************************************************************************************
changed: [localhost]
TASK [replace to temporary chars] *********************************************************************************
changed: [localhost] => (item={'regexp': 0, 'replace': 'x'})
changed: [localhost] => (item={'regexp': 1, 'replace': 'y'})
TASK [replace to 0/1] *********************************************************************************************
changed: [localhost] => (item={'regexp': 'x', 'replace': 1})
changed: [localhost] => (item={'regexp': 'y', 'replace': 0})
PLAY RECAP ********************************************************************************************************
localhost : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
$
作成されたファイルの中身を見てみます。
$ cat after_number.txt 110101010101010101101010 000111010101011000101100 011110101011110101010101 001010101010101101010101 010101011010101010101111 000000011111000101111111
無事に before_number.txt と 0,1 が反転したファイルが生成されました。
おまけ的ですが、after_number.txt の内容が書き換わっていく様子のです。
0/1 を反転したファイルを生成する様子 pic.twitter.com/vJ3A6tnBgp
— よこち(yokochi) @ Ansible実践ガイド 第3版 (@akira6592) 2019年12月14日
■ その他考えたこと
この方法に至るまでに考えたことです。
- せっかく2進数なので、Pythonの ビット反転の
~を使えたら良いなと思ったけど、うまく 組み込めなかった - replace モジュールを使ってみよう
0を1に、1を0にいっぺんに置換できればいいけど、できなさそうだ- (
ternayフィルターを使えばできただろうか・・) - 2段階の置換でどうにかできた
- ただ、この方法だと冪等性がなく、毎回
changedになってしまう - 中間ファイルの生成処理を挟めばできるかな、まぁいいか。