What is the right way to do add-apt-repository via Chef?

29,856

Solution 1

If you use chef v12.9 and above, Use the apt_repository resource for managing apt repositories. If you use chef lower than v12.8, you can use APT Cookbook provided by Chef Software, Inc. This cookbook provides same LWRP Following is the example usage of the resource:

apt_repository "nginx-php" do
  uri "http://ppa.launchpad.net/nginx/php5/ubuntu"
  distribution node['lsb']['codename']
  components ["main"]
  keyserver "keyserver.ubuntu.com"
  key "C300EE8C"
end

Solution 2

There is also a third-party apt cookbook that provides a ppa method:

ppa "user/repo"

https://github.com/sometimesfood/chef-apt-repo

Ideally this functionality should be added to the opscode apt cookbook.

Solution 3

Adding another answer since I just found myself back here. If you just have the URL for a key and not the key signature you can simply specify the URL in the key attribute:

apt_repository 'some_repo' do
  uri          'http://some_url/ubuntu/precise/amd64/'
  arch         'amd64'
  distribution 'precise'
  components   ['contrib']
  key          'https://some_key_url.com/debian/release.key'
end

From the documentation

Solution 4

One additional note is that once you have added the apt cookbook you should add a dependency statement to your cookbook. Update metadata.rb (should be in the base of your cookbook dir)

depends 'apt', '>= 2.7.0'

This will prevent the failure mode where a node can't update because it doesn't have the apt cookbook in it's runlist.

Share:
29,856
Artem
Author by

Artem

Software Developer Building Testing and Infrastructure projects

Updated on July 09, 2022

Comments

  • Artem
    Artem almost 2 years

    I'm learning Chef and I'm going to do right now for Ubuntu:

    execute "add-apt-repository ppa:#{node[:some_repo]}" do
      user "root"
    end
    
    execute "apt-get update" do
      user "root"
    end
    

    but may be there is a better ("chef-style"?) way to do it. Also, I concerned that sometimes add-apt-repository waits for "Enter" key on it's execution, so this approach might not work as is. What is the Right way of doing it?

    Edit: I only have ppa link in format: ppa:something/user