My Daily Tutorials

Ansible lineinfileモジュールは、行の挿入、既存の行の変更、既存の行の削除、行の置き換えに使用できます。

行の挿入

まず、ファイルに行が存在しない場合、どのように書き込むかを見ていきます。

変更するファイルのパスは、パス(>Ansible 2.3)/dest パラメータで設定できます。 そして、lineパラメータを使用して挿入する行を設定します。

次の例では、ファイル「remote_server.txt」に「ファイルに行を挿入する」という行を書き込みます。 新しい行は、EOF に追加されます。 すでに行が存在する場合は、追加されません。

新しい行は、EOFに追加されます。

また、ファイルが存在しない場合、新しいファイルを作成するというcreateパラメータを設定しました。 状態のデフォルト値は存在します。

状態のデフォルト値は存在します。

- hosts: loc tasks: - name: Ansible insert lineinfile example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Inserting a line in a file. state: present create: yes

Issue1:

次のエラーが発生した場合、

lineinfile unsupported parameter for module: path

おそらく path パラメータに関する問題が原因だと思われます。 ansible 2.3 までは、このパラメータは ‘dest’ でした。 もし、ansibleのバージョンが2.3未満であれば、このパラメータをdestに変更してください。

問題 2:

転送先ファイルが存在しない場合、Ansible は次のようなエラーをスローします。 リモート ファイルにファイルが存在することを確認するか、または ‘create’ パラメータを yes に設定してこの問題を解決します。

宛先 /home/mdtutorials2/hello.txt が存在しない

Inserting a new line after/fore a pattern

常に EOF までラインを挿入したい訳ではありません。 lineinfile モジュールには、パターンの後に行を挿入するか、パターンの前に挿入するかのオプションがある。

以下の例では、ansible.cfgファイルの”行の前に行を挿入したいです。 ”は特殊な正規文字なのでエスケープしています。

- name: Ansible lineinfile insert after example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/fedora/inventory.ini' insertafter: '\'

パターンの前に行を挿入する必要がある場合、insertbefore パラメータを使用できます。 次の例は、ansible.cfg のパターン ‘#library’ の前に行を挿入します。

- name: Ansible lineinfile insertbefore example lineinfile: dest: /etc/ansible/ansible.cfg line: 'inventory = /home/mdtutorials/inventory.ini' insertbefore: '#library'

行の削除

状態パラメータを absent に設定すると、指定した行を削除することができます。 その行の出現回数はすべて削除されます。

- hosts: loc tasks: - name: Ansible lineinfile remove line example lineinfile: dest: /home/mdtutorials2/remote_server.txt line: Removed lines. state: absent

Remove a line using Ansible regexp

regexpを指定して行を削除することも可能です。 つまり、’hello’ という単語で始まる行をすべて削除するなどです。

lineinfile regexp パラメータを使用して正規表現を指定します。 次の例では、DevOps で始まるすべての行を削除します。

- hosts: loc tasks: - name: Ansible lineinfile regexp example lineinfile: dest: /home/mdtutorials2/remote_server.txt regexp: '^DevOps' state: absent

Replacing/ Modifying a line using Regex

行を変更するには、Ansible backrefsパラメータとregexpパラメータを一緒に使用する必要があります。 これは、state=presentで使用されるべきです。

regexpがどの行にもマッチしない場合、ファイルは変更されません。 regexpが行/複数行にマッチした場合、最後にマッチした行が置換されます。 また、正規表現でグループ化された要素が入力され、修正に使用できます。

以下の例では、1行をコメント化しています。 括弧の中を’ \1′ にすることで、全行がキャプチャされます。 また、「#1」は「#」の後にキャプチャした内容が続く行に置き換わります。

複数のキャプチャを用意し、「 \1 」「 \2 」「 \3 」などを使って呼び出すことができます。 グループ化について詳しく知りたい方はregular-expression.infoを参照してください。

Ansible lineinfile backrefsで行をコメントする

- name: Ansible lineinfile regexp replace example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '(inventory = /home/fedora/inventory.ini.*)' line: '#' backrefs: yes

lineinfile regexpで行をアンコメントする

- name: Ansible lineinfile backrefs example lineinfile: dest: /etc/ansible/ansible.cfg regexp: '#(inventory = /home/fedora/inventory.ini.*)' line: '' backrefs: yes

同じ行も少し工夫をすればアンコメントできるようになります。 ここでは、コメントされた行のうち、’#’がついている行をグループ化の外に置いています。 というわけで、’#’以降の部分だけが、’secret’に取り込まれます。 3222>

Lineinfile multiple lines

このセクションでは、複数のlineinfileタスクを1つのタスクとwith_itemsに置き換えるためのものです。 もし、ファイルに複数行を追加することが目的であれば、 blockinfileモジュールを使うべきです。

ハッシュのリストをループするために、with_itemsを使うことができます。 リスト内の各タスクに対して、dest, line, regexpなどを指定することができます。 基本的には、複数のタスクを書く代わりに使用できます。

次の例では、ansible.cfg と remote_server.txt という 2 つのファイルを変更します。

- hosts: loc tasks: - name: Ansible lineinfile multiple lines with_items example lineinfile: dest: "{{ item.dest }}" regexp: "{{ item.regexp }}" line: "{{ item.line }}" backrefs: yes with_items: - {dest: '/etc/ansible/ansible.cfg', regexp: 'config file for ansible', line: 'line changed'} - {dest: '/home/dinoopblogger/remote_server.txt', regexp: 'hello', line: 'world'}

コメントする