Cài đặt gói từ PPA bằng Puppet


8

Tôi đang cố gắng tự động cung cấp máy ảo với docker được cài đặt sẵn.

Init.pp mặc định của tôi trông giống như:

class { 'apt':
 always_apt_update    => true,
}

package { [
    #'build-essential',
    #'vim',
    #'curl',
    #'zsh',
    #'git-core',
    #'htop',
    #'wget',
    #'linux-image-generic-lts-raring',
    'python-software-properties'
    #'lxc-docker'
  ]:
  ensure  => 'installed',
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# refresh apt source
exec { "apt-update":
  command => "/usr/bin/apt-get update && apt-get install lxc-docker --force-yes",
  returns => 100
}

Lệnh exec cuối cùng trả về (return 100 là mặc định cho bản cập nhật apt-get thành công mà tôi nghĩ):

information: Giao diện trang

Tuy nhiên khi tôi ssh vào docker box không được cài đặt và apt-get install lxc-dockertôi có thể cài đặt nó. Tôi đang làm gì sai? Tôi dường như không thể làm cho nó hoạt động với vô số cấu hình khác nhau.

Câu trả lời:


13

apt-gettrả về 0 khi thành công và 100 lỗi, như bạn có thể dễ dàng nhìn thấy từ apt-gettrang man. Vì vậy, bạn đã có điều đó ngược. Bạn đang kết hợp hai lệnh bằng cách sử dụng &&, có nghĩa là lệnh thứ hai chỉ chạy khi lệnh đầu tiên hoàn thành thành công (trả về 0). Vì vậy, nếu apt-get updatetrả về "100", như bạn mong đợi, lệnh thứ hai thậm chí sẽ không chạy.

Và nếu bạn đọc thông điệp tường trình một cách cẩn thận, bạn sẽ thấy rằng tài nguyên Exec được áp dụng có tên là "apt_update" chứ không phải "apt-update". Cái trước được định nghĩa trong aptlớp và chạy khi apt::ppatài nguyên được áp dụng. Cái sau là tài nguyên Exec của riêng bạn, cũng sẽ xuất hiện trong đầu ra nhật ký, nhưng là Exec[apt-update]. Hãy tìm nó

Trong mọi trường hợp, những gì bạn xây dựng ở đây không hoạt động vì bạn đang cố sử dụng Puppet làm tập lệnh Shell được tôn vinh và thực hiện sai. Con rối bỏ qua thứ tự mà bạn chỉ định tài nguyên trong tệp kê khai và thay vào đó áp dụng chúng theo cách nó thấy phù hợp. Vì vậy, để đảm bảo lxc-dockergói được cài đặt từ PPA được chỉ định, bạn cần đảm bảo tài nguyên PPA được áp dụng trước tài nguyên gói.

Có một vài cách để làm điều đó, tất cả chúng đều liên quan đến việc bạn chỉ định các mối quan hệ hoặc phụ thuộc. Đây là một cách, sử dụng mũi tên xích :

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# Your regular packages don't know or care about the PPA
package { [
    'build-essential',
    'vim',
    'curl',
    'zsh',
    'git-core',
    'htop',
    'wget',
    'linux-image-generic-lts-raring',
    'python-software-properties'
  ]:
  ensure  => 'installed',
}

# We single lxc-docker out to be able to specify 
# the relationship to Apt::Ppa properly
package { 'lxc-docker':
  ensure => 'installed'
}

Apt::Ppa['ppa:dotcloud/lxc-docker'] ->
Package['lxc-docker']

Điều này có nghĩa là lxc-dockertài nguyên gói sẽ được áp dụng sau khi apt::ppatài nguyên cho PPA "ppa: dotcloud / lxc-docker" đã được áp dụng. Như đã giải thích, apt::ppatài nguyên đã quan tâm đến việc cập nhật bộ đệm APT sau khi thêm PPA, do đó không cần phải gọi rõ ràng ở apt-get updatebất cứ đâu.


Bạn vẫn cần phải yêu cầu Exec['apt_update']các gói của bạn được cài đặt từ PPA. Yêu cầu PPA trước khi Gói không thực thi mối quan hệ giữa Exec và Gói.
daxlerod

1

Và đây là một câu trả lời thay thế, thành ngữ bằng cách sử dụng require:

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

package { [others]: }    

package { 'lxc-docker':
  ensure  => 'installed',
  require => Apt::Ppa['ppa:dotcloud/lxc-docker']
}
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.