同样有一个模块lineinfile
在文件中添加一行,有没有办法添加几行?
我不想使用模板,因为您必须提供整个文件。 我只是想在现有文件中添加一些东西,而不必知道文件已包含的内容,因此模板不是一个选项。
答案 0 :(得分:191)
您可以使用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' }
答案 1 :(得分:154)
您可以尝试使用blockinfile
。
您可以执行类似
的操作- blockinfile: |
dest=/etc/network/interfaces backup=yes
content="iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0"
答案 2 :(得分:14)
这是一个使用with_items的解决方案的无噪声版本:
- name: add lines
lineinfile:
dest: fruits.txt
line: '{{ item }}'
with_items:
- 'Orange'
- 'Apple'
- 'Banana'
对于每个项目,如果该项目存在于fruits.txt中,则不执行任何操作。
如果该项目不存在,则会将其附加到文件的末尾。
易peasy。
答案 3 :(得分:14)
如果需要配置一组唯一的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
答案 4 :(得分:4)
这不太理想,但您可以多次拨打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"
答案 5 :(得分:4)
我可以在line参数中使用\n
来实现这一点。
如果可以验证文件,并且添加单行生成无效文件,则此功能非常有用。
就我而言,我使用以下命令将AuthorizedKeysCommand
和AuthorizedKeysCommandUser
添加到 sshd_config :
- lineinfile: dest=/etc/ssh/sshd_config line='AuthorizedKeysCommand /etc/ssh/ldap-keys\nAuthorizedKeysCommandUser nobody' validate='/usr/sbin/sshd -T -f %s'
只添加其中一个选项会生成无法验证的文件。
答案 6 :(得分:2)
要添加多行,您可以将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}}"' }
答案 7 :(得分:0)
要添加多行,您可以使用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'
要添加一行,您可以使用lininfile:
- name: server.example.com in /etc/hosts
lineinfile:
path: /etc/hosts
line: '192.0.2.42 server.example.com server'
state: present
答案 8 :(得分:0)
要在配置文件中添加多行,您可以在 " "
ansible 模块中使用 ' '
代替 \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"