Ansibleでファイルの編集
Ansible で設定ファイルの編集をしたいとき用です。 3つのモジュールが用意されています。
- lineinfile(1行だけ編集したい人向け)
- replace(複数行編集したい人向け)
- ini_file(INI形式のファイルを編集したい人向け)
ユースケース
Amazon Linux では最初から EPEL リポジトリがインストールされています。RedHat 系の OS であれば yum install epel-release でインストールできます。これによって ansible など、一般にそこそこ使うパッケージもインストールできるようになります。
ですが、Amazon Linux では /etc/yum.repos.d/epel.repo の設定ファイルによって EPEL リポジトリがデフォルトで無効化されています。今回のユースケースではこの epel.repo ファイルを有効化することを目的とします。
[epel] name=Extra Packages for Enterprise Linux 6 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch failovermethod=priority enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 [epel-debuginfo] name=Extra Packages for Enterprise Linux 6 - $basearch - Debug #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 gpgcheck=1 [epel-source] name=Extra Packages for Enterprise Linux 6 - $basearch - Source #baseurl=http://download.fedoraproject.org/pub/epel/6/SRPMS mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-6&arch=$basearch failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 gpgcheck=1
/etc/yum.repos.d/epel.repo は上記のような内容になっています。[epel] セクションで enabled=0 となっています。これを enabled=1 とすることがゴールです。
lineinfile モジュール
lineinfile モジュールは単一行を編集する目的のモジュールです。 以下のようなロールを書くことができます。
---
- name: edit epel setting
lineinfile:
state: present
dest: /etc/yum.repos.d/epel.repo
regexp: '^enabled=0$'
line: 'enabled=1'
これで ansible-playbook コマンドで実行すると、[epel] セクションではなく、[epel-source] セクションが enabled=1 となってしまいます。
これは最後にマッチされたもののみ適用される仕様だからです。
最初にマッチしたもの、あるいは◯番目にマッチしたもの、というオプションがあっても良さそうですが、どうやらないようです。
replace モジュール
続いて replace モジュールを使ってみましょう。Ansible 1.6 から追加されたモジュールです。
---
- name: edit epel setting
replace:
state: present
dest: /etc/yum.repos.d/epel.repo
regexp: '^enabled=0$'
replace: 'enabled=1'
これを実行すると、[epel], [epel-debuginfo], [epel-source] のすべてのセクションで enabled=1 となってしまいます。今回のケースだとこれも使いにくいです。
ini_file モジュール
結局、どうすれば良いかというと、epel.repo ファイルはたまたま INI 形式なので、ini_file を使えば実現できます。
---
- name: edit epel setting
ini_file:
state: present
dest: /etc/yum.repos.d/epel.repo
section: epel
option: enabled
value: 1
section で [epel] を指定でき、option/value で名前と値を指定できます。
INI 形式じゃない場合は copy モジュールを使って ファイルごと差し替えるか、Ansible による冪等性の恩恵は受けられませんが、shell モジュールに置換のコマンドを直接書くしかなさそうです。