2016-08-31 20 views
6

Tôi cảm thấy khó tin rằng không có bất cứ điều gì bao gồm trường hợp sử dụng này nhưng tìm kiếm của tôi đã tỏ ra không kết quả.Nhận xét ra một dòng với mô-đun dòng Ansible lineinfile

Tôi có một dòng trong /etc/fstab để gắn một ổ đĩa mà không còn có sẵn:

//archive/Pipeline /pipeline/Archives cifs ro,credentials=/home/username/.config/cifs 0 0 

Những gì tôi muốn là để thay đổi nó để

#//archive/Pipeline /pipeline/Archives cifs ro,credentials=/home/username/.config/cifs 0 0 

Tôi đã sử dụng này

--- 
- hosts: slurm 
    remote_user: root 

    tasks: 
    - name: Comment out pipeline archive in fstab 
     lineinfile: 
     dest: /etc/fstab 
     regexp: '^//archive/pipeline' 
     line: '#//archive/pipeline' 
     state: present 
     tags: update-fstab 

mong đợi nó chỉ cần chèn biểu tượng bình luận (#), nhưng thay vào đó nó thay thế toàn bộ dòng và tôi vi khấu trừ với

#//archive/Pipeline 

có cách nào để chụp toàn bộ phần còn lại của dòng hoặc chỉ chèn một chú thích đơn?

regexp: '^//archive/pipeline *' 
line: '#//archive/pipeline *' 

hoặc

regexp: '^//archive/pipeline *' 
line: '#//archive/pipeline $1' 

Tôi cố gắng để quấn quanh đầu tôi lineinfile và từ những gì tôi "đã đọc nó trông giống như insertafter được những gì tôi đang tìm kiếm, nhưng 'chèn sau' isn' t những gì tôi muốn

Trả lời

10

bạn có thể sử dụng các mô-đun replace cho trường hợp của bạn:

--- 
- hosts: slurm 
    remote_user: root 

    tasks: 
    - name: Comment out pipeline archive in fstab 
     replace: 
     dest: /etc/fstab 
     regexp: '^//archive/pipeline' 
     replace: '#//archive/pipeline' 
     tags: update-fstab 

Nó sẽ thay thế tất cả các lần xuất hiện của chuỗi khớp với regexp.

lineinfile mặt khác, chỉ hoạt động trên một dòng (ngay cả khi nhiều kết hợp được tìm thấy trong một tệp). Nó đảm bảo một dòng cụ thể vắng mặt hoặc hiện diện với một nội dung xác định.

+1

Đã làm việc điều trị, cảm ơn. – datakid

7

Sử dụng backrefs=yes:

Được sử dụng với trạng thái = hiện tại. Nếu được đặt, dòng có thể chứa backreferences (cả vị trí và tên) sẽ được điền nếu regexp khớp với nhau.

Như thế này:

- name: Comment out pipeline archive in fstab 
    lineinfile: 
    dest: /etc/fstab 
    regexp: '(?i)^(//archive/pipeline.*)' 
    line: '# \1' 
    backrefs: yes 
    state: present 

Cũng lưu ý rằng tôi sử dụng (?i) lựa chọn cho regexp, bởi vì biểu hiện tìm kiếm của bạn sẽ không bao giờ phù hợp với Pipeline có vốn đầu P trong ví dụ fstab.

+0

Cảm ơn Konstantin, một câu trả lời hay, nhưng tôi đã quyết định sử dụng thay thế. – datakid

1

Đây là một trong nhiều lý do lineinfile là một mẫu giả mạo. Trong nhiều trường hợp, một mẫu là giải pháp tốt nhất. Trong trường hợp này, mô-đun mount được thiết kế cho việc này.

- name: Remove the pipeline archive 
    mount: name="/archive/pipeline" state=absent 

Nhưng "ah!" bạn nói, bạn "muốn bảo tồn rằng gắn kết trong fstab cùng một lúc". Bạn đã làm tốt hơn bằng cách sử dụng mount, bạn đã giữ nguyên nó trong ansible.

Các vấn đề liên quan