2013-02-14 25 views
39

Đây là cách tiếp cận ngây thơ của tôi:Làm thế nào để bạn nối các chuỗi trong một tệp .pppp Puppet?

# puppet/init.pp 
$x = 'hello ' + 
    'goodbye' 

này không hoạt động. Làm thế nào hiện một chuỗi nối trong Rối?

+2

Tôi không hỏi chính xác câu hỏi đúng. Những gì tôi nên hỏi là, có một nhà điều hành nối chuỗi trong Puppet DSL? Có vẻ như hiện tại không có nội dung nào như vậy: http://projects.puppetlabs.com/issues/15330 – rlandster

Trả lời

60

từ khóa suy biến:

$value = "${one}${two}" 

Nguồn: http://docs.puppetlabs.com/puppet/4.3/reference/lang_variables.html#interpolation

Lưu ý rằng mặc dù nó có thể làm việc mà không có dấu ngoặc nhọn, bạn nên luôn sử dụng chúng.

+0

Cũng không phải điều này sẽ chỉ hoạt động trong phân bổ biến như đã trình bày ở trên. Nếu bạn muốn sử dụng nó trong một quy tắc con rối sau khi '=>' trước tiên gán nó cho một biến, sau đó sử dụng biến sau '=>'. – Tully

+0

Nên hoạt động tốt sau khi '=>', Tully. Bạn đang sử dụng phiên bản Puppet nào? – Nick

+0

Đây là giải pháp thay thế cho nối, nhưng không phải là câu trả lời cho câu hỏi như được đặt ra. Nếu nhu cầu của OP được thỏa mãn, điều đó rất hữu ích, nhưng có nhiều trường hợp điều này sẽ không làm, ít nhất là không có các bước trung gian. Ví dụ. nếu bạn đang cố gắng tránh gán một chuỗi dài nghìn ký tự trong mã rối với toàn bộ điều trên một dòng, hoặc nếu một trong những thứ bạn đang nối là đầu ra của một cuộc gọi hàm. – mc0e

1

Làm việc sau đây cho tôi.

puppet apply -e ' $y = "Hello" $z = "world" $x = "$y $z" notify { "$x": } ' 
notice: Hello world 
notice: /Stage[main]//Notify[Hello world]/message: defined 'message' as 'Hello world' 
notice: Finished catalog run in 0.04 seconds 

Các công trình sau đây cũng như:

$abc = "def" 

file { "/tmp/$abc": 
+3

Thật không may, điều này không hoạt động khi một trong các cụm từ là một biểu thức. * Ví dụ: *, '$ foo = regsubst ($ bar, '/', '-', 'G') + $ version' – RoUS

+0

Bạn có thể đặt đầu ra của biểu thức vào một biến trung gian khác trước. tức là '$ temp = regsubst ($ bar, '/', '-', 'G')' và sau đó '$ foo =" $ {temp} $ {version} "' – mc0e

18

Tôi sử dụng cấu trúc nơi tôi đặt các giá trị vào một mảng rồi sau đó 'ghép nối' chúng. Trong ví dụ này, đầu vào của tôi là một mảng và sau khi được nhập với ': 2181', giá trị kết quả lại được đưa vào một mảng được nối với một chuỗi rỗng làm dấu tách.

$zookeeperservers = [ 'node1.example.com', 'node2.example.com', 'node3.example.com' ] 
$mesosZK = join([ "zk://" , join($zookeeperservers,':2181,') ,":2181/mesos" ],'') 

kết quả giá trị của $ mesosZK

zk://node1.example.com:2181,node2.example.com:2181,node3.example.com:2181/mesos 
+3

Điều này sử dụng [tham gia] của mô-đun puppetlabs-stdlib (https: // github.chức năng com/puppetlabs/puppetlabs-stdlib # join), cho những người tự hỏi. – MrAlias

10

Một lựa chọn khác không được đề cập trong câu trả lời khác đang sử dụng Puppet's sprintf() chức năng, có chức năng giống hệt với Ruby function đằng sau nó. Ví dụ:

$x = sprintf('hello user %s', 'CoolUser') 

Được xác minh để hoạt động hoàn hảo với con rối. Như đã đề cập bởi chutz, cách tiếp cận này cũng có thể giúp bạn nối đầu ra của các hàm.

+1

Bằng cách này, bạn có thể kết nối đầu ra của các hàm - một thứ không dễ dàng với các câu trả lời khác. Ví dụ. '$ x = sprintf ('% s /% s', tên dirname ($ file), $ anotherfile)' – chutz

0

Bạn có thể sử dụng hàm join() từ puppetlabs-stdlib. Tôi đã nghĩ rằng nên có một chức năng chuỗi concat ở đó, nhưng tôi không nhìn thấy nó. Nó sẽ dễ dàng để viết một.

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