2015-06-11 15 views

Trả lời

28
- name: Check whether /tmp/my.conf contains "127.0.0.1" 
    command: grep -Fxq "127.0.0.1" /tmp/my.conf 
    register: checkmyconf 
    check_mode: no 
    ignore_errors: yes 
    changed_when: no 

- name: Greet the world if /tmp/my.conf contains "127.0.0.1" 
    debug: msg="Hello, world!" 
    when: checkmyconf.rc == 0 

Cập nhật 2017/08/28: phiên bản cũ Ansible cần phải sử dụng always_run: yes thay vì check_mode: no.

+1

OK. Bạn đã sử dụng mô-đun lệnh. Nó sẽ hoạt động. –

+1

Tôi thừa nhận đây không phải là một giải pháp tối ưu, bởi vì khó có thể chuyển nó sang Windows. Hãy để tôi xem nếu có bất cứ điều gì khác ... Không, tôi không thể tìm thấy bất kỳ cách nào khác. –

+1

Tôi không nghĩ check_mode là hợp lệ ở đây, vì nó chỉ bỏ qua thực hiện kiểm tra. –

5

Sử dụng lệnh dòng lệnh dễ đọc, nhưng lệnh này sẽ cập nhật tệp nếu dòng đó không tồn tại.

- lineinfile: dest=/tmp/my.conf line='127.0.0.1' state=present 
+5

Tôi không muốn bất kỳ cập nhật nào. –

+0

Tôi đồng ý với Antonis Christofides, tôi nghĩ bạn sẽ phải sử dụng mô-đun lệnh cho mục đích này. Bất kỳ sự thay thế nào dường như là một công việc xung quanh hơn là một giải pháp ansible. – VSK

+13

Sẽ rất tuyệt nếu kiểm tra trạng thái = trong mô-đun 'lineinfile' – mixja

12

Với giải pháp được chấp nhận, ngay cả khi bạn bỏ qua lỗi này, bạn vẫn sẽ nhận được kết quả báo lỗi màu đỏ xấu xí vào các nhiệm vụ đầu tiên nếu không có trận đấu:

TASK: [Check whether /tmp/my.conf contains "127.0.0.1"] *********************** 
failed: [localhost] => {"changed": false, "cmd": "grep -Fxq "127.0.0.1" /tmp/my.conf", "delta": "0:00:00.018709", "end": "2015-09-27 17:46:18.252024", "rc": 1, "start": "2015-09-27 17:46:18.233315", "stdout_lines": [], "warnings": []} 
...ignoring 

Nếu bạn muốn đầu ra ít tiết, bạn có thể sử dụng awk thay vì grep. awk sẽ không trả về một lỗi trên một tổ chức phi trận đấu, có nghĩa là nhiệm vụ kiểm tra đầu tiên dưới đây sẽ không lỗi bất kể một trận đấu hoặc không phù hợp:

- name: Check whether /tmp/my.conf contains "127.0.0.1" 
    command: awk /^127.0.0.1$/ /tmp/my.conf 
    register: checkmyconf 
    changed_when: False 

- name: Greet the world if /tmp/my.conf contains "127.0.0.1" 
    debug: msg="Hello, world!" 
    when: checkmyconf.stdout | match("127.0.0.1") 

ý rằng nhiệm vụ thứ hai của tôi sử dụng bộ lọc phù hợp như awk trả về chuỗi phù hợp nếu nó tìm thấy kết quả phù hợp.

Các lựa chọn ở trên sẽ cho kết quả sau bất kể nhiệm vụ kiểm tra có một trận đấu hay không:

TASK: [Check whether /tmp/my.conf contains "127.0.0.1"] *********************** 
ok: [localhost] 

IMHO đây là một cách tiếp cận tốt hơn vì bạn sẽ không bỏ qua các lỗi khác trong nhiệm vụ đầu tiên của bạn (ví dụ: nếu tập tin được chỉ định không tồn tại).

+3

Bạn có thể sử dụng 'failed_when: false' thay vì' ignore_errors' để tránh thông báo lỗi. – augurar

2

Một cách khác là sử dụng "thay thế mô-đun", sau đó "mô-đun lineinfile".

Bản ngã được đóng để sử dụng khi bạn muốn thay đổi giá trị của hai biến.

  • Trước tiên, hãy sử dụng "thay thế mô-đun" để phát hiện xem dòng bạn đang tìm kiếm có ở đây không và thay đổi thứ gì đó khác. (Giống như cùng một dòng + một cái gì đó ở cuối).
  • Sau đó, nếu "thay thế" là đúng, Điều đó có nghĩa là dòng của bạn ở đây rồi thay thế dòng mới bằng một đặc trưng, ​​với dòng mới đang tìm kiếm.
  • Khác dòng bạn đang tìm không có ở đây.

Ví dụ:

# Vars 
- name: Set parameters 
    set_fact: 
    newline  : "hello, i love ansible" 
    lineSearched : "hello" 
    lineModified : "hello you" 

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

- name: Line is here, change it 
    lineinfile: 
    state : present 
    dest : /dir/file 
    line : '{{ newline }}' 
    regexp : '{{ lineModified }}$' 
    when: checkIfLineIsHere.changed 
  • Nếu tập tin có chứa "hello", nó sẽ trở thành "hello bạn" sau đó "xin chào, tôi yêu ansible" ở cuối.
  • Nếu nội dung tệp không chứa "hello", tệp không bị sửa đổi.

Với ý tưởng tương tự, bạn có thể làm điều gì đó nếu lineSearched là ở đây:

# Vars 
- name: Set parameters 
    set_fact: 
    newline  : "hello, i love ansible" 
    lineSearched : "hello" 
    lineModified : "hello you" 

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

# If the line is here, I want to add something. 
- name: If line is here, do something 
    lineinfile: 
    state : present 
    dest : /dir/file 
    line : '{{ newline }}' 
    regexp : '' 
    insertafter: EOF 
    when: checkIfLineIsHere.changed 

# But 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 
  • Nếu tập tin có chứa "hello", dòng sẽ vẫn chứa "hello" và "hello, tôi yêu ansible "ở cuối.
  • Nếu nội dung tệp không chứa "hello", tệp không bị sửa đổi.
14

Sử dụng check_mode, đăng ký và thất bại_khi trong buổi hòa nhạc. Điều này không thành công nếu mô đun lineinfile sẽ thực hiện bất kỳ thay đổi nào đối với tệp đang được kiểm tra. Check_mode đảm bảo không có gì thay đổi ngay cả khi nó sẽ khác.

- name: "Ensure /tmp/my.conf contains '127.0.0.1'" 
    lineinfile: 
    path: /tmp/my.conf 
    line: "127.0.0.1" 
    state: present 
    check_mode: yes 
    register: contents_would_have 
    failed_when: (contents_would_have | changed) or (contents_would_have | failed) 
+1

Để sử dụng ansible 2.2 tên ':' thay vì 'đường dẫn:' – kubanczyk

+0

sử dụng gọn gàng 'check_mode'! – user2599522

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