web-dev-qa-db-ja.com

ansibleでタスクファイル内に変数を書き込む方法

私はこれを持っていますplay.yml

---
- hosts: 127.0.0.1
  connection: local
  Sudo: false

  tasks:
     - include: Apache.yml

私のApacheは次のようになります。

vars:
    url: czxcxz

- name: Download Apache
  Shell: wget {{url}} 

これは私にエラーを与えています。

varsを削除すると動作します。ただし、タスク内に変数を含めて、タスクごとに異なる変数を別々に保持できるようにします。

41
user1994660

注:以下で説明するset_factを使用すると、タスクが実行されているリモートサーバーにファクト/変数が設定されます。その後、このファクト/変数は、プレイブック全体の期間中、後続のタスクにわたって持続します。

また、これらのファクトは(プレイブックの期間中)不変であり、一度設定すると変更できません。


元の回答

タスクの前にset_factを使用して、変数と交換可能と思われるfactsを設定します。

- name: Set Apache URL
  set_fact:
    Apache_url: 'http://example.com/Apache'

- name: Download Apache
  Shell: wget {{ Apache_url }}

公式のWordについては、 http://docs.ansible.com/set_fact_module.html を参照してください。

66
dodgio

私は知っています、それはずっと前ですが、最も簡単な答えがまだ投稿されていなかったので、私は通り過ぎるかもしれない他のユーザーのためにそうします。

「名前」ブロック内で変数を移動するだけです。

- name: Download Apache
  vars:
    url: czxcxz
  Shell: wget {{url}} 
12
appleitung

変数定義は、タスクで使用されることを意図しています。ただし、タスクにそれらを含める場合は、おそらくregisterディレクティブを使用してください。このような:

- name: Define variable in task.
  Shell: echo "http://www.my.url.com"
  register: url

- name: Download Apache
  Shell: wget {{ item }}
  with_items: url.stdout

また、異なるロール ロール に応じてタスクを分離する方法として ロール を見ることができます。このようにして、ロールのそれぞれに個別の変数を設定できます。たとえば、Apache1にはurl変数があり、ロールApache2には別のurl変数があります。

9
Rico

あなたの例では、Apache.ymlはタスクリストですが、プレイブックではありません

目的のアーキテクチャに応じて、次のいずれかを実行できます。

  1. Apache.ymlをロールに変換します。次に、roles/Apache/tasks/mail.ymlでタスクを定義し、roles/Apache/defaults/mail.ymlで変数を定義します(ロールの適用時にデフォルトの変数をオーバーライドできます)

  2. Play.ymlプレイブックで変数を設定します

play.yml

---
- hosts: 127.0.0.1
  connection: local
  Sudo: false

  vars:
    url: czxcxz

  tasks:
     - include: Apache.yml

Apache.yml

- name: Download Apache
  Shell: wget {{url}} 
2
mmv-ru

モジュールの後にansibleの同じ行に変数が続く場合、パーサーは参照変数をインライン辞書の始まりとして扱います。例えば:

- name: some example
  command: {{ myapp }} -a foo

ここでのデフォルトは、{{ myapp }} -a fooの最初の部分を文字列ではなく辞書として解析することであり、エラーが発生します。

したがって、次のように引数を引用する必要があります。

- name: some example
  command: "{{ myapp }} -a foo"
0
Dwayne Mcnab