CLOSE

タグの継承を知らずにやらかした話(全1記事)

Ansibleのタグ継承を知らずに起きた失敗 タスク定義の変化は--list-tasksと--list-tagsで防ぐ

Ansibleユーザーのコミュニティミートアップ「Ansible Night」がオンラインで開催されました。今回は、Ansibleの最新技術キャッチアップとあわせて、Ansible利用時にやらかした話、ハマった(けどこうやって解決した)話を共有する場となりました。宮﨑氏は、Ansibleタグとその継承について発表しました。

指定タグのタスクのみ動かしたりスキップできるAnsibleのタグ

宮﨑啓史氏:それでは、LTを始めたいと思います。今日の内容は、以前詳しく調査していて、「はてなブログ」にまとめているので、ぜひあとでチェックしてもらえればと思います。

ブログのリンクは、「Twitter」と「connpass」にもスライドを共有しているので、そちらからたどってもらえれば幸いです。

まず自己紹介です。私、「zaki」と申します。Twitterとかブログとかをやっています。右下、Ansibleのドキュメントサイトを検索しやすくするChrome拡張を作っていたりするので、ぜひ使ってみてください。

所属は、株式会社エーピーコミュニケーションズの自動化グループで、Ansibleを使って、主にネットワークの自動化などを行う部署にいます。

それでは本題です。Ansibleのタグについてお話ししていきます。タスクとかRoleとか、Playbookのいろいろなところにセットしておくことで、右側に少し書いていますが、指定したタグのタスクだけを動かすとか、逆に指定タグのみ省略して動かすということが、Ansibleのオプションで指定できます。

例えば開発中のタスクだけを動かしたいとか、逆に、処理に時間がかかるタスク、例えば設定をグリグリ更新するとか、そういうものをスキップすることが簡単にできるようになります。

タグで動かないようにしていたつもりのタスクが動いてしまった

この機能説明で何をやらかしたかがピンとくるかと思うのですが、ちょっと前に、タグを使って動かないようにしていたつもりのタスクをうっかり動かしてしまいました。

今日は、なぜこんなことが起きたのかについて、タグと継承という仕組みについてお話ししようと思います。

AnsibleのPlaybookにタグをセットできるとお話ししましたが、この設定は継承されるという特徴があります。

どういうことかというと、左側は、Playbookの例ですが、Roleを呼び出しています。install_serverというRoleを呼び出して、Roleの呼び出しにintallというタグをセットしています。

そうするとどうなるか。呼び出す右側にRole書いています。ここではタグにneverとつけていますが、このneverに呼び出し元のinstallというタグが追加されます。そういうタスクの定義が、実行時にそういうふうに変化してしまいます。

この結果どういうことが起こり得るかというと、Roleのタスクを作成している時は、ここ書いているとおり、neverという明示的にタグを指定しなければタスクが動かなくなるという特殊なタグを指定しています。このneverのタスクは動かすと明示的に指定しなければ動きません。そういうタスクのつもりでいました。

ところが、Roleの呼び出し元で、installというタグを設定すると、これは継承の動作で、呼び出されるタスクにもinstallが追加されてしまいます。

そうすると、このRoleのタスクは、neverで動かないようにしていたつもりが、呼び出し元にセットしているinstallというタグを指定することで、neverに関係なくタスクが動いてしまうという動作になってしまうんですね。

--list-tasksや--list-tagsのオプションを活用する

これをどうすれば防げたかというと、まずAnsibleのコマンドオプションに--list-tasksや--list-tagsという、実行するタスクやタグの一覧を確認できるオプションがあるので、タグをけっこう使っている方は、ぜひこのオプションを使って、想定どおりのタスクが呼ばれるかどうかを確認してほしいと思います。

チェックできるタグの一覧で、継承済みのものが確認できるので、想定していないタグの継承が行われていないかもこちらで確認が可能です。

時間の都合で特に説明をしなかったのですが、Ansibleの外部ファイル読み込みは、includeとimportという2種類の仕組みがあります。そのうち継承が行われるのは、スタティックな読み込みを行うimportを使った読み込みの場合になります。includeの時は継承はされません。

じゃあincludeを使えば安全かというと、必ずしもそういうわけではなくて、includeは実行時にダイナミックにタスク読み込みを行うので、--list-tasksとかを使った一覧チェックができないという特徴があります。そのため、注意が必要です。

今日はタグの話しかしなかったのですが、実はタグだけではなくて、whenとかcheck_modeとか、意外といろいろなものが継承されるので、呼び出し元で使う場合は、ぜひ注意をしてください。

このあたりは全部、最初にも紹介した「はてなブログ」にまとめているので、ぜひあとでチェックしてもらえればなと思います。

以上で終わります。ありがとうございました。

続きを読むには会員登録
(無料)が必要です。

会員登録していただくと、すべての記事が制限なく閲覧でき、
著者フォローや記事の保存機能など、便利な機能がご利用いただけます。

無料会員登録

会員の方はこちら

関連タグ:

この記事のスピーカー

同じログの記事

コミュニティ情報

Brand Topics

Brand Topics

  • 今までとこれからで、エンジニアに求められる「スキル」の違い AI時代のエンジニアの未来と生存戦略のカギとは

人気の記事

新着イベント

ログミーBusinessに
記事掲載しませんか?

イベント・インタビュー・対談 etc.

“編集しない編集”で、
スピーカーの「意図をそのまま」お届け!