Propriedade expansíveis

Podemos utilizar algumas propriedades dentro de strings no Azkfile.js. Essas propriedades especiais são substituídas para seu respectivos valores em tempo de execução.

O formato para essas propriedades é #{group.name} para propriedades em geral e ${VAR_NAME} para variáveis de ambiente.

Índice:

  1. Propriedades Expansíveis Gerais
    1. #{system.name}
    2. #{manifest.dir}
    3. #{manifest.path}
    4. #{azk.version}
    5. #{azk.default_domain}
    6. #{azk.default_dns}
    7. #{env}
  2. Propriedades Expansíveis Exportáveis
    1. #{net.host}
    2. #{net.port}
    3. #{envs}
  3. Propriedades Expansíveis do Load Balancer
    1. #{azk.balancer_ip}
    2. #{azk.balancer_port}
  4. Variáveis de ambiente

Propriedades Expansíveis Gerais:

#{system.name}

Nome do sistema atual.

Exemplo:

systems: {
  sys1: {
    envs: {
      SYSTEM_NAME: '#{system.name}',
    }
  }
}
$ azk shell -c 'env'
SYSTEM_NAME=sys1

#{manifest.dir}

Nome do diretório no qual o Azkfile.js está.

Exemplo:

Neste exemplo definimos o workdir como sendo /azk/test, visto que o diretório onte está o arquivo manifesto (Azkfile.js) se chama test.

systems({
  sys1: {
    ...
    workdir: '/azk/#{manifest.dir}',
  }
});
$ azk shell
/home/projects/test

$ azk shell -c 'pwd'
/azk/test

#{manifest.path}

Caminho completo do diretório no qual o Azkfile.js está

Exemplo:

systems: {
  sys1: {
    envs: {
      HOST_MANIFEST_FULL_PATH: '#{manifest.path}',
    }
  }
}
$ pwd
/home/projects/test

$ azk shell -c 'env'
HOST_MANIFEST_FULL_PATH=/home/projects/test

#{azk.version}

Versão atual do azk

Exemplo:

systems: {
  sys1: {
    envs: {
      AZK_VERSION: '#{azk.version}',
    }
  }
}
$ azk shell -c 'env'
AZK_VERSION=0.16.3

#{azk.default_domain}

Nome do domínio utilizado pelo azk (dev.azk.io, por padrão).

Exemplo:

Este é uso mais comum do #{azk.default_domain}, concatenado com o nome do sistema.

systems: {
  sys1: {
    http: {
      domains: [ '#{system.name}.#{azk.default_domain}' ],
    },
  }
}
$ azk status --text
 System  Instances  Hostname/url     Instances-Ports  Provisioned
 sys1    0          sys1.dev.azk.io  -                -

#{azk.default_dns}

Lista de endereços dos serviços de DNS disponíveis, separados por vírgula, na seguinte ordem:

  • DNS do azk;
  • DNS do /etc/resolv.conf;

Exemplo:

systems: {
  sys1: {
    envs: {
      ALL_DNS: '#{azk.default_dns}',
    }
  }
}
$ azk shell -c 'env'
ALL_DNS=172.17.0.1,8.8.8.8,8.8.4.4

#{env}

Objeto com as variáveis de ambiente disponíveis na máquina local. Use com notação de ponto (env.VAR).

Alerta de Segurança: Observe que, como o Azkfile.js é parte do código, dados confidenciais (como senhas e tokens privados) não devem ser colocados aqui. Ao invés disso, use um arquivo .env e não adicione-o ao seu sistema de controle de versão.

Exemplo:

systems: {
  sys1: {
    envs: {
      AZK_ENV: '#{env.AZK_ENV}',
    }
  }
}
$ azk shell -c 'env'
AZK_ENV=development

Propriedades Expansíveis Exportáveis

As propriedades expansíveis net.host, net.port e envs só pode ser utilizadas na sessão export_envs do Azkfile.js. Isso se dá pois estas propriedades só estão disponíveis com o sistema em execução.

#{net.host}

Endereço do host do sistema atual. Geralmente o #{net.host}, quando não definido nenhum http.domain, é azk.dev.io, ou seja, o mesmo que o #{azk.default_domain}.


#{net.port}

Porta nomeada exportada para o sistema dependente. Observe que sempre devemos chamar essa propriedade informando o nome da porta (#{net.port.NOME_DA_PORTA}). No exemplo dessa sessão existe uma porta nomeada data que na exportação da variáveis de ambiente (export_envs) é referenciada desta forma: #{net.port.data}.


#{envs}

Variáveis de ambiente para serem exportadas para os sistemas dependentes a partir das variáveis de ambiente declaradas na propriedade envs.

Não confundir com #{env}.


Exemplo:

/tmp/project/Azkfile.js

systems: {
  main_system: {
    depends: ['mysql']
  }
  mysql: {
    image: { docker: 'azukiapp/mysql:5.6' },
    ports: {
      // porta nomeada: data
      data: '3306/tcp',
    },
    envs: {
      // variáveis de ambiente
      // para dados confidenciais, utilize um arquivo `.env`
      MYSQL_USER: 'azk',
      MYSQL_PASS: 'azk',
      MYSQL_DATABASE: '#{manifest.dir}_development',
    },
    export_envs: {
      // Exportando o DATABASE_URL (popularizado com o Rails).
      // Observe que aqui estamos utilizando o `envs` e não o `env`.
      // mais informações: https://gist.github.com/gullitmiranda/62082f2e47c364ef9617
      DATABASE_URL: 'mysql2://#{envs.MYSQL_USER}:#{envs.MYSQL_PASS}@#{net.host}:#{net.port.data}/#{envs.MYSQL_DATABASE}',
    }
  },
}
$ azk shell main_system -c 'env'
MYSQL_USER: 'azk'
MYSQL_PASS: 'azk'
MYSQL_DATABASE: 'project_development'
DATABASE_URL=mysql2://azk:azk@dev.azk.io:32772/project_development

Propriedades Expansíveis do Load Balancer

Para as propriedade expansíveis abaixo não existem garantias de suporte no futuro. Use com cautela.

#{azk.balancer_ip}

IP do balancedor de carga

#{azk.balancer_port}

Porta do balancedor de carga

Exemplo:

systems: {
  sys1: {
    envs: {
      BALANCER_IP:   '#{azk.balancer_ip}',
      BALANCER_PORT: '#{azk.balancer_port}',
    }
  }
}
$ azk shell -c 'env'
BALANCER_IP=172.17.0.1
BALANCER_PORT=80

Variáveis de ambiente

Além das propriedades expansíveis, que permitem ter acesso as configurações do azk, é possível usar em propriedades como command e provision variáveis de ambiente.

Mas, diferente das outras propriedades expansíveis, o formato para variáveis de ambiente é ${VAR_NAME} ou ainda $VAR_NAME.

Obs: Não confunda essa opção com as propriedades #{env} e #{envs} descritas mais acima e que tem outro tipo de uso.

Exemplo de uso de variáveis de ambiente:

systems({
  web: {
    image: { docker: "azukiapp/ruby" },
    command: ["bundle", "exec", "rails", "-p", "$HTTP_PORT"],
    envs: {
      HTTP_PORT: "8080",
    },
  },
});

Caso seja necessário é possível escapar uma variável para que ela não seja expandida:

systems({
  web: {
    image: { docker: "azukiapp/ruby" },
    command: ["bundle", "exec", "rails", "-p", "\\$HTTP_PORT"],
    envs: {
      HTTP_PORT: "8080",
    },
  },
});

O mesmo se aplica para o comando [shell][../cli/shell.md]:

$ azk shell web -c `echo \$PATH`