【问题标题】:Ansible date variableAnsible 日期变量
【发布时间】:2015-09-28 04:33:08
【问题描述】:

我正在尝试学习如何将 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 作为变量?

【问题讨论】:

    标签: ansible fact


    【解决方案1】:

    命令ansible localhost -m setup 基本上说“针对本地主机运行设置模块”,设置模块收集您在输出中看到的事实。

    当您运行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
    

    【讨论】:

      【解决方案2】:

      ansible 的查找模块对我来说很好用。 yml 是:

      - hosts: test
        vars:
          time: "{{ lookup('pipe', 'date -d \"1 day ago\" +\"%Y%m%d\"') }}"
      

      您可以用日期替换任何命令以获取命令的结果。

      【讨论】:

      • 与其他答案相比,此解决方案要短得多,特别是如果您想以日期和时间格式定义某些内容。我用过{{ lookup('pipe', 'date +%Y-%m-%d-%H-%M-%S')}}.sql之类的东西。谢谢
      • 这是一个很好的解决方案,特别是如果您不(或不能)从主机收集事实。
      • 但是这种方法的缺点是,vars 是惰性求值的,所以如果这个 var 在前几天被访问(也许剧本跨度在午夜),这个 var 会有不同的值跨度>
      【解决方案3】:

      请注意,ansible 命令不收集事实,但 ansible-playbook 命令可以。运行ansible -m setup 时,设置模块恰好运行事实收集,因此您获得了事实,但运行ansible -m command 却没有。因此,事实不可用。这就是为什么其他答案包括剧本 YAML 文件并表明查找有效的原因。

      【讨论】:

        【解决方案4】:

        filter 选项只过滤 ansible_facts 下面的第一级子键

        【讨论】:

          【解决方案5】:

          我尝试了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 之前运行它,这也会给我“cur_target_wd = 2020/05-May/28-Thu”的值。

          【讨论】:

          • 还有其他方法可以确保它应用正确的日期,而不管要运行剧本。 **cur_target_wd: "{{ lookup('pipe','TZ=Asia/Manila date +%Y/%m-%b/%d-%a') }}"
          • 非常感谢我正在寻找那个 TZ 符号。就我而言,我使用了 TZ=Australia/Melbourne 并且效果很好!
          猜你喜欢
          • 2022-01-23
          • 2015-12-18
          • 2017-08-30
          • 1970-01-01
          • 2021-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          相关资源
          最近更新 更多