如何使用文件名参数根据文件的存在来设置事实?

如何使用文件名参数根据文件的存在来设置事实?

这是我为单个主机想出的方法

- name: Check for Let's Encrypt certificate
  block:
    - name: Set default for variable
      set_fact:
        use_letsencrypt: false

    - name: Get stat for cert file
      stat:
        path: /etc/letsencrypt/live/{{ hostname }}/cert.pem
      register: certificate_file

    - name: Set letsencrypt to true if certificate exists
      set_fact:
        use_letsencrypt: true
      when: certificate_file.stat.exists

我怎样才能让它更 DRY?向它传递一个主机名,它会为变量返回 true 或 false。

编辑:提供更多信息以使其更清晰。它已经可以正常工作了。

我想在不同的剧本中将上述代码片段用于多个主机,而不必每次都复制和粘贴该代码片段。

我在不同的邮件和 Web 配置文件中使用变量 use_letsencrypt,并且想说,我正忙着为 example.com 设置配置,我是否有它的证书。

答案1

好的。经过一番尝试并阅读更多文档后,我找到了答案。

您可以将上述代码片段放在其自己的角色中,并在每次需要时将其包含进去。

- name: Set use_letsencrypt
  include_role:
    name: has_letsencrypt
  vars:
    hostname: example.com

因此它就像一个模块,您只需向其传递一个变量即可。我现在可以在不同的剧本中多次使用该代码片段。

答案2

我不确定我是否理解正确。

我希望发布的代码只是完整剧本的一个片段。

为了临时传递变量,可以使用 ansible-playbook 的 -e 参数:

  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
                        set additional variables as key=value or 
                        YAML/JSON, if filename prepend with @

因此你可以像这样运行 ansible-playbook:

ansible-playbook -e "hostname=YourHostname" your.yaml

如果你不想在剧本/角色指定的所有节点上运行,你也可以从命令行限制它。使用参数 -l:

  -l SUBSET, --limit=SUBSET
                        further limit selected hosts to an additional 
                        pattern

那么命令将是:

ansible-playbook -e "hostname=YourHostname" -l YourHostname your.yaml

如果您希望 ansible 获取本地主机名,可以通过设置模块获取。请使用 {{ ansible_hostname }} 代替您的 {{ hostname }}。

如果您想查看安装模块提供的完整变量列表,只需运行:

ansible -m setup <your host>

相关内容