ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

【モジュールの使い方】Linefile

機能

コマンドにより以下の操作が可能 + 指定した内容の行を指定した位置に追加 + 指定した内容の行の削除 + 正規表現での行のマッチング


使用例

  • /root/test.conf の「bbbb:」項目の後に 「cccc: 3」 を挿入する
- hosts: all
  become: yes
  tasks:
    - name: lineinfile test
      lineinfile:
        path: /root/test.conf
        line: 'cccc: 3'
        insertafter: 'bbbb: .*'


主なパラメータ

パラメータ 必須 デフォルト値 説明
path 変更するファイルパスとファイル名
line 【state=present指定必須】
ファイルに挿入/置換する行を指定
設定されている場合:backerfsを設定していると指定したregexpの条件が適用される。
insertafter EOF/正規表現 【state=present指定必須】
指定した場合:正規表現で最後に一致した行の後に追加
正規表現の最初に一致した行のあとに追加した場合、(firstmach=yes)を設定
特別な値「EOF」も追加可能
指定された正規表現に一致するものがない場合:代わりに「EOF」を使用
insertbeforeが設定されている場合:デフォルト値EOFは無視される。
正規表現regexpとinsertafter両方で設定されている場合:insertafterは、regexpで一致しなければ適用される。
backerefsまたは、insertbeforeと一緒に使用は出来ません。
insertbefore BOF/正規表現 【state=present指定必須】
指定した場合:正規表現で最後に一致した行の前に追加
正規表現の最初に一致した行の前に追加した場合、(firstmach=yes)を設定
特別な値「BOF」も追加可定
指定された正規表現に一致するものがない場合:代わりに「BOF」を使用
正規表現regexpとinsertbefore両方で設定されている場合:insertbeforeは、regexpで一致しなければ適用される。
backerefsまたは、insertafterと一緒に使用は出来ません。
firstmatch yes/no 【insetafter/insertbeforeの設定必須】
yesの場合:insertafter/insertbeforeで指定された正規表現に一致する最初の行で実行
state absent
regexpで指定した文字列を含むすべての行を削除する
present
regexpで指定した文字列を含む行を line: で指定した文字列に置き換える。insertbefore: / insertafter、firstmatch が指定されている場合、その動作に従って line: に指定した文字列を行として追加する
create yes/no 【state=present指定必須】
yesの場合:ファイルが存在しない場合はファイルを作成
noの場合(デフォルト):ファイルが見つからない場合は失敗


全パラメータ

パラメータ 必須 デフォルト値 説明
attributes ファイルの属性を指定
backerfs yes/no 【state=present指定必須】
lineを設定した場合:指定した行に、regexpで一致した最後に見つかった行を置換及び追記出来る。
このパラメータはモジュールの内容を少しだけ変更可能。inserafterとinsertbeforeは有効にならず、regexp正規表現を利用し、指定してファイル内で見つからない場合は変更されません。
regexpで一致する場合:最後に一致した行のパラメータに置き換えする。
search_stringsとは(相互に排他的)同時利用できません。
backup yes/no タイムスタンプを含むバックアップファイルを作成し
変更ファイルが壊れた際、バックアップファイルを利用し切り戻すことが出来る
create yes/no 【state=present指定必須】
yesの場合:ファイルが存在しない場合はファイルを作成
noの場合(デフォルト):ファイルが見つからない場合は失敗
firstmatch yes/no 【insetafter/insertbeforeの設定必須】
yesの場合:insertafter/insertbeforeで指定された正規表現に一致する最初の行で実行
group chownに供給されるような、ファイル/ディレクトリを所有すべきグループの名前。
insertafter EOF/正規表現 【state=present指定必須】
指定した場合:正規表現で最後に一致した行の後に追加
正規表現の最初に一致した行のあとに追加した場合、(firstmach=yes)を設定
特別な値「EOF」も追加可能
指定された正規表現に一致するものがない場合:代わりに「EOF」を使用
insertbeforeが設定されている場合:デフォルト値EOFは無視される。
正規表現regexpとinsertafter両方で設定されている場合:insertafterは、regexpで一致しなければ適用される。
backerefsまたは、insertbeforeと一緒に使用は出来ません。
insertbefore BOF/正規表現 【state=present指定必須】
指定した場合:正規表現で最後に一致した行の前に追加
正規表現の最初に一致した行の前に追加した場合、(firstmach=yes)を設定
特別な値「BOF」も追加可定
指定された正規表現に一致するものがない場合:代わりに「BOF」を使用
正規表現regexpとinsertbefore両方で設定されている場合:insertbeforeは、regexpで一致しなければ適用される。
backerefsまたは、insertafterと一緒に使用は出来ません。
line 【state=present指定必須】
ファイルに挿入/置換する行を指定
設定されている場合:backerfsを設定していると指定したregexpの条件が適用される。
mode ファイルまたはディレクトリをモードにする必要があります。
/usr/bin/chmodでモードが実際には0644のような8進数であることを覚えている人のために。
先行ゼロを離れると、予期しない結果が生じる可能性があります。
バージョン1.8では、モードはシンボリックモード(たとえば、 u + rwx または u = rw、g = r、o = r )として指定できます。
othres ファイルモジュールで受け入れられるすべての引数もここで動作します。
owner chown に供給されるファイル/ディレクトリを所有するユーザーの名前。
path 変更するファイルパスとファイル名
regexp 指定したファイル内の正規表現による検索条件を指定
state=presentの場合:指定したファイル内の文字列で正規表現が引っかかった場合、最後に見つかった行のみ置換する。state=absentの場合:指定したファイル内の文字列で引っかかた場合、その文字列を削除する。
正規表現が一致しない場合、insertbeforeまたはinsertafterに従って、行がファイルに追加されます。
行を変更する場合、正規表現はその行の初期状態と変更後の状態の両方に一致する必要がる。べき等性(特定のリクエストに対して何回でも続けて同じ効果が起こること)を確保するための行による置換
search_string 指定したファイル内を検索する文字。1行の文字列と完全一致する必要はない
state=presentの場合:指定したファイルの内で文字列が見つかった場合、検索された行を置き換える。検索で最後に見つかった行が置き換わる。
state=absentの場合:指定したファイル内で文字列を見つけ場合、その行を削除
リテラル式 例:"test"を記載し一致しない場合:insertbeforeもしくはinsertafterの設定に従い、新しい行が追加されます。
backerefsとreqexptとは(相互に排他的)同時利用できません。
selevel SELinuxファイルシステムオブジェクトコンテキストのレベル部分。
これはMLS/MCS属性であり、範囲とも呼ばれます。
_defaultに設定:seuser のように機能します。
serole SELinuxファイルシステムオブジェクトコンテキストのロール部分。
_defaultに設定:seuser のように機能します。
setype SELinuxファイルシステムオブジェクトコンテキストのタイプ部分。
_defaultに設定:seuser のように機能します。
seuser SELinuxファイルシステムオブジェクトコンテキストのユーザー部分。
該当する場合、システムポリシーをデフォルトにします。
_defaultに設定:seuser のように機能します。
state absent
regexpで指定した文字列を含むすべての行を削除する
present
regexpで指定した文字列を含む行を line: で指定した文字列に置き換える。insertbefore: / insertafter、firstmatch が指定されている場合、その動作に従って line: に指定した文字列を行として追加する
unsafe_writes 通常、このモジュールでは、アトミック操作を使用してデータの破損やターゲットファイルからの一貫性のない読み込みを防止しています。
1つの例は、Dockerがマウントしたファイルです。
アトミックに更新することはできず、安全でない方法でのみ実行できます。
このオプションを使用:アトミック操作が失敗した時にAnsibleがファイルオブジェクトを更新する安全でない、メソッドにフォールバックできます(ただし、Ansibleに安全でない書き込みを矯正することはありません)
重要!安全でない書き込みは競合を生み、データの破損につながる可能性がある。
validate 場所にコピーする前に実行する検証コマンド
検編集対象のファイルを直接編集せず、編集用に一時ファイルを作成します。その一時ファイルのパスが%sに格納されます。
但し、拡張やパイプなどのシェル機能は機能しません。


validateの使用例

  tasks:
    - name: configure Listen Port
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen 80$'
        line: 'Listen 8080'
        validate: httpd -tf %s    # point
      notify:
        - restart httpd

validate: httpd -tf %s について補足

  • validate オプションにはhttpd -tf %sを指定しています。
  • httpd コマンドの-tオプションによってhttpd.conf に問題がないか検証できます。
  • -fオプションを併用することで検証対象のファイルを明示指定できます。
  • %sは Ansible 側の仕様によるものです。
  • lineinfile などのモジュールでは、編集対象のファイルを直接編集せず、 編集用に一時ファイルを作成します。その一時ファイルのパスが%sに格納されます。

httpd -t のみの指定の場合

  • Ansible が編集した一時ファイルを検証の対象にしないでご注意ください。

validate オプションを指定しなかった場合

  • httpd.conf に問題があっても、ハンドラーrestart httpdが呼ばれてしまい 再起動を試みたところで失敗し、httpd が停止したままになってしまいます。
  • validate オプションを有効に使うことで、このような自体を未然に防げます。


ドキュメント

【Ansible Documentation】Module Linefile

参考サイト

matsublog Ansible:lineinfileモジュールについて