[ansible] ansible : 여러 줄의 lineinfile?

lineinfile파일에 한 줄을 추가 하는 모듈이있는 것과 같은 방법으로 여러 줄을 추가하는 방법이 있습니까?

전체 파일을 제공해야하기 때문에 템플릿을 사용하고 싶지 않습니다. 템플릿이 옵션이 아니므로 파일에 이미 무엇이 포함되어 있는지 모른 채 기존 파일에 무언가를 추가하고 싶습니다.



답변

루프 를 사용 하여 수행 할 수 있습니다. 다음은 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' }


답변

blockinfile대신 사용할 수 있습니다 .

당신은 같은 것을 할 수 있습니다

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


답변

고유 한 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"


답변

\nline 매개 변수를 사용하여 그렇게 할 수있었습니다 .

파일의 유효성을 검사 할 수 있고 한 줄을 추가하면 유효하지 않은 파일이 생성되는 경우 특히 유용합니다.

내 경우, 나는 추가했다 AuthorizedKeysCommandAuthorizedKeysCommandUsersshd_config에서 다음 명령을 :

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

옵션 중 하나만 추가하면 유효성 검사에 실패한 파일이 생성됩니다.


답변

여러 줄을 추가하려면 블록 파일을 사용할 수 있습니다.

- 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