首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带循环的set_fact变量

带循环的set_fact变量
EN

Stack Overflow用户
提问于 2022-10-07 11:55:27
回答 1查看 82关注 0票数 0

我正在尝试使用linux-system角色/timesync与NTP服务器的动态列表(依赖于group_vars或host_vars )。

作为基地,我有:

在主机vars/server1.yml中

代码语言:javascript
复制
serverip:
  - '1.1.1.1'
  - '2.2.2.2'
  - '3.3.3.3'

在主机vars/server2.yml中

代码语言:javascript
复制
serverip:
  - '1.1.1.1'
  - '2.2.2.2'
  - '3.3.3.3'

在我的角色/set-ntp/任务/main.yml中:

代码语言:javascript
复制
- name: Legacy set_fact style
  set_fact:
    timesync_ntp_servers:
      - hostname: "{{ serverip[0] }}"
        iburst: yes
      - hostname: "{{ serverip[1] }}"
        iburst: yes
      - hostname: "{{ serverip[3] }}"
        iburst: yes

- debug:
  var: timesync_ntp_servers
- include_role:
    name: linux-system-roles.timesync

还有我的playbook.yml

代码语言:javascript
复制
- name: Configure servers
  hosts: server1,server2

  roles:
    - set-ntp
    - other-role1
    - other-role2
    - .....

而且它运行得很好,因为timesync_ntp_servers看起来像:

代码语言:javascript
复制
TASK [set-ntp : debug] ***********************************************************************************************************************************************************************************
ok: [server1] => {
    "timesync_ntp_servers": [
        {
            "hostname": "1.1.1.1", 
            "iburst": true
        }, 
        {
            "hostname": "2.2.2.2", 
            "iburst": true
        }, 
        {
            "hostname": "3.3.3.3", 
            "iburst": true
        }
    ]
}
ok: [server2] => {
    "timesync_ntp_servers": [
        {
            "hostname": "1.1.1.1", 
            "iburst": true
        }, 
        {
            "hostname": "2.2.2.2", 
            "iburst": true
        }, 
        {
            "hostname": "3.3.3.3", 
            "iburst": true
        }
    ]
}

当我需要将服务器的NTP IP更改为不同的计数时,就会出现问题,如host_vars/server1.yml中的

代码语言:javascript
复制
serverip:
  - '1.1.1.1'
  - '2.2.2.2'
  - '3.3.3.3'

在主机vars/server2.yml中

代码语言:javascript
复制
serverip:
  - '1.1.1.1'
  - '2.2.2.2'
  - '3.3.3.3'
  - '4.4.4.4'

我的静态变体现在不能用了。我尝试了一些googe页面的use循环,并创建了以下内容:

代码语言:javascript
复制
- set_fact:
    loop_item:
      - hostname: "{{ item }}"
        iburst: yes
  loop: "{{ serverip }}"
  register: loop_list

- name: Loop style
  set_fact:
    timesync_ntp_servers: "{{ loop_list.results | map(attribute='ansible_facts.loop_item') | list }}"

- debug:
    var: timesync_ntp_servers

但是变量"timesync_ntp_servers“现在对每个项对有额外的嵌套度[]:

代码语言:javascript
复制
TASK [debug] ************************************************************************************************************************************************************************************************
ok: [server1] => {
    "timesync_ntp_servers": [
        [
            {
                "hostname": "1.1.1.1", 
                "iburst": true
            }
        ], 
        [
            {
                "hostname": "2.2.2.2", 
                "iburst": true
            }
        ], 
        [
            {
                "hostname": "3.3.3.3", 
                "iburst": true
            }
        ]
    ]
}

在这种情况下,/timesync模块不能工作,它看不到变量。怎么解决,我不知道。

EN

回答 1

Stack Overflow用户

发布于 2022-10-21 17:42:10

loop_item变量定义了一个列表。如果你把它定义为一个白痴,我认为它应该解决你的问题。

代码语言:javascript
复制
    loop_item:
      hostname: "{{ item }}"
      iburst: yes
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73986803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档