Ansible:在 jinja 模板中显示变量

Ansible : display variable in jinja template

我有一个剧本,以便 运行 一个 shell 命令来计算更新次数。

我想在文件中显示这个结果,但这个结果是错误的。

我的剧本:

- name: Listing packages
  hosts: all
  gather_facts: false
  tasks:
    - name: Count number of updates
      shell: yum check-update | wc -l
      register: nbupdates

    - name: Display number of updates
      debug:
        var: nbupdates.stdout_lines

    - name: output to html file
      template:
        src: ./jinja/src/tpl_dashboard_update.j2
        dest: ./jinja/dst/dashboard_update.html
        force: yes
      delegate_to: localhost

我的神社模板是这个:

{% for host in vars['play_hosts'] %}
{{ host | upper }} : we have {{ nbupdates.stdout_lines[0] }} updates
{% endfor %}

当我 运行 剧本时,我总是对每个服务器进行相同数量的更新,就像循环不工作一样。

我做错了什么?

您的模板存在一些问题。

  • vars 是一个未记录的内部变量,具有不良行为,不应使用。
  • 您对 vars 的使用完全没有必要,因此您可以将其删除而不是将其替换为 vars lookup
  • play_hostsdeprecated,不应使用。
  • 您的任务应该使用 run_once 以便它只运行一次,而不是每个服务器运行一次。
  • 您应该 use hostvars to access information about other hosts 而不是总是使用当前主机的值。
    - name: output to html file
      template:
        src: ./jinja/src/tpl_dashboard_update.j2
        dest: ./jinja/dst/dashboard_update.html
        force: yes
      delegate_to: localhost
      run_once: true
{% for host in ansible_play_hosts %}
{{ host | upper }} : we have {{ hostvars[host].nbupdates.stdout_lines.0 }} updates
{% endfor %}