我想在Ansible剧本中有条件地定义一个变量,如下所示:true.如果条件没有解析为true,我希望变量保持未定义.
如果我尝试这样做,Ansible会出错:
my_var.为什么这是一个错误呢?
完整的案例如下:when: condition.如果true已定义,则角色会执行特殊操作.在某些情况下,我不希望角色这样做.我可以使用my_var,但后来我必须复制整个角色块.我还可以使用额外的bool变量,但我想要一个解决方案而不必更改角色的"接口".
有任何想法吗?
小智 40
你可以使用这样的东西:__CODE__.如果条件不匹配,则会发生'else',在这种情况下,将为变量设置一个空值.我认为这是一个简短,可读和优雅的解决方案.
SPM*_*SPM 22
此代码可以帮助您定义具有条件的变量.
- hosts: node1
gather_facts: yes
tasks:
- name: Check File
shell: ls -ld /etc/postfix/post-install
register: result
ignore_errors: yes
- name: Define Variable
set_fact:
exists: "{{ result.stdout }}"
when: result|success
- name: Display Variable
debug: msg="{{ exists }}"
ignore_errors: yes
Run Code Online (Sandbox Code Playgroud)
因此,只有条件为真时才会显示"存在".
COD*_*EaD 15
我的例子,在/sf/answers/3038226061/之后:
vars:
sudoGroup: "{{ 'sudo' if ansible_distribution == 'Ubuntu' else 'wheel' }}"
Run Code Online (Sandbox Code Playgroud)
由于 Ubuntu 与其他平台使用的 sudo 约定不同,这里我告诉 Ansible如果平台是 Ubuntu,则设置一个名为sudoGroupto的变量sudo,否则将其设置为wheel.
稍后在我的剧本中,我将变量与 Ansible 的user模块结合起来,根据 Ansible 运行的操作系统添加sudo或添加wheel到帐户的次要组:
- name: Add or update bob account
user:
name: bob
uid: 3205
groups: "{{ sudoGroup }}"
append: yes
Run Code Online (Sandbox Code Playgroud)
笔记:
{{ variable }}需要在user: groups:上面的定义。sudoGroup在 playbook 的 globalvars:部分定义了上述内容,Ansible 就会在运行时(基于ansible_distribution)为我在我的hosts:部分中定义的每个目标配置它。Luc*_*ity 10
我相信你在寻找default(omit)过滤器。(参考)。
根据示例,mode将表现得好像根本没有为循环中的前两项设置。
- name: touch files with an optional mode
file:
dest: "{{item.path}}"
state: touch
mode: "{{item.mode|default(omit)}}"
loop:
- path: /tmp/foo
- path: /tmp/bar
- path: /tmp/baz
mode: "0444"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61521 次 |
| 最近记录: |