web-dev-qa-db-ja.com

ansible:lineinfileは数ありますか?

ファイルに1行追加するためのモジュールlineinfileがあるのと同じ方法で、複数行を追加する方法はありますか?

ファイル全体を提供する必要があるため、テンプレートは使用したくありません。既存のファイルに何かを追加したいのですが、必ずしもファイルに何が含まれているのかを知る必要はないので、テンプレートは選択肢になりません。

142
Michael

それをするために loop を使うことができます。これは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' }
193
Ben Whaley

代わりに blockinfile を使ってみることができます。

あなたはのようなことをすることができます

- blockinfile: |
    dest=/etc/network/interfaces backup=yes
    content="iface eth0 inet static
        address 192.168.0.1
        netmask 255.255.255.0"
157
Soichi Hayashi

これはwith_itemsを使用することで解決策のノイズのないバージョンです:

- name: add lines
  lineinfile: 
    dest: fruits.txt
    line: '{{ item }}'
  with_items:
    - 'Orange'
    - 'Apple'
    - 'Banana' 

各項目について、その項目がfruits.txtに存在する場合は何もしません。

項目が存在しない場合は、ファイルの末尾に追加されます。

簡単です。

14
Rick O'Shea

一連の一意の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が提案している辞書を使用し、コメントアウトされた一致するエントリの自動削除を追加する、

- 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
14

Lineパラメータに\nを使うことでそれができました。

ファイルを検証でき、単一行を追加すると無効なファイルが生成される場合に特に便利です。

私の場合は、次のコマンドを使用してAuthorizedKeysCommandAuthorizedKeysCommandUsersshd_configに追加しました。

- lineinfile: dest=/etc/ssh/sshd_config line='AuthorizedKeysCommand /etc/ssh/ldap-keys\nAuthorizedKeysCommandUser nobody' validate='/usr/sbin/sshd -T -f %s'

オプションを1つだけ追加すると、検証に失敗するファイルが生成されます。

4
Penz

理想的ではありませんが、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"
4