新しく追加された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を接続するたびにプレイブックを変更せずに、セパレーターを使用してプレイブックに解析している可能性があります。
ここで言うことはたくさんあります。まず、ペストのように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 }}"
_
これですべてが実行されます。
もちろん、このタスクを使用する最良の方法は、タスクを「ネットワーク」ロールに追加し、プレイブックから呼び出すことです。
幸運を。