質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Q&A

解決済

1回答

2703閲覧

Ansibleモジュールでの繰り返し処理の書き方

melonbomber

総合スコア84

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

0グッド

0クリップ

投稿2019/03/01 08:55

編集2019/03/01 08:58

前提・実現したいこと

Ansible 2.7.6を利用し始めた、Ansible初心者です。
Ansible Up and Running, 2nd Editionという書籍を参考に、Ansibleを勉強しています。
繰り返し処理で躓いたところがありますので、知見のある方に教えを請いたいです。

Ansibleモジュールによっては繰り返しパラメータの受け取り方が違う、ということかと思いますが、いまいちなぜ同じようなloopの書き方でaptモジュールとdjango_manageモジュールで挙動が異なるか、わかりません。django_manageの場合、どう繰り返し処理を書くのがいいのかご助言ください。

動かないわけではなく、腑に落ちない状態です。。。

発生している問題・エラーメッセージ

Ansible 2.5からloopの記述が変わった、とマニュアルにあります。(2.7しか知らないです。。。)
aptモジュールやyumモジュールだと、以下のwith_itmesを記述をすると、warningが発生します。

yaml

1 - name: install apt packages 2 apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 3 become: True 4 with_items: 5 - git 6 - libjpeg-dev

これはこう書き直しました。(warningは出なくなりました)

yaml

1 - name: install apt packages 2 apt: 3 name: "{{ packages }}" 4 update_cache: yes 5 cache_valid_time: 3600 6 become: True 7 vars: 8 packages: 9 - git 10 - libjpeg-dev

少し状況が違うのですが、django_manageというモジュールで同じように
書き直したところ、エラーとなってしまいました。繰り返し処理ではなく、
"migrate"と"collectstatic"を一緒に引数として渡してしまっているような感じになります。

以下の記述だと、with_itmesを使っているのにwarningが出ない。成功する

yaml

1 - name: apply migrations to create the database, collect static content 2 django_manage: 3 command: "{{ item }}" 4 app_path: "{{ proj_path }}" 5 virtualenv: "{{ venv_path }}" 6 with_items: 7 - migrate 8 - collectstatic 9

aptのケースと同じように書き直したのに、エラーになる

yaml

1 - name: apply migrations to create the database, collect static content 2 django_manage: 3 command: "{{ action }}" 4 app_path: "{{ proj_path }}" 5 virtualenv: "{{ venv_path }}" 6 vars: 7 action: 8 - migrate 9 - collectstatic

以下がエラーメッセージ

error

1TASK [apply migrations to create the database, collect static content] ************************************************* 2fatal: [web]: FAILED! => {"changed": false, "cmd": "./manage.py ['migrate', 'collectstatic']", "msg": "stdout: Unknown command: '[migrate,'\nType 'manage.py help' for usage.\n\n:stderr: Unknown django command: ['migrate', 'collectstatic']"}

再度以下のように直してとりあえず解決(with_itemsを使わないようにしている。varsをdictionaryにしたらうまくいった)

- name: apply migrations to create the database, collect static content django_manage: command: "{{ item.name }}" app_path: "{{ item.proj_path }}" virtualenv: "{{ item.venv_path }}" loop: - { name: "migrate", proj_path: "{{ proj_path }}", venv_path: "{{ venv_path }}" } - { name: "collectstatic", proj_path: "{{ proj_path }}", venv_path: "{{ venv_path }}" }

補足情報(FW/ツールのバージョンなど)

loopの書き方の問題なのか、django_manageモジュールに渡すパラメータが複数の時はそれに合わせてdictionaryにしないといけないのか。。。そもそもwith_itemsを使ったケースではdictionaryでなくても通ったわけで。。。

よくわからないですが、with_itmesを使わず、シンプルに書く方法があるような気がするのでご協力いただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

マニュアルを見ていたら、推奨されるのはloop:を使って書くことでした。varsでarrayを指定するのは別の参考書のやり方でした。。。
というわけで以下のように書けることがわかりました。

yaml

1 - name: apply migrations to create the database, collect static content 2 django_manage: 3 command: "{{ item }}" 4 app_path: "{{ proj_path }}" 5 virtualenv: "{{ venv_path }}" 6 loop: 7 - migrate 8 - collectstatic

投稿2019/03/01 12:12

melonbomber

総合スコア84

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問