2015-03-16 20 views
12

Tôi đang thử chèn một dòng trong một tệp thuộc tính bằng cách sử dụng ansible. Tôi muốn thêm một số thuộc tính nếu nó không tồn tại, nhưng không thay thế nếu thuộc tính đó đã tồn tại trong tệp.Ansible: Chèn dòng nếu không tồn tại

tôi thêm vào vai trò ansible tôi

- name: add couchbase host to properties 
    lineinfile: dest=/database.properties regexp="^couchbase.host" line="couchbase.host=127.0.0.1" 

Nhưng điều này thay thế các giá trị tài sản trở lại 127.0.0.1 nếu nó tồn tại sẵn trong file.

Tôi đang làm gì sai?

Trả lời

14

Bạn không làm gì sai với mô-đun lineinfile. Nó làm những gì nó phải. Nó đảm bảo dòng như được định nghĩa trong line có trong tệp và dòng được xác định bởi regexp của bạn. Vì vậy, bất kể giá trị cài đặt của bạn đã có, giá trị đó sẽ bị ghi đè bởi line mới của bạn.

Nếu bạn không muốn ghi đè dòng, trước tiên bạn cần kiểm tra nội dung và sau đó áp dụng điều kiện đó cho mô-đun lineinfile. Tôi nghĩ rằng không có mô-đun để kiểm tra nội dung của tệp nên bạn có thể cần phải chạy grep với lệnh shell và kiểm tra .stdout cho nội dung. Một cái gì đó như thế này (chưa được kiểm tra):

- name: Test for line 
    shell: grep "^couchbase.host" /database.properties 
    register: test_grep 

Và sau đó áp dụng các điều kiện để lineinfile nhiệm vụ của bạn:

- name: add couchbase host to properties 
    lineinfile: dest=/database.properties line="couchbase.host=127.0.0.1" 
    when: test_grep.stdout != "" 

Các regexp sau đó có thể được gỡ bỏ từ của bạn đã thực hiện chắc chắn dòng không tồn tại nên nó không bao giờ phù hợp.

Nhưng có thể bạn đang làm mọi thứ trở lại trước. Dòng đó trong tập tin đến từ đâu? Khi bạn quản lý hệ thống của mình với Ansible, sẽ không có cơ chế nào khác có thể can thiệp vào cùng một tệp cấu hình. Có lẽ bạn có thể giải quyết vấn đề này bằng cách thêm một giá trị default vào vai trò của bạn?

+0

Tôi cần phải thêm một thuộc tính mới vào môi trường triển khai của mình. Điều này bao gồm các máy chủ sản xuất và mô phỏng. chạy ansible tôi trên cron và khi khởi động máy chủ (tôi có thể tạo các máy chủ mô phỏng từ một hình ảnh theo yêu cầu) Giá trị mặc định cho tài sản là localhost, nhưng trên một số máy chủ của tôi sẽ thay đổi nó bằng tay sau đó. Tôi nghĩ rằng ansible là tốt cho xử lý sự thay đổi đó –

+0

Ansible sẽ có thể cung cấp các máy chủ mới của bạn, và cấu hình chúng là tốt. Chỉ trong playbook của bạn, nơi bạn đã sử dụng mô-đun lineinfile, bạn đã chỉ định ansible để luôn có một dòng 'couchbase.host = 127.0.0.1' và ghi đè giá trị trước đó. Đó là cách bạn đã cấu hình nó. – Zasz

+0

Hãy thử sử dụng mệnh đề khi như @udondan nêu – Zasz

3

Bằng một chặng đường dài của "Thử nghiệm và lỗi:" Tôi đến đây:

- name: check existence of line in the target file 
    command: grep -Fxq "ip addr add {{ item }}/32 dev lo label lo:{{ app | default('app') }}" /etc/rc.local 
    changed_when: false 
    failed_when: false 
    register: ip_test 
    with_items: 
    - "{{ list_of_ips }}" 

- name: add autostart command 
    lineinfile: dest=/etc/rc.local 
       line="ip addr add {{ item.item }}/32 dev lo label lo:{{ app | default('app') }}" 
       insertbefore="exit 0" 
       state=present 
    when: item.rc == 1 
    with_items: 
    - "{{ ip_test.results }}" 
3

Đây là cách duy nhất tôi đã có thể có được điều này để làm việc.

- name: checking for host 
    shell: cat /database.properties | grep couchbase.host | wc -l 
    register: test_grep 

- debug: msg="{{test_grep.stdout}}" 

- name: adding license server 
    lineinfile: dest=/database.properties line="couchbase.host=127.0.0.1" 
    when: test_grep.stdout == "0" 
+0

'shell: grep -c couchbase.host/database.properties', ít mã nhị phân. – Yaron

1

Cùng ý tưởng như đã trình bày ở đây: https://stackoverflow.com/a/40890850/7231194

bước là:

  • Cố gắng thay thế dòng.
  • Nếu thay thế mod thay đổi nó, khôi phục
  • Nếu thay thế mod không thay đổi, thêm dòng

Ví dụ

# Vars 
- name: Set parameters 
    set_fact: 
    ipAddress : "127.0.0.1" 
    lineSearched : "couchbase.host={{ ipAddress }}" 
    lineModified : "couchbase.host={{ ipAddress }} hello" 

# Tasks 
- name: Try to replace the line 
    replace: 
    dest : /dir/file 
    replace : '{{ lineModified }} ' 
    regexp : '{{ lineSearched }}$' 
    backup : yes 
register : checkIfLineIsHere 

# If the line not is here, I add it 
- name: Add line 
    lineinfile: 
    state : present 
    dest : /dir/file 
    line : '{{ lineSearched }}' 
    regexp : '' 
    insertafter: EOF 
when: checkIfLineIsHere.changed == false 

# If the line is here, I still want this line in the file, Then restore it 
- name: Restore the searched line. 
    lineinfile: 
    state : present 
    dest : /dir/file 
    line : '{{ lineSearched }}' 
    regexp : '{{ lineModified }}$' 
    when: checkIfLineIsHere.changed 
0

Ok, đây là của tôi giải pháp ngây thơ ...có lẽ không phải là một nền tảng và bản địa Ansible (tôi mới bắt đầu sử dụng công cụ này và vẫn tìm hiểu nó), nhưng chắc chắn ngắn hơn:

- name: Update /path/to/some/file 
    shell: grep -q 'regex' /path/to/some/file && echo exists || echo 'text-to-append' >> /path/to/some/file 
    register: result 
    changed_when: result.stdout.find('exists') == -1 
Các vấn đề liên quan