2016-08-16 50 views
1

說我想用從Ansible星系FlatKey.firewalld劇本,它有THEI設立防火牆端口規則在Ansible中,如何設置帶有列表的字典?

- name: set firewalld port rules 
    firewalld: 
    port={{item.value.port}}/{{item.value.protocol|default('tcp')} 
    permanent={{item.value.permanent|default('true')} 
    immediate={{item.value.immediate|default('true')} 
    state={{item.value.state|default('enabled')} 
    zone={{item.value.zone|default('public')}} 
    with_dict: "{{firewalld_port_rules|default({})}}" 

我有一個默認/ main.yml文件設置了這樣的任務

firewalld_port_rules: 
    key: 
    port: 123456 
    protocol: tcp 
    state: enabled 
    zone: public 
    permanent: true 
    immediate: true 

如何將這個用於多個端口,無需重複代碼? IOW我真的想要這樣的東西,但語法當然不起作用。希望你明白這個主意。

firewalld_port_rules: 
    key: 
    port: [123456, 45678, 45679] 
    protocol: tcp 
    state: enabled 
    zone: public 
    permanent: true 
    immediate: true 

回答

1

您可以looping over subelements實現這一目標:

子元素散步哈希(又名字典)的列表,然後遍歷與這些記錄內的規定(嵌套子)鍵列表。

你會需要用叉子叉劇本並改變任務:

- name: set firewalld port rules 
    firewalld: 
    port: "{{item.1}}/{{item.0.protocol|default('tcp')}}" 
    permanent: "{{item.0.permanent|default('true')}}" 
    immediate: "{{item.0.immediate|default('true')}}" 
    state: "{{item.0.state|default('enabled')}}" 
    zone: "{{item.0.zone|default('public')}}" 
    with_subelements: 
    - "{{firewalld_port_rules|default({})}}" 
    - port 
+0

這工作時相同,除了一列(在問題'port'),但解決方案的所有數據不靈活。例如:如果你需要123永久tcp和234 udp非永久。 –

0

使用with_items而不是with_dict

- name: so question 552716 
    hosts: '{{ target }}' 
    vars: 
    firewalld_port_rules: 
     - { port: 123 
     , state: enabled 
     , zone: public 
     , permanent: true 
     , immediate: true 
     , protocol: tcp } 
     - { port: 222 
     , state: enabled 
     , immediate: true 
     , protocol: udp } 
     - { port: 333 
     , state: enabled 
     , zone: public 
     , permanent: true 
     , immediate: true 
     , protocol: tcp } 
    tasks: 
    - name: show debug 
     debug: msg="port = {{ item.port }} , state = {{ item.state }}, zone = {{ item.zone | default('public') }}, permanent = {{ item.permanent | default(true) }}" 
     with_items: "{{ firewalld_port_rules }}" 

注意,即永久始終是真實區是公共通常,所以你可以忽略它們並使用默認值(例如參見端口222)。

查看其他鏈接也:Standard Loops

相關問題