多行的 lininfile?

同样的方法有一个模块 lineinfile添加一行在一个文件中,是否有一种方法添加几行?

我不想使用模板,因为您必须提供整个文件。 我只是想添加一些东西到一个现有的文件,而不必知道文件已经包含了什么,所以模板不是一个选项。

226419 次浏览

这并不理想,但你可以多次调用 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"

你可以在 循环中使用 内置 lineinfile,下面是一个例子:

- name: Set some kernel parameters
  lineinfile:
    dest: /etc/sysctl.conf
    regexp: "\{\{ item.regexp }}"
    line: "\{\{ item.line }}"
  loop:
    - { regexp: '^kernel.shmall', line: 'kernel.shmall = 2097152' }
    - { regexp: '^kernel.shmmax', line: 'kernel.shmmax = 134217728' }
    - { regexp: '^fs.file-max', line: 'fs.file-max = 65536' }

通过在 line 参数中使用 \n,我可以做到这一点。

如果文件可以进行验证,并且添加一行会生成无效文件,那么这种方法特别有用。

在我的例子中,我使用以下命令将 AuthorizedKeysCommandAuthorizedKeysCommandUser添加到 Sshd _ config:

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

只添加其中一个选项会生成验证失败的文件。

您可以尝试使用 blockinfile代替。

你可以这样做

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

下面是这个解决方案的无噪声版本,它将与 _ item 一起使用:

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

对于每个条目,如果该条目存在于 Frus.txt 中,则不采取任何操作。

如果该项不存在,它将被追加到文件的末尾。

小菜一碟。

如果需要配置一组惟一的 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

要添加多行,可以使用 lockfile:

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

添加一行你可以使用 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}}"' }

要在一个配置文件中添加多行,可以使用 " "代替 ' ',并使用转义序列 \n作为 lineinfile可变模块中的新行:

- name: Configure core-site.xml
lineinfile:
path: /etc/hadoop/core-site.xml
insertafter: '^<configuration>'
line: "Line 1 \n Line 2 \n Line 3"

适合我的用例(网络自动化)的解决方案:

- name: "create block in own file per host"
blockinfile:
path: "/dir/logs/\{\{ inventory_hostname }}.txt"
create: true
block: "some commands"
...


- name: "add more line in block (even if already executed on another host)"
lineinfile:
line: "\{\{ item }}"
...
loop: "\{\{ more_commands_1 | default([]) +
more_commands_2 | default([]) }}"


- name: "assemble all files in one"
assemble:
src: "/dir/logs/"
dest: "/dir/logs/all_hosts.txt"
...

注意: 我使用了带有“ check _ mode: false”和“ committee _ to: localhost”的模块

如果有更聪明的解决方案,我会很高兴。