是否可以在Ansible中设置数组的事实?

是否可以在Ansible中设置数组的事实?,ansible,Ansible,是否可以使用set\u fact在ansible中设置包含数组的事实?它的正确语法是什么?确实如此。但是,您需要引用整个阵列: - name: set fact set_fact: foo="[ 'one', 'two', 'three']" - name: debug debug: msg={{ item }} with_items: foo 上述任务应生成以下输出: TASK: [set fact] **************************************

是否可以使用
set\u fact
在ansible中设置包含数组的事实?它的正确语法是什么?

确实如此。但是,您需要引用整个阵列:

- name: set fact
  set_fact: foo="[ 'one', 'two', 'three']"

- name: debug
  debug: msg={{ item }}
  with_items: foo
上述任务应生成以下输出:

TASK: [set fact] **************************************************************
ok: [localhost]

TASK: [debug] *****************************************************************
ok: [localhost] => (item=one) => {
    "item": "one",
    "msg": "one"
}
ok: [localhost] => (item=two) => {
    "item": "two",
    "msg": "two"
}
ok: [localhost] => (item=three) => {
    "item": "three",
    "msg": "three"
}

是的,这是可能的。如另一个答案中所述,您可以使用双引号设置数组,如下所示:

- name: set foo fact to an array
  set_fact: foo="[ 'one', 'two', 'three' ]"
- name: add items to foo array fact
  set_fact: foo="{{foo}} + [ 'four' ]"
但是,我想我应该创建另一个答案,表明也可以添加到现有阵列中,如下所示:

- name: set foo fact to an array
  set_fact: foo="[ 'one', 'two', 'three' ]"
- name: add items to foo array fact
  set_fact: foo="{{foo}} + [ 'four' ]"
将这些结合起来,并将调试添加为剧本(我称之为
facts.yml
),如下所示:

生成(通过ansible playbook facts.yml)以下内容:

PLAY [test playbook] ********************************************************** 

TASK: [set foo fact to an array] ********************************************** 
ok: [localhost]

TASK: [debug var=foo] ********************************************************* 
ok: [localhost] => {
    "foo": [
        "one", 
        "two", 
        "three"
    ]
}

TASK: [add items to foo array fact] ******************************************* 
ok: [localhost]

TASK: [debug var=foo] ********************************************************* 
ok: [localhost] => {
    "foo": [
        "one", 
        "two", 
        "three", 
        "four"
    ]
}

PLAY RECAP ******************************************************************** 
localhost                  : ok=4    changed=0    unreachable=0    failed=0   

除了已经给出的答案之外,我想向您展示一种不同的解决方法 使用常规YAML语法而不是 Ansible core用户喜欢在其文档中使用的自定义格式。这 像本例一样,自定义格式会导致混淆

考虑这个例子:

-name:“使用YAML语法将foo变量设置为静态列表”
设定事实:
傅:
-“一个”
-“两个”
-“三个”
直截了当,对吗?就像在任何普通YAML文档中一样。所以 为什么不在Ansible YAML任务文件中也使用它呢

关于@lindes hw提到的列表组合。不止一个 这样做的方法。以下示例使用Jinja2语法定义列表:

-name:“使用Jinja2语法将foo变量设置为组合静态列表”
设定事实:
foo:“{{[“一”]+[“二”,“三”]}”
-name:'使用Jinja2语法和Jinja2过滤器将foo变量设置为组合静态列表'
设定事实:
foo:“{{[“一”]|联合([“二”,“三”])}”

第二个示例使用
union
过滤器。请参阅。

我有一个类似的要求,即基于IP地址列表创建服务器对象列表

vars:
  server_ips: one,two,three
tasks:
  - name: build items list
    set_fact: 
      foo: "{{foo|default([]) + [{'ip': {'addr': item, 'type': 'V4'}}] }}"
    with_items: "{{server_ips.split(',')}}"
  - debug:
      msg: "{{ foo }}"
给出以下输出

TASK [setup] *******************************************************************
ok: [localhost]

TASK [build items list] ********************************************************
ok: [localhost] => (item=one)
ok: [localhost] => (item=two)
ok: [localhost] => (item=three)

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": [
        {
            "ip": {
                "addr": "one", 
                "type": "V4"
            }
        }, 
        {
            "ip": {
                "addr": "two", 
                "type": "V4"
            }
        }, 
        {
            "ip": {
                "addr": "three", 
                "type": "V4"
            }
        }
    ]
}

我不知道功能是否发生了变化——可能是在2.5中发生了变化——但在我看来,这是一段代码

with_items: foo
在本例中,您必须使用

with_items: "{{ foo }}"
我用的是Ansible 2.5.2。我得到了这个(不正确的)输出:

我在这里的文档中找到了更新的语法:
像这样

- hosts: all
  tasks:
  - set_fact:
      redis_list: |
        {%- set list = [] -%}
        {%- for index in range(1, 5 ) -%}
          {{ list.append(index)  }}
        {%- endfor -%}
        {{ list }}

很好的回答。。。但有一个问题是,这是怎么回事!!?!?我们应该知道这件事吗?我在文档中没有看到类似的内容将项目附加到事实中是非常有价值的,我已经搜索了一段时间来找到它如果我们从
foo=[]
开始,然后附加一个模板字符串而不是
'four'
,这是如何工作的?例如,我将在下面提供一个“答案”来解释这个问题。为什么不把你的事实放在vars下而不是使用默认值呢?在set_fact循环中构建一个数组很好,很干净,虽然不是OP的答案,但这正是我想要的。保持简单需要+1。Ansible的一个主要卖点是,您可以使用易于阅读(和编写)的YAML语法,因此,我总是感到困惑,为什么许多Ansible示例代码毫无理由地复杂。