根据满足条件填充变量Ansible

时间:2019-10-17 22:03:57

标签: ansible

有人知道一篇很好的文章来解释如何根据满足的条件填充变量吗?

示例:

- name: test
  file: 
    path: "{{ item.path }}"
    state: directory
    owner: "{{ item.owner }}"
    group: "{{ item.group }}" 
    mode: 0755
  loop:
    - { path: "{{ file_location }}", owner: "{{ user }}", group: "{{ group }}" }
    - { path: "{{ configfile_path }}", owner: "{{ user }}", group: "{{ group }}"  }

当计算机名为XXX时,需要使用用户和名为“ X”的组填充第一个owner: "{{ user }}", group: "{{ group }}"

然后将第二个:owner: "{{ user }}", group: "{{ group }}"填充到名为YYY的计算机上的用户和组“ yy”

我还没有尝试过任何东西,因为我不确定如何解决这个问题,任何对文档或示例的指导将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:1)

  

Q:“在计算机名为XXX时填充所有者:“ x”...。在计算机名为YYY时填充所有者:“ y”...。“

A:可以使用inventory。例如INI格式

$ cat hosts
XXX owner='x' group='x'
YYY owner='y' group='y'

或YAML

$ cat hosts
---
  hosts:
    XXX:
      owner: 'x'
      group: 'x'
    YYY:
      owner: 'y'
      group: 'y'

,或者可以使用host_vars

$ tree host_vars
host_vars
├── XXX
├── YYY

$ cat host_vars/XXX
owner: 'x'
group: 'x'

$ cat host_vars/YYY
owner: 'y'
group: 'y'

请参见Variable precedence: Where should I put a variable?

答案 1 :(得分:0)

您可以使用set_fact模块和when子句来做到这一点。

set_fact

  

简介

     
      
  • 该模块允许设置新变量。
  •   
  • 像设置模块发现的事实一样,逐个主机设置变量。
  •   
  • 这些变量将在ansible-playbook运行期间供后续播放使用。
  •   
     

- set_fact:
    one_fact: something
    other_fact: "{{ local_var * 2 }}"
    another_fact: "{{ some_registered_var.results | map(attribute='ansible_facts.some_fact') | list }}"

when

  

有时您可能想跳过特定主机上的特定步骤。如果操作系统是特定版本,这可能就像不安装特定软件包那样简单,或者如果文件系统已满,则可能执行一些清理步骤。

     

在Ansible中,使用when子句很容易做到这一点,该子句包含不带双花括号的原始Jinja2表达式(请参阅group_by –根据事实创建Ansible组)。实际上很简单:

     
tasks:
  - name: "shut down Debian flavored systems"
    command: /sbin/shutdown -t now
    when: ansible_facts['os_family'] == "Debian"