web-dev-qa-db-ja.com

変数のAnsibleループ

新しく追加されたNICの構成ファイルを更新するためにansibleを使用しています。そのため、別のymlファイルでいくつかの変数を定義しました。

/ tmp/ip.yml

#first interface
interface1: eth1
bootproto1: static
ipaddress1: 192.168.211.249
netmask1: 255.255.255.0
gateway: 192.168.211.2
DNS1: 192.168.211.2

#second interface
interface2: eth2
bootproto2: static
ipaddress2: 10.0.0.100
netmask2: 255.0.0.0

プレイブック

- include_vars: /tmp/ip.yml

- name: configuring interface 
  lineinfile:
    state=present
    create=yes
    dest=/etc/sysconfig/network-scripts/ifcfg-{{interface1}}
    regexp="{{ item.regexp }}"
    line="{{ item.line }}"
  with_items:
     - { regexp: '^BOOTPROTO=.*', line: 'BOOTPROTO={{interface1}}' }
     - { regexp: '^IPADDR=.*', line: 'IPADDR={{ipaddress1}' }
     - { regexp: '^NETMASK=.*', line: 'NETMASK={{netmask1}}' }
     - { regexp: '^GATEWAY=.*', line: 'GATEWAY={{gateway}}' }
     - { regexp: '^PEERDNS=.*', line: 'PEERDNS=no' }
     - { regexp: '^DNS1=.*', line: 'DNS1={{DNS1}}' }
     - { regexp: '^ONBOOT=.*', line: 'ONBOOT={{onboot}}' }
when: bootproto1 == 'static'

- name: configuring for DHCP
  lineinfile:
   state=present
   create=yes
   dest=/etc/sysconfig/network-scripts/ifcfg-{{interface1}}
   regexp="{{ item.regexp }}"
   line="{{ item.line }}"
  with_items:
    - { regexp: '^BOOTPROTO=.*',line: 'BOOTPROTO={{bootproto1}}' }
    - {regexp: '^PEERDNS=.*',line: 'PEERDNS=yes' }
    - { regexp: '^ONBOOT=.*', line: 'ONBOOT={{onboot}}' }
when: bootproto1 == 'dhcp'

同様に、2番目のインターフェイスについても繰り返します。

この方法は2つのNICで機能しますが、管理が難しすぎます。つまり、新しいNICが追加されるたびに、プレイブックを変更して、対応する変数を更新する必要があります/ tmp/ip .yml

/tmp/ip.ymlに変数を追加する方法はありますか?新しいNICを接続するたびにプレイブックを変更せずに、セパレーターを使用してプレイブックに解析している可能性があります。

8
Kevin Parker

ここで言うことはたくさんあります。まず、ペストのようにlineinfileを避けてください。これは実際にはlast-resortソリューションです。 lineinfileは、一貫性のあるべき等元のプレイブックを作成するのを困難にします。

さて、RHスタイルのインターフェイスファイルにデータを入力しようとしているので、非常に簡単です。

変数を整理する

最初に行うことは、変数の適切な構造を持つことです。インターフェースをループする必要があるので、「ループ可能」にする必要があります。 _interface1_、_interface2_ ... interfaceNがあると、前述のようにスケーラブルではありません。

ここに提案があります:

_interfaces_ipv4:
  - name: eth0
    bootproto: static
    ipaddress: 192.168.211.249
    netmask: 255.255.255.0
    gateway: 192.168.211.2
    dns: 192.168.211.2
  - name: eth2
    bootproto: static
    ipaddress: 10.0.0.100
    netmask: 255.0.0.0
_

テンプレートを書く

データが揃ったので、OS構成ファイルを作成するためのテンプレートが必要です。

_BOOTPROTO={{item.bootproto}}
IPADDR={{item.ipaddress}}
NETMASK={{item.netmask}}
{% if item.gateway is defined %}
GATEWAY={{item.gateway}}
{% endif %}
PEERDNS=no
DNS1={{item.dns}}
ONBOOT={{item.onboot|default('no')}}
_

2つのバリエーションを含めました。設定されていない場合は行の出力をスキップするか(_{% if ... %}_構文)、デフォルト値を指定できます(たとえば、{{item.onboot|default('no')}})。

デフォルトを使用するか、if構文でスキップするかによって、マイレージが異なる場合があります。

タスクを作成

最後に、各インターフェイスのインターフェイス構成ファイルを作成するタスクを次に示します。

_- name: Push template
  template: 
    src=/path/to/the/above/template.j2
    dest=/etc/sysconfig/network-scripts/ifcfg-{{item.name}}.cfg
  with_items:
    - "{{ interfaces_ipv4 }}"
_

これですべてが実行されます。

もちろん、このタスクを使用する最良の方法は、タスクを「ネットワーク」ロールに追加し、プレイブックから呼び出すことです。

幸運を。

27
leucos