😀

【ansible】僕がansibleを書くときに気をつけている事

2022/11/28に公開

昔のバージョンに比べて大分便利(自分の書き方が古く)になってきたので、自分のdotfileの管理をansibleに切り替えて色々触ってみた時のメモ

環境

  • Mac OSX Yosemite(10.10.5)
    • python 2.7.10
      • ansible 1.9.4

参考にしたサイト

Best Practicesのディレクトリレイアウトは目を通す

色んなリポジトリを見ていると結構色んなディレクトリ構成でansibleを書いているような気もしますが、公式ドキュメントのディレクトリレイアウトに記載されてあるのでそれを参考にしたディレクトリ構成で書こう(あるいは目指す)

判定に関する事(when系)

モジュールだけでは解決できない問題が色々とある。

playbook実行結果のchangedは常に対象ホストの振舞いが変わった時だけchangedにする

で記載したが

自分が書いたplaybookであれば、これは気にしなくてよいchangedだ。などansibleの実行結果を見てすぐ判断できるだろうが、このplaybookを他人が実行した時に changed がでた場合に「おや、何か設定が何か変わったのか?」と思ってしまう。
changedは対象のOSの振る舞いが変わった時だけchangedになる方が望ましいと思う。

そうしないとchangedが怖くなり、段々production,staging,develop等で共通のtaskが書けなくなり、各環境に応じたtasksが出来上がっていく過程に入る。その時点で結構「秘伝のタレ」は進んでいるはず。
何のための冪等性だがわかんなくなるよね・・・って感じる。

whenは早いのでなるべく実行条件分岐はなるべくwhenで書く

体感速度的な話なのですが、changed_whenよりwhenのほうがplaybook実行の体感速度的に早いと感じることが多々あるのでwhenを使おう
(おそらくchaged_whenはactionを実行してからwhen判定を行っているように感じる。間違っていたらごめんなさい)

OS固有のmoduleの場合には when: "ansible_os_family == '{uname}'" をつける

例えばnkfのインストールするタスクを書く際にターゲットOSをOSXに限定した場合ならこう書くと思う

- name: Install the nkf from homebrew
  homebrew: name=nkf state=present

でもnkfってゲストOSでも必要だよね?ってなったときに無駄なrolesを作ってしまわないようにこう書けば一つのroleで違うOSに同じ動作を保証することができる

- name: Install the nkf from homebrew
  homebrew: name=nkf state=present
  when: "ansible_os_family == 'Darwin'"

- name: Install the nkf from yum
  yum: pkg=nkf state=present
  when: "ansible_os_family == 'RedHat'"

ignore_errosよりもfailed_when: no

エラーになっても無視していいよってのでignore_errorsあるが、これなんか

「キモい・・・・」

というか、playbook実行時にignore_errorsが発生すると表示上はfailedが表示される。

コンソールで赤色の何かが出るのは、ansibleじゃなくても何か後ろめたさがある。

ignore_errorsでやりたいことはfailを無視することだから、無視するならfailを発生させないように

failed_when: no

と書こう。
そうすればコンソールでfailedは出てこない。

依存ロールが出てきてしまったならmetaを使う

例えばCUIでchromeを操作するchrome-cliをインストールする場合にchromeが必要になる。

その場合のtaskの書き方はこうしている

chrome-cliをインストールするタスク

- name: Install the chrome-cli in the brew.
  homebrew: name=chrome-cli state=present
  when: "ansible_os_family == 'Darwin'"

chrome-cliをhomebrewでインストールするだけのタスク

google-chromeをインストールするタスク

- name: Install the google-chrome in the brew-cask
  homebrew_cask: name=google-chrome state=present
  when: "ansible_os_family == 'Darwin'"

google-chromeをhomebrew-caskでインストールするだけのタスク

chrome-cliがhomebrew/brew-cask/google-chromeの依存関係のmeta

dependencies:
  - { role: homebrew/brew-cask/google-chrome }
chrome-cli
├── meta
│   └── main.yml
└── tasks
    └── main.yml

google-chrome
└── tasks
    └── main.yml

2つのロールを書いてmetaで依存関係を記載する

wgetしたいと思った時はget_urlで

表題の通り。自分メモ用

ファイル・ディレクトリの操作

これもよく忘れてansibleモジュールのドキュメントをよく見るので自分用メモ

ファイル・ディレクトリの存在チェックはstat

上記のexamples見ればだいたいのことはできる

最後に

追記があったら追加していきます。

Discussion