ansible:几行的lineinfile?

时间:2014-06-20 19:10:59

标签: ansible

同样有一个模块lineinfile在文件中添加一行,有没有办法添加几行?

我不想使用模板,因为您必须提供整个文件。 我只是想在现有文件中添加一些东西,而不必知道文件已包含的内容,因此模板不是一个选项。

9 个答案:

答案 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来实现这一点。

如果可以验证文件,并且添加单行生成无效文件,则此功能非常有用。

就我而言,我使用以下命令将AuthorizedKeysCommandAuthorizedKeysCommandUser添加到 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"