Python Ansibleの自作モジュール

Python学習【365日チャレンジ!】261日目のマスターU(@Udemy11)です。

年をとると忘れっぽくなるということは耳にしていましたが、実際自分のことになるとは思ってもいませんでした。

ほんの数秒前に「これしよう」と思って動き出したところ、声をかけられて意識が違うところに向くと、数秒前にしようとしていたことが思い出せなくて困ることがあります。

もしかしたら、若年性痴呆症?なんてことを心配してしまうのですが、ほんと記憶力が落ちてきているような気がします。

Python学習についても、しっかりと復習しないとすぐに忘れちゃうんですよね~。

学習濃度の濃い学習法より、少しずつ繰り返し学習する方が記憶に定着するらしいので、今日もPython学習を進めていきたいと思います。

昨日の復習

昨日は、Ansibleの自動化でつまづいたポイントを整理しました。

easy_installで失敗するかなと思いつつ、講座の中のコードのまま使って予定通りエラーを起こしてしまいました。

また、無意識にタイプミスをしてしまうので、正確なタイピングが必要ですが、タイプスピードが落ちてしまうので、コードを書くスピードを上げるには、タイピングの練習が必要がもしれませんね。

日本語のタイピングはかなり速く打てるように北斗の拳のタイピングソフトで鍛えたのですが、アルファベットを打つとなると、英単語が出てこないし、自信がないので、かなり遅くなるうえ、タイプミスも増えちゃうんですよね。

詳しくは昨日の記事をごらんください。

今日は、Ansibleの自作モジュールについて学習します。

ansible.cfg

これまでのサーバー構築では、Vagrantを使ってmain,server1,server2というサーバーを構築しましたが、私のようになにかトラブルがあってsever1などをvagrant destory sever1等のコマンドで削除してからもう一度再構築している場合、mainからsshで他のサーバーにssh接続ができない場合があります。

これは、削除する前のサーバーのホストキーがmainに残されていることで、ホストキーのチェックをしたときに同じキーと認識されるためです。

このことを回避するために、Ansibleを実行したときに最初に読み込まれる設定ファイルに必要なコードを記述しておく必要があります。

ansible_projectフォルダの中にansible.cfgというファイルを作成します。

[defaults]
host_key_checking = False

このファイルを作成しておけば、ホストのチェックをしないので、サーバーを削除して再構築した後でも問題なくサーバーにssh接続できるようになります。

特に問題なければ必要がないかと思うのですが、私の場合、この症状がおこったので、とりあえず紹介しておきます。

library/sum.py

続いて自作モジュールを作成しますが、ansible_projectの下にlibraryフォルダを作成し、その中にsum.pyファイルを作成します。

内容は下記のとおり記述します。

from ansible.module_utils.basic import AnsibleModule


def main():
    module = AnsibleModule(argument_spec=dict(
        num=dict(type='int', required=True)
    ))

    result = dict(
        changed=False,
        sum = 0
    )

    num = module.params['num']

    for i in range(1, num+1):
        result['sum'] += i

    module.exit_json(**result)


if __name__ == '__main__':
    main()

公式ドキュメントの記述方法に従って、1行目でansible.module_utils.basicをインポートします。

続いて4行目からmain関数を記述していきます。

5行目は、AnsibleModule()の引数にargument_spec=dict()の中に辞書型の変数numを定義してmoduleに代入します。

9行目から12行目では、実行結果を辞書型にしてchangedsumのデフォルトの値を指定しています。

14行目では、別ファイル(site.ymlで指定するnumの値がパラメータとして変数numに代入されます。

16行目、17行目では、forループを使って1から10まで足す計算をしています。

19行目は、module.exit_jsonを使ってresultの値を展開して値を入れて結果を返すコードになっています。

22行目23行目は、mainなら実行するいつものコードです。

続いて、値を読み込むためのsite.ymlファイルを変更しましょう。

site.yml

サーバーの構築ではrolesを使ってcommonwebserverを指定しましたが、今回はtasksを使用してsum.pyで使う値を指定します。

内容は下記のとおり。

---

- hosts: webservers
  tasks:
    - name: sum module
      sum:
        num: 10
      register: sum_result

    - debug: var=sum_result

...

5行目でタスクの名前はsum_moduleとして、sumモジュールを指定しています。

次に6行目と7行目でsumモジュールの中の変数num10と定義しています。

モジュールから値を受け取るには、registerを使用して任意の変数を指定し、debugvarregisterを入れてやります。

これでこれまでのように、sshでmainサーバーにログインして、ファイルがある階層に移動した後、ansible-playbook -i inventories/hosts site.ymlを実行すれば、次のような結果を得ることができます。

sumだけ表示

上記の実行では、sum_resultとしてchangedfailedsumが表示されていますが、計算結果のsumだけを表示することもできます。

site.ymlの10行目を次のように変更します。

    - debug: var=sum_result.sum

変更した後の実行結果は次のようになります。

自作モジュール Python Ansible

sumに変わって、sum_result.sumだけが表示されています。

条件を付けて表示

続いて、結果を表示するかどうかの条件をつけて表示非表示をコントロールしてみます。

    - debug: var=sum_result
      when: sum_result.sum > 100

whenを使って、sumの結果が100以上の場合にdebugを表示するコードになります。

自作モジュール Python Ansible

sumの結果は55なので、100より小さいため、表示がスキップされています。

まとめ

酒井さんの講座は、ここまで進んでくるとPythonの基礎知識が頭に入っているという前提で進むので、1度学習しただけでは理解ができません。

Udemy講師 酒井さん プログラミング Python

もちろん、きちんとしたPythonの基礎知識がある人はすっと頭の中に入っていくのかもしれませんが、私には何をやっているのかさえ理解するのが難しいことが多いです。

とはいっても、ネットで調べながら繰り返し学習することで少しずつ何をしているのかわかるようになります。

ま~、パズルみたいなもんですね。

はたしてどのような場面で活躍するのかは想像も付きませんので、実践しだしたら「あのときやってたことはこれか!」という感じになるのかもしれませんね。

それでは、明日もGood Python!