【问题标题】:Ansible loop within a loop循环内的 Ansible 循环
【发布时间】:2021-09-14 12:31:04
【问题描述】:

在一项任务中需要多个循环时,我真的很难理解 Ansible 中的循环。 现在我正在编写一个任务来在 Ansible 中创建一些注册表项并具有以下工作,

- name: Windows SSL/TLS Configuration
  ansible.windows.win_regedit:
    path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\{{ item.type }}
    name: '{{ item.property }}'
    data: '{{ item.value }}'
    type: dword
    state: present
  loop:
  - type: Server
    property: Enabled
    value: 0
  - type: Server
    property: DisabledByDefault
    value: 1
  - type: Client
    property: Enabled
    value: 0
  - type: Client
    property: DisabledByDefault
    value: 1

但是我想要做的是将“SSL 3.0”替换为“{{ item.protocol }}”之类的内容,并能够将其替换为“SSL 2.0”、“SSL 3.0”和“TLS 1.0”,然后在每个条目中创建相同的条目。 我希望在同一个任务中完成所有这些任务,而不是在路径上只有一处不同的情况下运行完全相同的任务 3 次。

我想做的事是否可能?

【问题讨论】:

标签: loops ansible nested-loops


【解决方案1】:

使用loop_control 设置loop_var。否则内外循环使用同一个循环变量,不起作用。

查看文档:Defining inner and outer variable names with loop_var

文档解释说,您必须将内部循环放入不同的文件中才能将其包含在 include_tasks 中。

如果您不想这样,您可以将协议添加到每个项目以使用with_subelements。示例:

- hosts: localhost
  connection: local
  vars:
    protocols:
      - "SSL 2.0"
      - "SSL 3.0"
      - "TLS 1.0"
    keys:
      - type: Server
        property: Enabled
        value: 0
        protocols: "{{ protocols }}"
      - type: Server
        property: DisabledByDefault
        value: 1
        protocols: "{{ protocols }}"
      - type: Client
        property: Enabled
        value: 0
        protocols: "{{ protocols }}"
      - type: Client
        property: DisabledByDefault
        value: 1
        protocols: "{{ protocols }}"
  tasks:
    - debug: msg="{{item.0.type}} {{item.0.property}} {{item.0.value}} {{item.1}}"
      with_subelements:
        - "{{ keys }}"
        - protocols

这将生成 12 个密钥:

$ ansible-playbook example.yaml
 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does
not match 'all'


PLAY [localhost] **********************************************************************************************

TASK [Gathering Facts] ****************************************************************************************
ok: [localhost]

TASK [debug] **************************************************************************************************
ok: [localhost] => (item=[{'type': 'Server', 'property': 'Enabled', 'value': 0}, 'SSL 2.0']) => {
    "msg": "Server Enabled 0 SSL 2.0"
}
ok: [localhost] => (item=[{'type': 'Server', 'property': 'Enabled', 'value': 0}, 'SSL 3.0']) => {
    "msg": "Server Enabled 0 SSL 3.0"
}
ok: [localhost] => (item=[{'type': 'Server', 'property': 'Enabled', 'value': 0}, 'TLS 1.0']) => {
    "msg": "Server Enabled 0 TLS 1.0"
}
ok: [localhost] => (item=[{'type': 'Server', 'property': 'DisabledByDefault', 'value': 1}, 'SSL 2.0']) => {
    "msg": "Server DisabledByDefault 1 SSL 2.0"
}
ok: [localhost] => (item=[{'type': 'Server', 'property': 'DisabledByDefault', 'value': 1}, 'SSL 3.0']) => {
    "msg": "Server DisabledByDefault 1 SSL 3.0"
}
ok: [localhost] => (item=[{'type': 'Server', 'property': 'DisabledByDefault', 'value': 1}, 'TLS 1.0']) => {
    "msg": "Server DisabledByDefault 1 TLS 1.0"
}
ok: [localhost] => (item=[{'type': 'Client', 'property': 'Enabled', 'value': 0}, 'SSL 2.0']) => {
    "msg": "Client Enabled 0 SSL 2.0"
}
ok: [localhost] => (item=[{'type': 'Client', 'property': 'Enabled', 'value': 0}, 'SSL 3.0']) => {
    "msg": "Client Enabled 0 SSL 3.0"
}
ok: [localhost] => (item=[{'type': 'Client', 'property': 'Enabled', 'value': 0}, 'TLS 1.0']) => {
    "msg": "Client Enabled 0 TLS 1.0"
}
ok: [localhost] => (item=[{'type': 'Client', 'property': 'DisabledByDefault', 'value': 1}, 'SSL 2.0']) => {
    "msg": "Client DisabledByDefault 1 SSL 2.0"
}
ok: [localhost] => (item=[{'type': 'Client', 'property': 'DisabledByDefault', 'value': 1}, 'SSL 3.0']) => {
    "msg": "Client DisabledByDefault 1 SSL 3.0"
}
ok: [localhost] => (item=[{'type': 'Client', 'property': 'DisabledByDefault', 'value': 1}, 'TLS 1.0']) => {
    "msg": "Client DisabledByDefault 1 TLS 1.0"
}

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

【讨论】:

  • 那么可以在同一个任务中定义outer_item循环吗?还是需要将其定义为一项任务,如链接文档中所展示的那样?
  • 谢谢!这正是我需要的正确方向的推动!现在,我已将所有内容(包括 var)整合到一个任务中,该任务完全符合我的需要。
猜你喜欢
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2014-06-18
  • 2015-12-10
相关资源
最近更新 更多