Vraag gebruik van Python-code met Puppet


Ik probeer een implementatiesysteem voor mijn webtoepassing te implementeren, gebaseerd op Puppet.

De applicatie bestaat uit verschillende services (een aantal webservers: Django- en Tornado-gebaseerd en een werknemer gebaseerd op Celery). Ze leven in verschillend git opslagplaatsen, gehost op github.

Ik heb Chef gebruikt voor mijn vorige projecten. In het geval van Chef zou het gemakkelijk zijn om zo'n ding in te zetten: ik zou het gewoon gebruiken git bron om de benodigde code voor dit specifieke knooppunt uit te checken en alles anders op te zetten.

Ik begrijp echter niet hoe het in Puppet is gebeurd. Ik heb geen gevonden git typ documentatie in. Ik heb geprobeerd het te googelen, maar van wat ik heb gevonden lijkt het erop dat het uitchecken en updaten git code van Puppet is geen gebruikelijke taak.

Het is duidelijk dat mijn veronderstelde workflow enigszins ongewoon is voor Puppet. Ik zou iets anders kunnen proberen. Wat is de natuurlijke manier om dergelijke apps met Puppet te implementeren?


6
2018-05-25 12:57


oorsprong


Mogelijk duplicaat van serverfault.com/questions/296299/... - François Beausoleil


antwoorden:


Ik zou gebruiken kleding stof om Python-code in te zetten - sterker nog, ik doe het. Maar als alles wat je wilt het git-spul is, is hier een voorbeeld van mijn marionettenconfiguraties met de vcsrepo-module:

vcsrepo { '/var/www/gitorious':
    ensure   => present,
    owner    => 'git',
    source   => 'git://gitorious.org/gitorious/mainline.git',
    revision => 'v2.2.1',
    provider => git,
}   

Over het algemeen is Puppet geen goed hulpmiddel als je dingen in een kort tijdsbestek gedaan wilt hebben. Puppetlabs oplossing voor deze taken is MCollective, die ik heb gebruikt en niet leuk vond.


1
2018-05-25 17:59



Wil je uitleggen over wat / waarom je een hekel hebt aan MCollective? - François Beausoleil
@ FrançoisBeausoleil Het vereist dat je ruby ​​scripts schrijft voor alles wat je wilt doen; het is een client-server applicatie, dus elke storing op de servers maakt ze onbereikbaar; het vereist dat u uw modules op de servers implementeert voordat u ze gebruikt; het vereist een lopend proces op de server, en op dat moment een robijn; het heeft een extreem niet intuïtieve CLI, met betrekking tot server selectie, modules, mcollectieve parameters versus modules parameters; het heeft een zeer slechte foutrapportage; de documentatie zuigt; de bestaande modules zijn buggy. Waarschijnlijk andere dingen die ik ook vergeet. - Daniel C. Sobral


Het is waar dat er geen moedertaal is git brontype in Puppet, maar ik zou het geen "ongebruikelijke taak" noemen.

Er zijn verschillende oplossingen om dit zelf te implementeren met define. We gebruiken een git klasse die a definieert git::repository brontype zoals dit:

class git {
  define repository (
    $url,
    $workdir=undef,
    $branch=undef,
    $recursive=undef,
    $pull=true
  ) {
    if $workdir {
      $r_workdir = $workdir
    } else {
      $r_workdir = $name
    }

    if $branch {
      $branch_arg = "--branch $branch"
    }

    if $recursive {
      $recursive_arg = '--recursive'
    }

    exec { "clone-gitrepo-$name":
      creates => "$r_workdir",
      command => "/usr/bin/git clone $branch_arg $recursive_arg $url $r_workdir",
    }

    # This is here so other things can depend on
    # File[/path/to/working/directory].
    file { $r_workdir:
      ensure  => directory,
      require => Exec["clone-gitrepo-$name"],
    }

    if $pull {
      exec { "update-gitrepo-$name":
        require => Exec["clone-gitrepo-$name"],
        cwd     => "$r_workdir",
        command => '/usr/bin/git pull',
      }
    }
  }
}

We gebruiken het bijvoorbeeld op deze manier:

class openstack::controller::novnc {
  include git

  git::repository { '/opt/noVNC':
    url => 'git://github.com/cloudbuilders/noVNC.git',
  }
}

Het voert een git pull elke keer dat Puppet wordt uitgevoerd, tenzij u dit instelt pull naar false.

Merk op dat ik geen enkele claim maak met betrekking tot de juistheid of robuustheid van deze oplossing; het is wat we gebruiken en het werkt voor ons, maar er zijn mogelijk meer feature-ful oplossingen die er zijn.

U kunt onze code online vinden hier.


3
2018-05-25 13:28





De snelle en vuile manier is om exec te gebruiken:

exec { 'install abcd':
  path    => ['/bin', '/usr/bin'],
  cwd     => '/usr/local',
  command => 'git clone http:/.../abcd',
  creates => '/usr/local/abcd',
}

Het is ook niet moeilijk om je eigen Git-bron te maken, op basis daarvan:

define git ($package, $source) {
  exec {...}
}

Ik denk echter dat het op de schone manier is om alle software die je gebruikt te verpakken in pakketten (deb of yum of wat je besturingssysteem ook gebruikt), en upload het naar de Puppet-master. Vervolgens, wanneer een server wordt geïnstalleerd, zal deze alles vinden wat het nodig heeft op de Puppet master, in plaats van een verbinding te maken met verschillende git repositories (en piprepository's en mercurial repositories, want als je deze truc voor git gaat doen, dan ben je ' Ik doe het ook voor pip). De installatie zal dan veel betrouwbaarder zijn (een van de git / pip / hg-verbindingen kan tijdelijk uitvallen of zijn verplaatst), en zal minder bandbreedte gebruiken, vooral als u uw software op veel servers installeert. Als u geen tijd over heeft om pakketten te maken, is het maken van .tar.gz-pakketten een tussenoplossing. Natuurlijk kost dit ook tijd, ik weet het; Ik gebruik ook de snelle en vuile manier wanneer ik haast heb.


2
2018-05-25 13:31





Om Python-code in een productieomgeving te implementeren, zou u dit moeten doen sterk overweeg gebruik virtualenv.

Als je via Puppet implementeert, moet je kijken naar de python-puppet module. Hiermee kun je alles wat je nodig hebt orkestreren in een Python-productieomgeving, inclusief virtualenvs.


0
2017-11-29 06:35