Projetos

Um projeto é uma coleção de recursos que definem configurações de nó. Os projetos contêm especificações. Quando um nó é iniciado, ele é configurado processando e executando uma sequência de especificações.

O Azure CycleCloud usa projetos para gerenciar aplicativos clusterizados, como agendadores de lote. No CycleCloud HPCPack, o projeto é uma especificação e cn especificação hn que definem as configurações e as receitas do headnode e do computenode HPCPack.

Abaixo está uma definição de nó parcial. O nó docker-registry executará três especificações: associar especificação do projeto okta versão 1.3.0, bem como especificações principais e de registro do projeto do Docker versão 2.0.0:

[[node docker-registry]]
    Locker = base-storage
    [[[cluster-init okta:bind:1.3.0]]]
    [[[cluster-init docker:core:2.0.0]]]
    [[[cluster-init docker:registry:2.0.0]]]

A marca à direita é o número da versão do projeto.

[[[cluster-init <project>:<spec>:<project version>]]]

Um armário é uma referência a um contêiner de conta de armazenamento e credencial. Os nós têm um armário padrão, portanto, esse atributo não é estritamente necessário.

O Azure CycleCloud usa uma abreviação para contas de armazenamento, portanto https://mystorage.blob.core.windows.net/mycontainer , pode ser gravado como az://mystorage/mycontainer.

O nó baixará cada projeto referenciado do cofre usando a ferramenta pogo:

pogo get az://mystorage/mycontainer/projects/okta/1.3.0/bind

Se um projeto for definido em um nó, mas não existir no local de armazenamento esperado, o nó relatará um Software Installation Failure ao CycleCloud.

O CycleCloud tem projetos internos executados por padrão em todos os nós para executar o volume especial e a comunicação de configuração e manipulação de rede para o CycleCloud. Esses projetos internos são espelhados automaticamente no armário.

O usuário é responsável por espelhar quaisquer projetos adicionais no cofre. A CLI do CycleCloud tem métodos para redigir projetos:

cyclecloud project init myproject

e espelho:

cyclecloud project init mylocker

projetos para armários.

As especificações são compostas por scripts python, shell ou powershell.

Criar um novo projeto

Para criar um novo projeto, use o comando cyclecloud project init myprojectda CLI, onde myproject está o nome do projeto que você deseja criar. Isso criará um projeto chamado "myproject", com uma única especificação chamada "padrão" que você pode alterar. A árvore de diretório será criada com arquivos esqueleto que você alterará para incluir suas próprias informações.

Estrutura de diretórios

Os seguintes diretórios serão criados pelo comando do projeto:

      \myproject
          ├── project.ini
          ├── blobs
          ├── templates
          ├── specs
          │   ├── default
          │     └── cluster-init
          │        ├── scripts
          │        ├── files
          │        └── tests
          │     └── chef
          │         ├── site-cookbooks
          │         ├── data_bag
          │         └── roles

O diretório de modelos manterá seus modelos de cluster, enquanto as especificações conterão as especificações que definem seu projeto. spec tem dois subdiretórios: cluster-init e chef personalizado. cluster-init contém diretórios que têm significado especial, como o diretório de scripts (contém scripts executados em ordem lexicográfica no nó), arquivos ( arquivos de dados brutos a serem colocados no nó) e testes (contém testes a serem executados quando um cluster é iniciado no modo de teste).

O subdiretório chef personalizado tem três diretórios: site-cookbooks (para definições de livro de receitas), data_bags (definições de databag) e funções (arquivos de definição de função chef).

project.ini

project.ini é o arquivo que contém todos os metadados do projeto. Ele pode conter:

Parâmetro Descrição
name Nome do projeto. As palavras devem ser separadas por traços, por exemplo, order-66-2018
label Nome do projeto. Nome longo (com espaços) do cluster para fins de exibição.
tipo Três opções: agendador, aplicativo, <em branco>. Determina o tipo de projeto e gera o modelo apropriado. Padrão: aplicativo
version Formato: x.x.x

Armários

O conteúdo do projeto é armazenado dentro de um armário. Você pode carregar o conteúdo do seu projeto em qualquer armário definido em sua instalação do CycleCloud por meio do comando cyclecloud project upload (locker), em que (locker) é o nome de um cofre de armazenamento em nuvem em sua instalação do CycleCloud. Esse armário será definido como o destino padrão. Como alternativa, você pode ver quais armários estão disponíveis para você com o comando cyclecloud locker list. Detalhes sobre um armário específico podem ser exibidos com cyclecloud locker show (locker).

Se você adicionar mais de um armário, poderá definir seu padrão com cyclecloud project default_target (locker), em seguida, simplesmente executar cyclecloud project upload. Você também pode definir um armário padrão global que pode ser compartilhado por projetos com o comando cyclecloud project default locker (locker) -global.

Observação

Os armários padrão serão armazenados no arquivo de configuração do cyclecloud (geralmente localizado em ~/.cycle/config.ini), não no project.ini. Isso é feito para permitir que project.ini sejam controlados por versão.

Carregar o conteúdo do projeto fechará os diretórios do chef e sincronizará o chef e o cluster em seu armário de destino. Elas serão armazenadas em:

  • (locker)/projects/(project)/(version)/(spec_name)/cluster-init
  • (locker)/projects/(project)/(version)/(spec_name)/chef

Blob Download

Use project download para baixar todos os blobs referenciados no project.ini para o diretório de blobs local. O comando usa o [locker] parâmetro e tentará baixar blobs listados em project.ini do armário para o armazenamento local. Um erro será retornado se os arquivos não puderem ser localizados.

Instalação do projeto

Especificações

Ao criar um novo projeto, uma única especificação padrão é definida. Você pode adicionar especificações adicionais ao projeto por meio do cyclecloud project add_spec comando.

Controle de versão

Por padrão, todos os projetos têm uma versão 1.0.0. Você pode definir uma versão personalizada à medida que desenvolve e implanta projetos configurando version=x.y.z no arquivo project.ini .

Por exemplo, se "locker_url" fosse "az://my-account/my-container/projects", o projeto se chamava "Order66", a versão era "1.6.9" e a especificação é "padrão", sua URL seria:

  • az://my-account/my-container/projects/Order66/1.6.9/default/cluster-init
  • az://my-account/my-container/projects/Order66/1.6.9/default/chef

Blobs

Há dois tipos de blob: blobs de projeto e blobs de usuário.

Blobs do Projeto

Os Blobs do Projeto são arquivos binários fornecidos pelo autor do projeto com a suposição de que eles podem ser distribuídos (ou seja, um arquivo binário para um projeto código aberto que você tem permissão legal para redistribuir). Os Blobs do Projeto entram no diretório "blobs" de um projeto e, quando carregados em um armário, eles estarão localizados em /project/blobs.

Para adicionar blobs a projetos, adicione os arquivos ao seuproject.ini:

[[blobs optionalname]]
  Files = projectblob1.tgz, projectblob2.tgz, projectblob3.tgz

Vários blobs podem ser separados por uma vírgula. Você também pode especificar o caminho relativo para o diretório de blob do projeto.

Blobs de usuário

Blobs de usuário são arquivos binários que o autor do projeto não pode redistribuir legalmente, como binários UGE. Esses arquivos não são empacotados com o projeto, mas devem ser preparados manualmente para o armário. Os arquivos estarão localizados em /blobs/my-project/my-blob.tgz. Blobs de usuário não precisam ser definidos no project.ini.

Para baixar qualquer blob, use o jetpack download comando da CLI ou o jetpack_download recurso Chef. O CycleCloud procurará primeiro o blob do usuário. Se esse arquivo não estiver localizado, o blob no nível do projeto será usado.

Observação

É possível substituir um blob de projeto com um blob de usuário com o mesmo nome.

Especificar Projeto dentro de um modelo de cluster

A sintaxe do projeto permite que você especifique várias especificações em seus nós. Para definir um projeto, use o seguinte:

[[[cluster-init myspec]]]
  Project = myproject # inferred from name
  Version = x.y.z
  Spec = default  # (alternatively, you can name your own spec to be used here)
  Locker = default  # (optional, will use default locker for node)

Observação

O nome especificado após "especificação" pode ser qualquer coisa, mas pode e deve ser usado como um atalho para definir algumas > propriedades comuns.

Você também pode aplicar várias especificações a um determinado nó da seguinte maneira:

[[node scheduler]]
  [[[cluster-init myspec]]]
  Project = myproject
  Version = x.y.z
  Spec = default  # (alternatively, you can name your own spec to be used here)
  Locker = default  # (optional, will use default locker for node)

[[[cluster-init otherspec]]]
Project = otherproject
Version = a.b.c
Spec = otherspec  # (optional)

Ao separar o nome do projeto, o nome da especificação e a versão com dois pontos, o CycleCloud pode analisar esses valores nas configurações apropriadas Project/Version/Spec automaticamente:

[[node scheduler]]
  AdditionalClusterInitSpecs = $ClusterInitSpecs
  [[[cluster-init myproject:myspec:x.y.z]]]
  [[[cluster-init otherproject:otherspec:a.b.c]]]

As especificações também podem ser herdadas entre nós. Por exemplo, você pode compartilhar uma especificação comum entre todos os nós e, em seguida, executar uma especificação personalizada no nó do agendador:

[[node defaults]]
[[[cluster-init my-project:common:1.0.0]]]
Order = 2 # optional
[[node scheduler]]
[[[cluster-init my-project:scheduler:1.0.0]]]
Order = 1 # optional

[[nodearray execute]]
[[[cluster-init my-project:execute:1.0.0]]]
   Order = 1 # optional

Isso aplicaria as especificações e scheduler as common especificações ao nó do agendador, ao mesmo tempo em que aplicava apenas as common especificações e execute a nodearray de execução.

Por padrão, as especificações serão executadas na ordem em que forem mostradas no modelo, executando as especificações herdadas primeiro. Order é um inteiro opcional definido como um padrão de 1000 e pode ser usado para definir a ordem das especificações.

Se apenas um nome for especificado na [[[cluster-init]]] definição, ele será considerado o nome da especificação. Por exemplo:

[[[cluster-init myspec]]]
Project = myproject
Version = 1.0.0

é uma configuração de especificação válida na qual Spec=myspec está implícita pelo nome.

run_list

Você pode especificar uma lista de execução no nível do projeto ou da especificação em seu project.ini:

[spec scheduler]
run_list = role[a], recipe[b]

Quando um nó incluir a especificação "agendador", o run_list definido será acrescentado automaticamente a qualquer runlist definido anteriormente. Por exemplo, se meu run_list definido em [configuration] , run_list = recipe[test]a lista de execução final seria run_list = recipe[cyclecloud], recipe[test], role[a], recipe[b], recipe[cluster_init].

Você também pode substituir uma lista de execução no nível de especificação em um nó. Isso substituirá qualquer run_list incluído no project.ini. Por exemplo, se alterarmos a definição do nó para o seguinte:

[cluster-init test-project:scheduler:1.0.0]
run_list = recipe[different-test]

A lista de execução definida no projeto seria ignorada e a acima seria usada em vez disso. A lista de execução final no nó seria run_list = recipe[cyclecloud], recipe[test], recipe[different-test], recipe[cluster_init]então .

Observação

as listas de execução são específicas do chef e não se aplicam de outra forma.

Locais de arquivo

Os arquivos de chef compactados serão baixados durante a fase de inicialização da inicialização do nó. Eles são baixados para $JETPACK_HOME/system/chef/tarballs e descompactados para $JETPACK_HOME/system/chef/chef-repo/, e usados ao convergir o nó.

Observação

Para executar livros de receitas personalizados, especifique-os no run_list para o nó.

Os arquivos cluster-init serão baixados para /mnt/cluster-init/(project)/(spec)/. Para "my-project" e "my-spec", você verá seus scripts, arquivos e testes localizados em /mnt/cluster-init/my-project/my-spec.

Sincronizando projetos

Os projetos do CycleCloud podem ser sincronizados de espelhos no armazenamento em nuvem local do cluster. Defina um atributo SourceLocker em uma [cluster-init] seção dentro do modelo. O nome do armário especificado será usado como a origem do projeto e o conteúdo será sincronizado com o seu armário no início do cluster. Você também pode usar o nome do armário como a primeira parte do nome cluster-init. Por exemplo, se o cofre de origem for "cyclecloud", as duas definições a seguir serão as mesmas:

[cluster-init my-project:my-spect:1.2.3]
  SourceLocker=cyclecloud

[cluster-init cyclecloud/my-proect:my-spec:1.2.3]

Armazenamento de Arquivos Grande

Os projetos dão suporte a arquivos grandes. No nível superior de um projeto recém-criado, você verá um diretório "blobs" para seus arquivos grandes (blobs). Observe que os blobs colocados neste diretório têm uma finalidade específica e agirão de forma diferente dos itens dentro do diretório "arquivos".

Os itens dentro do diretório "blobs" são independentes de especificação e versão: qualquer coisa em "blobs" pode ser compartilhada entre especificações ou versões do projeto. Por exemplo, um instalador de um programa que é alterado com pouca frequência pode ser armazenado em "blobs" e referenciado em seu project.ini. À medida que você itera em versões do seu projeto, esse único arquivo permanece o mesmo e só é copiado para o armazenamento em nuvem uma vez, o que economiza no custo de transferência e armazenamento.

Para adicionar um blob, basta colocar um arquivo no diretório "blobs" e editar sua project.ini para fazer referência a esse arquivo:

[blobs]
  Files=big_file1.tgz

Quando você usa o project upload comando, todos os blobs referenciados no project.ini serão transferidos para o armazenamento em nuvem.

Arquivos de log

Os arquivos de log gerados ao executar cluster-init estão localizados em $JETPACK_HOME/logs/cluster-init/(project)/(spec).

Executar Arquivos

Quando um script cluster-init é executado com êxito, um arquivo é colocado em /mnt/cluster-init/.run/(project)/(spec) para garantir que ele não seja executado novamente em um convergente subsequente. Se você quiser executar o script novamente, exclua o arquivo apropriado neste diretório.

Diretórios de script

Quando o CycleCloud executa scripts no diretório de scripts, ele adicionará variáveis de ambiente ao caminho e ao nome dos diretórios de especificação e projeto:

CYCLECLOUD_PROJECT_NAME
CYCLECLOUD_PROJECT_PATH
CYCLECLOUD_SPEC_NAME
CYCLECLOUD_SPEC_PATH

No Linux, um projeto chamado "test-project" com uma especificação de "padrão" teria caminhos da seguinte maneira:

CYCLECLOUD_PROJECT_NAME = test-project
CYCLECLOUD_PROJECT_PATH = /mnt/cluster-init/test-project
CYCLECLOUD_SPEC_NAME = default
CYCLECLOUD_SPEC_PATH = /mnt/cluster-init/test-project/default

Executar scripts somente

Para executar SOMENTE os scripts cluster-init:

jetpack converge --cluster-init

A saída do comando irá para STDOUT e jetpack.log. Cada script também terá sua saída registrada em:

      $JETPACK_HOME/logs/cluster-init/(project)/(spec)/scripts/(script.sh).out

Chef personalizado e especificações redigiráveis

Cada especificação tem um diretório chef nele. Antes de convergir, cada especificação será inserida e extraída no chef-reppo local, substituindo todos os livros de receitas, funções e sacos de dados existentes com os mesmos nomes. Isso é feito na ordem em que as especificações são definidas, portanto, no caso de uma colisão de nomenclatura, a última especificação definida sempre ganhará.

download do jetpack

Para baixar um blob dentro de um script cluster-init, use o comando jetpack download (filename) para retirá-lo do diretório de blobs. Executar esse comando de um script cluster-init determinará o projeto e a URL base para você. Para usá-lo em um contexto não cluster-init, você precisará especificar o projeto (consulte --ajuda para obter mais informações).

Para usuários chef, um jetpack_download LWRP foi criado:

jetpack_download "big-file1.tgz" do
  project "my-project"
  end

No chef, o local de download padrão é #{node[:jetpack][:downloads]}. Para alterar o destino do arquivo, use o seguinte:

jetpack_download "foo.tgz" do
  project "my-project"
  dest "/tmp/download.tgz"
end

Quando usado no chef, você deve especificar o projeto.