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行目では、実行結果を辞書型にしてchanged
とsum
のデフォルトの値を指定しています。
14行目では、別ファイル(site.yml
で指定するnum
の値がパラメータとして変数num
に代入されます。
16行目、17行目では、for
ループを使って1から10まで足す計算をしています。
19行目は、module.exit_json
を使ってresult
の値を展開して値を入れて結果を返すコードになっています。
22行目23行目は、main
なら実行するいつものコードです。
続いて、値を読み込むためのsite.yml
ファイルを変更しましょう。
site.yml
サーバーの構築ではroles
を使ってcommon
とwebserver
を指定しましたが、今回は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
モジュールの中の変数num
に10
と定義しています。
モジュールから値を受け取るには、register
を使用して任意の変数を指定し、debug
でvar
にregister
を入れてやります。
これでこれまでのように、sshでmain
サーバーにログインして、ファイルがある階層に移動した後、ansible-playbook -i inventories/hosts site.yml
を実行すれば、次のような結果を得ることができます。
sumだけ表示
上記の実行では、sum_result
としてchanged
とfailed
、sum
が表示されていますが、計算結果のsum
だけを表示することもできます。
site.yml
の10行目を次のように変更します。
- debug: var=sum_result.sum
変更した後の実行結果は次のようになります。
sum
に変わって、sum_result.sum
だけが表示されています。
条件を付けて表示
続いて、結果を表示するかどうかの条件をつけて表示非表示をコントロールしてみます。
- debug: var=sum_result
when: sum_result.sum > 100
when
を使って、sum
の結果が100以上の場合にdebug
を表示するコードになります。
sum
の結果は55
なので、100より小さいため、表示がスキップされています。
まとめ
酒井さんの講座は、ここまで進んでくるとPythonの基礎知識が頭に入っているという前提で進むので、1度学習しただけでは理解ができません。
もちろん、きちんとしたPythonの基礎知識がある人はすっと頭の中に入っていくのかもしれませんが、私には何をやっているのかさえ理解するのが難しいことが多いです。
とはいっても、ネットで調べながら繰り返し学習することで少しずつ何をしているのかわかるようになります。
ま~、パズルみたいなもんですね。
はたしてどのような場面で活躍するのかは想像も付きませんので、実践しだしたら「あのときやってたことはこれか!」という感じになるのかもしれませんね。
それでは、明日もGood Python!