LoginSignup
5
4

More than 5 years have passed since last update.

Ansible初心者(私)がつまずいたポイントをできる限り列挙する

Last updated at Posted at 2018-12-11

【自己紹介】
エンジニアになって半年ほど経ちました。
この半年間、ネットワーク、Ansible、pythonを中心に勉強しており、CCNAとAnsibleスペシャリスト認定試験は合格できたので最近はひたすらpythonでansibleの自作モジュール(主にcisco機器を扱うためのモジュール)開発に取り組んでいるところです。
目指せ、脱初心者!

【本題】
今回アドベントカレンダーに参加させて頂くにあたり、テーマが、好きなmoduleの紹介や使い方のtips、となっていたのでエンジニアになりたての私にはまだ高度な内容が思いつかないまま担当の日を迎えてしまいました。
どうしても記事に起こすほどのレベルの話題が見つからなかったので、今回はひたすらつまずいた点や失敗したことを列挙していこうと思います。
あまり新しい発見はご提供できないかもしれません(申し訳ない)。

①copyモジュールはリモートホストとローカルホストでどちらのfact変数を使うのか?

例えば、以下のような場合に、生成されるファイルの中身はリモートホストとローカルホストでどちらの方のfacts変数が使われるのでしょうか。

test.yml
- 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のループってどんな動きをするの

test2.yml
- hosts: hogehoge

  tasks:
    - name: create users
      user:
        name: 
          - ansible
          - redhat
          - ibm
        groups:
          - ansible_friends

出力結果

・・・省略
Cannot create user "['ansible', 'redhat', 'ibm']"

リストひとかたまりをユーザー名として扱ってしまうようです。

なので、

test2.yml
- hosts: hogehoge

  tasks:
    - name: create users
      user:
        name: "{{ item }}"
        groups:
          - ansible_friends
        with_items:
          - ansible
          - redhat
          - ibm

ユーザーを作成する時は必ずループで回しましょう。

③commandモジュールとshellモジュールの違い

test3.yml
- 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なども投稿していこうと思います。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4