Ansible 日期变量
Ansible date variable
我正在尝试学习如何使用 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
基本上说 "run the setup module against localhost",设置模块收集您在输出中看到的事实。
当您 运行 echo
命令时,这些事实不存在,因为安装模块不是 运行。测试此类事情的更好方法是使用 ansible-playbook 到 运行 看起来像这样的剧本:
- hosts: localhost
tasks:
- debug: var=ansible_date_time
- debug: msg="the current date is {{ ansible_date_time.date }}"
因为这个 运行s 作为本地主机的剧本事实是在任务 运行 之前收集的。上述剧本的输出将是这样的:
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
命令可以。当 运行ning ansible -m setup
时,设置模块恰好 运行 事实集合,所以你得到了事实,但 运行ning ansible -m command
没有。因此,事实不可用。这就是为什么其他答案包括剧本 YAML 文件并指示查找有效的原因。
过滤器选项仅过滤 ansible_facts
下面的第一级子项
我尝试了 lookup('pipe,'date') 方法,当我将 playbook 推到塔上时遇到了麻烦。该塔以某种方式使用 UTC 时区。所有最早在我的 TZ + 小时内执行的游戏都会在一天后给我实际日期。
例如:如果我的 TZ 是 Asia/Manila 我应该有 UTC+8。如果我在 Ansible Tower 中早于 8:00am 执行剧本,日期将遵循 UTC+0 中的日期。我花了一段时间才找到这个案例。它让我可以使用日期选项 '-d \"+8 小时\" +%F'。现在它给了我想要的确切日期。
下面是我在剧本中设置的变量:
vars:
cur_target_wd: "{{ lookup('pipe','date -d \"+8 hours\" +%Y/%m-%b/%d-%a') }}"
这将给我 "cur_target_wd = 2020/05-May/28-Thu" 的价值,即使我 运行 现在比 8:00am 早。
我正在尝试学习如何使用 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
基本上说 "run the setup module against localhost",设置模块收集您在输出中看到的事实。
当您 运行 echo
命令时,这些事实不存在,因为安装模块不是 运行。测试此类事情的更好方法是使用 ansible-playbook 到 运行 看起来像这样的剧本:
- hosts: localhost
tasks:
- debug: var=ansible_date_time
- debug: msg="the current date is {{ ansible_date_time.date }}"
因为这个 运行s 作为本地主机的剧本事实是在任务 运行 之前收集的。上述剧本的输出将是这样的:
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
命令可以。当 运行ning ansible -m setup
时,设置模块恰好 运行 事实集合,所以你得到了事实,但 运行ning ansible -m command
没有。因此,事实不可用。这就是为什么其他答案包括剧本 YAML 文件并指示查找有效的原因。
过滤器选项仅过滤 ansible_facts
下面的第一级子项我尝试了 lookup('pipe,'date') 方法,当我将 playbook 推到塔上时遇到了麻烦。该塔以某种方式使用 UTC 时区。所有最早在我的 TZ + 小时内执行的游戏都会在一天后给我实际日期。
例如:如果我的 TZ 是 Asia/Manila 我应该有 UTC+8。如果我在 Ansible Tower 中早于 8:00am 执行剧本,日期将遵循 UTC+0 中的日期。我花了一段时间才找到这个案例。它让我可以使用日期选项 '-d \"+8 小时\" +%F'。现在它给了我想要的确切日期。
下面是我在剧本中设置的变量:
vars:
cur_target_wd: "{{ lookup('pipe','date -d \"+8 hours\" +%Y/%m-%b/%d-%a') }}"
这将给我 "cur_target_wd = 2020/05-May/28-Thu" 的价值,即使我 运行 现在比 8:00am 早。