这是我为单个主机想出的方法
- 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>