【自己紹介】
エンジニアになって半年ほど経ちました。
この半年間、ネットワーク、Ansible、pythonを中心に勉強しており、CCNAとAnsibleスペシャリスト認定試験は合格できたので最近はひたすらpythonでansibleの自作モジュール(主にcisco機器を扱うためのモジュール)開発に取り組んでいるところです。
目指せ、脱初心者!
【本題】
今回アドベントカレンダーに参加させて頂くにあたり、テーマが、好きなmoduleの紹介や使い方のtips、となっていたのでエンジニアになりたての私にはまだ高度な内容が思いつかないまま担当の日を迎えてしまいました。
どうしても記事に起こすほどのレベルの話題が見つからなかったので、今回はひたすらつまずいた点や失敗したことを列挙していこうと思います。
あまり新しい発見はご提供できないかもしれません(申し訳ない)。
①copyモジュールはリモートホストとローカルホストでどちらのfact変数を使うのか?
例えば、以下のような場合に、生成されるファイルの中身はリモートホストとローカルホストでどちらの方のfacts変数が使われるのでしょうか。
- host: hogehoge
gather_facts: yes
tasks:
- name: write gather_fact file
copy:
content: "{{ ansible_hostname }}"
dest: ~/gather_test.txt
force: no
答えとしては、リモートホスト側のホスト名がファイルに記入されるようです。
上記のようなファイルをリモート側に生成したい場合、lineinfileとcopyモジュールのどちらを使うべきか迷ったのがきっかけでこの疑問が湧きました。copyモジュールはローカル側にあるファイルなどをリモートにコピーしたい時に使われるのでlineinfileの方が用途としては合っているのではと思いましたが、新しいファイルを作る際、copyモジュールの方でもlineinfileと同じ結果を得られるようです。
ちなみに私はcopyモジュールを使うときはほぼ習慣的にforce: noを設定しています。
こうしておけば、ファイルが既に存在していても知らないうちに置き換わってしまうリスクを無くす事ができるからです。
②playbookのループってどんな動きをするの
- hosts: hogehoge
tasks:
- name: create users
user:
name:
- ansible
- redhat
- ibm
groups:
- ansible_friends
出力結果
・・・省略
Cannot create user "['ansible', 'redhat', 'ibm']"
リストひとかたまりをユーザー名として扱ってしまうようです。
なので、
- hosts: hogehoge
tasks:
- name: create users
user:
name: "{{ item }}"
groups:
- ansible_friends
with_items:
- ansible
- redhat
- ibm
ユーザーを作成する時は必ずループで回しましょう。
③commandモジュールとshellモジュールの違い
- hosts: hogehoge
tasks:
- name: output file from shell module
shell: cat ~/username/; cat test file.txt
- name: output file from command module
command: cd ~/username/; cat test file.txt
上記のplaybookの場合、output file from shell moduleのタスクは成功しますが
output file from command moduleのタスクは失敗します。
shellモジュールは環境変数が使えるところがcommandモジュールとの違いとAnsible公式マニュアルには書いてありましたが、エンジニアなりたてだったので最初は意味がわかりませんでした。
;の他にも、シェルでコマンドを打つときに使う><や|などはcommandモジュールでは使えません。
【最後に】
私が好きなモジュールはuntilです。
このモジュールはプレイブックの実行ログに意図した文字列が出てくるまでひたすら待機し、出てきたら次のタスクに移る、という使い方ができます。
こういったモジュールを駆使していく事で人間がわざわざ常時監視する必要が無くなるので、いわゆる「働き方改革」につながると思っています。
これで、夜間作業なども近い将来やらなくて良いようになるといいですね。起きたら全てのタスクが全自動で終わっている世界の実現。ええ。自社だけでもまずは実現して見せますよ(⁎⁍̴̆Ɛ⁍̴̆⁎)
以上です。
また苦労したことが出てきたら随時更新していこうと思います。
また、アドベントカレンダー以外にも自作モジュールを作る際のTipsなども投稿していこうと思います。