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' }
msg: this module requires key=value arguments
. 주어진 예제에는 이것이 정확합니다. 나는 예제를 따르지 않았습니다.
blockinfile
대신 사용할 수 있습니다 .
당신은 같은 것을 할 수 있습니다
- blockinfile: |
dest=/etc/network/interfaces backup=yes
content="iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0"
blockinfile
모듈은 멋지고 내가 그것을 사용하기로 선택한 모든 시간을 일했다. 나는 특히 insertafter
/ insertbefore
옵션 의 직관적 인 행동을 좋아합니다 .
blockinfile
있습니까?
고유 한 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"
\n
line 매개 변수를 사용하여 그렇게 할 수있었습니다 .
파일의 유효성을 검사 할 수 있고 한 줄을 추가하면 유효하지 않은 파일이 생성되는 경우 특히 유용합니다.
내 경우, 나는 추가했다 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'
옵션 중 하나만 추가하면 유효성 검사에 실패한 파일이 생성됩니다.
여러 줄을 추가하려면 블록 파일을 사용할 수 있습니다.
- 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}}"' }
template
하지만 사용lineinfile
하는 것은 안티 패턴 입니다. 또한 "파일의 내용을 모릅니다"라는 강력한 위험 신호로 알 수없는 오류가 발생할 위험이 있습니다.