Truyền các lệnh dạng tự do cho Ansible bằng cách sử dụng dạng phức-args


9

Tôi đang sử dụng các Playbook Ansible được lập trình. Nói chung, vì playbooks chỉ là YAML, điều này rất đơn giản. Tuy nhiên, khi sử dụng key=valuehình thức "đơn giản" , Playbooks không phải là YAML thuần túy - chúng bao gồm nội dung được nhúng ở shlexdạng có thể nhìn thấy được.

Để tránh sự nhập nhằng theo hình thức này (là key=valuecặp một cuộc tranh cãi với lệnh hoặc một cuộc tranh cãi cho ansible?), Và chỉ có một định dạng duy nhất để phân tích và tạo ra, tôi vô điều kiện sử dụng cơ chế phức tạp args chứng minh bằng ví dụ trong các ansible kho lưu trữ mẫu .

Điều này sử dụng một cú pháp của loại sau:

action: module-name
args:
  key1: value1
  key2: value2

... đó là tốt và tốt. Tuy nhiên, khi cố gắng sử dụng hình thức này cho shellhay commandmodule ( có tài liệu mô tả các lệnh thực tế như được thông qua trong một cuộc tranh cãi mang tên free_form), điều này không làm việc rất tốt:

action: shell
args:
  free_form: echo hello_world >/tmp/something
  creates: /tmp/something

Khi được gọi, điều này chạy như sau:

/bin/sh -c " free_form='echo hello_world >/tmp/something'  "

... đó không phải là những gì tôi đang cố gắng thực hiện.

Cách đúng đắn để sử dụng các mô-đun Ansible sử dụng các lệnh "dạng tự do" bằng cú pháp YAML thuần túy là gì?

Câu trả lời:


5

Trả lời ngắn gọn: Đỗ không sử dụng command, raw, script, hoặc shellmô-đun. Viết mô-đun của riêng bạn chấp nhận lệnh như là một đối số "bình thường".

Câu trả lời dài:

Trong hầu hết các trường hợp, bạn có thể làm điều này:

- shell: echo hello_world > /tmp/something
  args:
    creates: /tmp/something

Tuy nhiên, điều này thất bại trong một số trường hợp cạnh:

- shell: echo hello_world > creates=something
  args:
    creates: creates=something  # The file is named "creates=something"

Tôi không biết một cách chung để xử lý việc này, nhưng một giải pháp dành riêng cho bash là:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something

Có cấu trúc dữ liệu nào tôi có thể chuyển cho bất kỳ trình tạo YAML tuân thủ nào để làm cho nó phát ra - shell: ...không? Nếu cấu trúc này là một cái gì đó chỉ có thể được tạo ra một cách đáng tin cậy bằng tay, điều đó phần nào đánh bại điểm của câu hỏi.
Charles Duffy

@CharlesDuffy: Tôi không nghĩ bạn có thể thoát khỏi ...phần nói chung. Nếu bạn nhìn vào library/commands/command, bạn sẽ tìm thấy một regex khớp khá hào phóng creates=, removes=, chdir=, và vân vân. Nếu bạn cần đảm bảo bất kỳ lệnh nào có thể được chuyển qua, bạn sẽ phải viết mô-đun của riêng bạn.
Snowball

Hội chợ 'nuff. Trong suy nghĩ của tôi, đây là một lỗi thiết kế đáng kể ... nhưng, tốt, nó là như vậy.
Charles Duffy

0

Điều này được giải quyết trong tài liệu Ansible bây giờ.

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# /path/to/database doesn't exist.
- command: /usr/bin/make_database.sh arg1 arg2
  args:
    chdir: somedir/
    creates: /path/to/database

Lưu ý rằng không có tham số có tên 'free_form'.


Có sự hiện diện của các cặp argsngăn không k=vđược phân tích cú pháp từ command, có nên tồn tại? (Nếu vậy, điều này giải quyết sự mơ hồ một cách sạch sẽ; nếu không, nó dường như vẫn còn tồn tại).
Charles Duffy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.