lineinfile
ファイルに1行を追加するモジュールがあるのと同じように、複数の行を追加する方法はありますか?
ファイル全体を提供する必要があるため、テンプレートを使用したくありません。テンプレートがオプションではないので、ファイルがすでに何を含んでいるかを必ずしも知らなくても、既存のファイルに何かを追加したいだけです。
lineinfile
ファイルに1行を追加するモジュールがあるのと同じように、複数の行を追加する方法はありますか?
ファイル全体を提供する必要があるため、テンプレートを使用したくありません。テンプレートがオプションではないので、ファイルがすでに何を含んでいるかを必ずしも知らなくても、既存のファイルに何かを追加したいだけです。
回答:
ループを使用してそれを行うことができます。with_items
ループを使用した例を次に示します。
- name: Set some kernel parameters
lineinfile:
dest: /etc/sysctl.conf
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
with_items:
- { regexp: '^kernel.shmall', line: 'kernel.shmall = 2097152' }
- { regexp: '^kernel.shmmax', line: 'kernel.shmmax = 134217728' }
- { regexp: '^fs.file-max', line: 'fs.file-max = 65536' }
msg: this module requires key=value arguments
。与えられた例にはこれが正しいです-私はただ例に従わなかっただけです。
blockinfile
代わりに使用してみてください。
あなたは次のようなことができます
- blockinfile: |
dest=/etc/network/interfaces backup=yes
content="iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0"
blockinfile
モジュールは、使用することを選択するたびに見事に機能しました。insertafter
/ insertbefore
オプションの直感的な動作が特に気に入っています。
blockinfile
か?
一意のproperty = value行のセットを構成する必要がある場合は、より簡潔なループをお勧めします。例えば:
- name: Configure kernel parameters
lineinfile:
dest: /etc/sysctl.conf
regexp: "^{{ item.property | regex_escape() }}="
line: "{{ item.property }}={{ item.value }}"
with_items:
- { property: 'kernel.shmall', value: '2097152' }
- { property: 'kernel.shmmax', value: '134217728' }
- { property: 'fs.file-max', value: '65536' }
Alix Axelの提案に従ってdictを使用し、コメント化された一致するエントリを自動的に削除します。
- name: Configure IPV4 Forwarding
lineinfile:
path: /etc/sysctl.conf
regexp: "^#? *{{ item.key | regex_escape() }}="
line: "{{ item.key }}={{ item.value }}"
with_dict:
'net.ipv4.ip_forward': 1
以下は、with_itemsを使用するソリューションのノイズのないバージョンです。
- name: add lines
lineinfile:
dest: fruits.txt
line: '{{ item }}'
with_items:
- 'Orange'
- 'Apple'
- 'Banana'
各アイテムについて、アイテムがFruits.txtに存在する場合、アクションは実行されません。
アイテムが存在しない場合は、ファイルの最後に追加されます。
かんたん。
理想的ではありませんが、への複数の呼び出しが許可されていますlineinfile
。これをで使用するとinsert_after
、必要な結果を得ることができます。
- name: Set first line at EOF (1/3)
lineinfile: dest=/path/to/file regexp="^string 1" line="string 1"
- name: Set second line after first (2/3)
lineinfile: dest=/path/to/file regexp="^string 2" line="string 2" insertafter="^string 1"
- name: Set third line after second (3/3)
lineinfile: dest=/path/to/file regexp="^string 3" line="string 3" insertafter="^string 2"
私はそれを行うことができました \n
行パラメーターで。
これは、ファイルを検証でき、1行追加すると無効なファイルが生成される場合に特に役立ちます。
私の場合、次のコマンドを使用してsshd_configにとを追加AuthorizedKeysCommand
しAuthorizedKeysCommandUser
ていました。
- lineinfile: dest=/etc/ssh/sshd_config line='AuthorizedKeysCommand /etc/ssh/ldap-keys\nAuthorizedKeysCommandUser nobody' validate='/usr/sbin/sshd -T -f %s'
オプションの1つだけを追加すると、検証に失敗したファイルが生成されます。
複数の行を追加するには、blockfileを使用できます。
- name: Add mappings to /etc/hosts
blockinfile:
path: /etc/hosts
block: |
'10.10.10.10 server.example.com'
'10.10.10.11 server1.example.com'
1行を追加するには、lininfileを使用できます。
- name: server.example.com in /etc/hosts
lineinfile:
path: /etc/hosts
line: '192.0.2.42 server.example.com server'
state: present
複数の行を追加するには、ここに変数を含めてlineinfile
モジュールを使用し、それを簡単にします:)with_items
vars
---
- hosts: localhost #change Host group as par inventory
gather_facts: no
become: yes
vars:
test_server: "10.168.1.1"
test_server_name: "test-server"
file_dest: "/etc/test/test_agentd.conf"
- name: configuring test.conf
lineinfile:
dest: "{{ item.dest }}"
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
with_items:
- { dest: '"{{ file_dest }}"', regexp: 'Server=', line: 'Server="{{test_server}}"' }
- { dest: '"{{ file_dest }}"', regexp: 'ServerActive=', line: 'ServerActive="{{test_server}}"' }
- { dest: '"{{ file_dest }}"', regexp: 'Hostname=', line: 'Hostname="{{test_server_name}}"' }
template
が、使用lineinfile
はアンチパターンです。また、「ファイルの内容がわからない」という強い警告であり、未知の障害の大きなリスクにつながります。