Làm thế nào tôi có thể chuyển biến cho playbook ansible trong dòng lệnh?


Câu trả lời:


307

Đọc tài liệu tôi thấy phần Truyền các biến trên dòng lệnh , đưa ra mẫu này:

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"

Các ví dụ khác trình bày cách tải từ chuỗi JSON (≥ 1.2) hoặc tệp (≥ 1.3)


33
Cũng lưu ý rằng (các) biến được xác định bằng --extra-varssẽ ghi đè (các) biến được xác định trong playbook.
tổng kiểm tra

5
Cũng lưu ý (từ các tài liệu): Các giá trị được truyền bằng cách sử dụng key=valuecú pháp được hiểu là các chuỗi . Sử dụng định dạng JSON nếu bạn cần chuyển vào bất kỳ thứ gì không phải là một chuỗi (Booleans, số nguyên, số float, danh sách, v.v.). Ví dụ:--extra-vars '{"i_wasted_30_mins_debugging_a_boolean_string":true}'
smilin_stan

159

Các câu trả lời khác nêu cách chuyển qua các biến dòng lệnh nhưng không biết cách truy cập chúng, vì vậy nếu bạn thực hiện:

--extra-vars "version=1.23.45 other_variable=foo"

Trong tệp yml của bạn, bạn chỉ định các biến này cho các biến có thể tìm thấy trong phạm vi bằng cách thực hiện một số thứ như:

vars:
    my_version: "{{ version }}"
    my_other_variable: {{ other_variable }}

Một cách khác để sử dụng đối số dòng lệnh là sử dụng các biến môi trường đã được xác định trong phiên của bạn, bạn có thể tham chiếu các biến này trong các tệp yml có thể tìm thấy của mình như sau:

vars:
    my_version: "{{ lookup('env', 'version') }}"
    my_other_variable: {{ lookup('env', 'other_variable') }}

29
Không chắc chắn những gì bạn đang nói về ?? Câu trả lời của tôi mở rộng dựa trên các câu trả lời được chấp nhận trước đó bằng cách tham khảo cờ dòng lệnh --extra-vars cách tham chiếu chúng trong cấu hình yaml của bạn. Sau đó, tôi cung cấp một cách khác để làm điều đó là tốt.
GreensterRox

1
Câu hỏi ở đây là đặc biệt chuyển biến qua dòng lệnh . Đó chính xác là lý do tại sao nó sẽ tốt hơn khi là câu hỏi / câu trả lời của riêng nó và một liên kết liên quan. Bạn có thể và các liên kết liên quan như là một nhận xét cho câu hỏi.
Édouard Lopez

43
Câu trả lời mở rộng đã giúp tôi. Chắc chắn biết cách tham chiếu các biến được truyền trong một phần của việc biết cách truyền tham số. Nếu không, bạn không vượt qua chúng mà chỉ tuyên bố bạn muốn vượt qua biến. Để vượt qua một đối tượng cần có người cho và người nhận. Để vượt qua một biến đòi hỏi một khai báo tham số và sử dụng tham số.
tiếp

lookup('env', SOMETHING)được kết hợp với 12 yếu tố.
zx1986

1
Hãy nhớ thay đổi tên của biến: version: {{ version }}là sai, giống như tự xác định version.
Minh Nghĩa

41
ansible-playbook release.yml -e "version=1.23.45 other_variable=foo"

25
Các -elá cờ là hình thức ngắn--extra-vars
Édouard Lopez

4
Tôi có thể vượt qua tập tin biến?
OpsEco

13
@AniruddhaJawanjal có, thích--extra-vars "@some_file.json"
AlanSE

1
@OpsEco @AlanSE lưu ý rằng nếu bạn đang truyền các biến từ một tệp, bạn cần một --extra-varscờ thứ hai để truyền các biến không có trong tệp. Ví dụ--extra-vars "@some_file.json" --extra-vars "other_variable=foo"
bonh

Cảm ơn bạn @bonh đó là những gì tôi đang tìm kiếm
người hâm mộ


31

Đối với một số lý do không có câu trả lời trên làm việc cho tôi. Vì tôi cần chuyển một số vars bổ sung vào playbook của mình trong Ansbile 2.2.0, đây là cách tôi làm cho nó hoạt động (lưu ý tùy chọn -e trước mỗi var):

ansible-playbook site.yaml -i hostinv -e firstvar=false -e second_var=value2

4
-elà hình thức ngắn của--extra-vars
Édouard Lopez

@LXCdev KohaLappi +1 để chứng minh rằng bạn có thể chỉ định các bình bổ sung trong -ecờ riêng của họ
ctl Racer

Bạn cũng có thể xác định nhiều biến bằng một cờ duy nhất:-e "firstvar=false second_var=value2"
Nils Breunese

Vấn đề tương tự. Nhiều vars với một cờ duy nhất sẽ không hoạt động. Tôi tự hỏi tại sao?
Bret

14
ansible-playbook test.yml --extra-vars "arg1=${var1} arg2=${var2}"

Trong tệp yml bạn có thể sử dụng chúng như thế này

---
arg1: "{{ var1 }}"
arg2: "{{ var2 }}"

Ngoài ra, --extra-vars-egiống nhau, bạn có thể sử dụng một trong số chúng.


4
 s3_sync:
      bucket: ansible-harshika
      file_root: "{{ pathoftsfiles  }}"
      validate_certs: false 
      mode: push
      key_prefix: "{{ folder }}"

ở đây các biến đang được sử dụng có tên là 'pathoftsfiles' và 'thư mục'. Bây giờ giá trị cho biến này có thể được đưa ra bằng lệnh dưới đây

sudo ansible-playbook multiadd.yml --extra-vars "pathoftsfiles=/opt/lampp/htdocs/video/uploads/tsfiles/$2 folder=nitesh"

Lưu ý: Không sử dụng dấu phẩy đảo ngược trong khi truyền các giá trị cho biến trong lệnh shell


2
ansible-playbook release.yml --extra-vars "username=hello password=bye"

#you can now use the above command anywhere in the playbook as an example below:
tasks:
- name: Create a new user in Linux
shell: useradd -m -p {{username}} {{password}}"

2

Điều này cũng làm việc cho tôi nếu bạn muốn sử dụng các biến môi trường shell:

ansible-playbook -i "localhost," ldap.yaml --extra-vars="LDAP_HOST={{ lookup('env', 'LDAP_HOST') }} clustername=mycluster env=dev LDAP_USERNAME={{ lookup('env', 'LDAP_USERNAME') }} LDAP_PASSWORD={{ lookup('env', 'LDAP_PASSWORD') }}"


1

ansible-playbok -i <inventory> <playbook-name> -e "proc_name=sshd"

Bạn có thể sử dụng lệnh trên trong playbooks bên dưới.

---
- name: Service Status
gather_facts: False
tasks:
- name: Check Service Status (Linux)
shell: pgrep "{{ proc_name }}"
register: service_status
ignore_errors: yes
debug: var=service_status.rc`
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.