Ansibleファクトを変数として使用する方法を学ぼうとしていますが、わかりません。実行すると...
$ ansible localhost -m setup
...私のシステムのすべての事実をリストします。試して使用するansible_facts.ansible_date_time.dateをランダムに選択しましたが、使用方法がわかりません。実行すると...
$ ansible localhost -m setup -a "filter=ansible_date_time"
localhost | success >> {
"ansible_facts": {
"ansible_date_time": {
"date": "2015-07-09",
"day": "09",
"Epoch": "1436460014",
"hour": "10",
"iso8601": "2015-07-09T16:40:14Z",
"iso8601_micro": "2015-07-09T16:40:14.795637Z",
"minute": "40",
"month": "07",
"second": "14",
"time": "10:40:14",
"tz": "MDT",
"tz_offset": "-0600",
"weekday": "Thursday",
"year": "2015"
}
},
"changed": false
}
だから、そこははっきりしている。しかし、実行すると...
$ ansible localhost -a "echo {{ ansible_facts.ansible_date_time.date }}"
localhost | FAILED => One or more undefined variables: 'ansible_facts' is undefined
$ ansible localhost -a "echo {{ ansible_date_time.date }}"
localhost | FAILED => One or more undefined variables: 'ansible_date_time' is undefined
$ ansible localhost -a "echo {{ date }}"
localhost | FAILED => One or more undefined variables: 'date' is undefined
ここにいないのは何ですか?ファクトを変数として使用するにはどうすればよいですか?
コマンドansible localhost -m setup
は基本的に「localhostに対してセットアップモジュールを実行する」と言っており、セットアップモジュールは出力に表示される事実を収集します。
echo
コマンドを実行すると、セットアップモジュールが実行されなかったため、これらのファクトは存在しません。このようなことをテストするより良い方法は、ansible-playbookを使用して、次のようなプレイブックを実行することです。
- hosts: localhost
tasks:
- debug: var=ansible_date_time
- debug: msg="the current date is {{ ansible_date_time.date }}"
これはプレイブックとして実行されるため、localhostのファクトはタスクが実行される前に収集されます。上記のプレイブックの出力は次のようになります。
PLAY [localhost] **************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [debug var=ansible_date_time] *******************************************
ok: [localhost] => {
"ansible_date_time": {
"date": "2015-07-09",
"day": "09",
"Epoch": "1436461166",
"hour": "16",
"iso8601": "2015-07-09T16:59:26Z",
"iso8601_micro": "2015-07-09T16:59:26.896629Z",
"minute": "59",
"month": "07",
"second": "26",
"time": "16:59:26",
"tz": "UTC",
"tz_offset": "+0000",
"weekday": "Thursday",
"year": "2015"
}
}
TASK: [debug msg="the current date is {{ ansible_date_time.date }}"] **********
ok: [localhost] => {
"msg": "the current date is 2015-07-09"
}
PLAY RECAP ********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
Ansibleの検索モジュールは私にとってはうまく機能します。 ymlは次のとおりです。
- hosts: test
vars:
time: "{{ lookup('pipe', 'date -d \"1 day ago\" +\"%Y%m%d\"') }}"
コマンドの結果を取得するには、コマンドを日付に置き換えることができます。
ansible
コマンドはファクトを収集しませんが、ansible-playbook
コマンドは収集することに注意してください。 ansible -m setup
を実行すると、セットアップモジュールがたまたまファクトコレクションを実行するので、ファクトを取得できますが、ansible -m command
を実行すると取得できません。したがって、事実は入手できません。これが、他の回答にPlaybook YAMLファイルが含まれ、ルックアップが機能することを示す理由です。
フィルターオプションは、ansible_factsの下の最初のレベルのサブキーのみをフィルターします。