问题描述
在使用Ansible时,有多种类型的变量,让人有点头大。其中一些包括:
– 我们可以在roles//vars/main.yml
中编写的变量。
– 我们可以在任务文件本身中编写的变量。
– 然后是group_vars
。
– 还有host_vars
。
– 还有变量文件。
我的用例是…我有三个角色,分别是nginx、jenkins和certbot。它们共同的地方是域名。为了便于重构,我决定在所有这些角色中都使用名为{{ fqdn }}
的变量。
我不确定要使用哪个版本。
我想要的是…在运行playbook时能够从命令行输入fqdn
。应该有一个默认值,我可以将其放在仓库的某个位置。
解决方案
请注意以下操作可能存在版本差异,请确保备份和验证。
方案1:使用默认值和命令行变量
在Ansible中,有多种方式可以管理变量的优先级,以满足你的需求。下面是一些解决方案:
1. 在角色的默认变量中定义变量: 对于每个角色,你可以在defaults/main.yml
中定义默认变量,这是变量的一个较低优先级位置。示例:
yaml
# roles/certbot/defaults/main.yml
fqdn: "{{ fqdn_default|default('srv.example.com') }}"
你可以在每个角色的defaults/main.yml
文件中定义类似的fqdn
变量。
在命令行中定义变量: 你可以在运行playbook时通过命令行参数来定义变量。示例:
bash
ansible-playbook playbook.yml -e fqdn=www.example.com
这会在运行时覆盖默认值,使你能够为每次运行指定不同的值。使用group_vars或host_vars中的变量: 你还可以在
group_vars
或host_vars
中定义变量。示例:
yaml
# group_vars/all.yml
fqdn_default: default.example.com
然后,在playbook中使用这个定义的变量:
“`yamldebug:
var: fqdn_default
“`
这将使你能够根据不同的主机组或主机使用不同的默认值。交互式输入变量: 如果你想在运行playbook时从命令行交互式地输入变量,可以使用
vars_prompt
。示例:
“`yaml
# playbook.yml- hosts: localhost
vars_prompt:- name: fqdn
prompt: “What is the fqdn?”
private: no
roles: - certbot
- jenkins
- nginx
``
fqdn`的值,可以根据需求提供不同的值。
运行playbook时,系统会提示你输入
- name: fqdn
注意:如果在命令行中通过
--extra-vars
参数定义了变量,交互式提示将跳过那些已经在命令行上定义过的变量。
以上方案中,你可以根据自己的需求选择合适的方法来管理变量的优先级和默认值。根据你的用例,选择最适合的方式即可。