我试图学习如何使用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
我没有到这里来的?如何将Facts用作变量?
答案 0 :(得分:68)
命令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
答案 1 :(得分:6)
ansible的查找模块对我来说很好。 yml是:
- hosts: test
vars:
time: "{{ lookup('pipe', 'date -d \"1 day ago\" +\"%Y%m%d\"') }}"
您可以使用date替换任何命令以获取命令的结果。
答案 2 :(得分:2)
请注意,setlocal enabledelayedexpansion
for %%a in (*) do (
set "pathname=%%a"
set "pathname=!pathname:--=\!"
for %%b in ("!pathname!") do set "parent=%%~dpb"
md !parent!
move "%%a" "!pathname!"
)
命令不会收集事实,但ansible
命令会收集事实。运行ansible-playbook
时,安装模块碰巧运行事实集合,因此您可以获得事实,但运行ansible -m setup
则不然。因此,事实并非如此。这就是为什么其他答案包括playbook YAML文件并指出查找工作。
答案 3 :(得分:0)
过滤器选项仅过滤ansible_facts
下面的第一级子项答案 4 :(得分:0)
我尝试了lookup('pipe,'date')方法,但在将剧本推到塔上时遇到了麻烦。该塔以某种方式使用UTC时区。早在我的TZ的+小时内执行的所有游戏都会在实际日期的一天后给我。
例如:如果我的TZ是亚洲/马尼拉,我应该拥有UTC + 8。如果我在早上8:00前在Ansible Tower执行剧本,则日期将跟随UTC + 0的日期。我花了一段时间才找到这个案子。它让我使用日期选项'-d \“ + 8 hours \” +%F'。现在它给了我想要的确切日期。
以下是我在剧本中设置的变量:
vars:
cur_target_wd: "{{ lookup('pipe','date -d \"+8 hours\" +%Y/%m-%b/%d-%a') }}"
即使我现在早于8:00 am运行它,也将为我提供“ cur_target_wd = 2020 / 05-May / 28-Thu”的值。