From 159c2a3e9f86967e35bf6dbfb2f56b6e78f27f84 Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Sun, 19 Feb 2017 20:05:33 -0800 Subject: [PATCH 01/16] adding dizzythinks example --- examples/nginx-pillar/README.md | 10 ++++++++++ examples/nginx-pillar/dev.yaml | 7 +++++++ examples/nginx-pillar/pillar/dev.sls | 4 ++++ examples/nginx-pillar/pillar/qa.sls | 4 ++++ examples/nginx-pillar/qa.yaml | 7 +++++++ examples/nginx-pillar/salt/nginx/config.sls | 13 +++++++++++++ .../salt/nginx/files/my_vhost_conf.jinja | 11 +++++++++++ examples/nginx-pillar/salt/nginx/install.sls | 4 ++++ examples/nginx-pillar/salt/nginx/top.sls | 4 ++++ 9 files changed, 64 insertions(+) create mode 100644 examples/nginx-pillar/README.md create mode 100644 examples/nginx-pillar/dev.yaml create mode 100644 examples/nginx-pillar/pillar/dev.sls create mode 100644 examples/nginx-pillar/pillar/qa.sls create mode 100644 examples/nginx-pillar/qa.yaml create mode 100644 examples/nginx-pillar/salt/nginx/config.sls create mode 100644 examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja create mode 100644 examples/nginx-pillar/salt/nginx/install.sls create mode 100644 examples/nginx-pillar/salt/nginx/top.sls diff --git a/examples/nginx-pillar/README.md b/examples/nginx-pillar/README.md new file mode 100644 index 0000000..2dc2528 --- /dev/null +++ b/examples/nginx-pillar/README.md @@ -0,0 +1,10 @@ +Example States +============== + +In the example states and pillar, there is some simply example of configuration of a nginx server where the config file for nginx is a jinja template drawing from pillar. + +Based on the way Flyingcloud is called, I'm curious to know if it would be possible to allow for the targetting of pillar data when building a container. This might perhaps be done by being able to call flyingcloud with a a targetted config yaml? e.g. + + flyingcloud -c dev.yaml + +If this were available as an option then it would be possible in a CI situation to programmatically target pillar data when building a container. \ No newline at end of file diff --git a/examples/nginx-pillar/dev.yaml b/examples/nginx-pillar/dev.yaml new file mode 100644 index 0000000..0392f2d --- /dev/null +++ b/examples/nginx-pillar/dev.yaml @@ -0,0 +1,7 @@ +app_name: 'example' +description: 'Example' +layers: + - nginx + +pillar: + - dev \ No newline at end of file diff --git a/examples/nginx-pillar/pillar/dev.sls b/examples/nginx-pillar/pillar/dev.sls new file mode 100644 index 0000000..02635ba --- /dev/null +++ b/examples/nginx-pillar/pillar/dev.sls @@ -0,0 +1,4 @@ +nginx: + server_name: dev.server.com + log_prefix: dev_server_com + backend_server: dev-myapp.server.com diff --git a/examples/nginx-pillar/pillar/qa.sls b/examples/nginx-pillar/pillar/qa.sls new file mode 100644 index 0000000..329662c --- /dev/null +++ b/examples/nginx-pillar/pillar/qa.sls @@ -0,0 +1,4 @@ +nginx: + server_name: qa.server.com + log_prefix: qa + backend_server: qa-myapp.server.com diff --git a/examples/nginx-pillar/qa.yaml b/examples/nginx-pillar/qa.yaml new file mode 100644 index 0000000..cc67dff --- /dev/null +++ b/examples/nginx-pillar/qa.yaml @@ -0,0 +1,7 @@ +app_name: 'example' +description: 'Example' +layers: + - nginx + +pillar: + - qa \ No newline at end of file diff --git a/examples/nginx-pillar/salt/nginx/config.sls b/examples/nginx-pillar/salt/nginx/config.sls new file mode 100644 index 0000000..2a3ae55 --- /dev/null +++ b/examples/nginx-pillar/salt/nginx/config.sls @@ -0,0 +1,13 @@ +my_config: + file.managed: + - name: /etc/nginx/sites-enabled/my_vhost.conf + - user: root + - group: root + - mode: 644 + - source: salt://nginx/files/vhost_conf.jinja + - template: jinja + - context: + env: {{ salt['pillar.get']('nginx') }} + - require: + - pkg: nginx + diff --git a/examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja b/examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja new file mode 100644 index 0000000..d967d98 --- /dev/null +++ b/examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja @@ -0,0 +1,11 @@ +upstream backend { + server {{ env.backend_server }}; +} + +server { + listen 80; + server_name {{ env.server_name }}; + root /var/www; + + access_log /var/log/nginx/{{ env.log_prefix }}_http.log; +} diff --git a/examples/nginx-pillar/salt/nginx/install.sls b/examples/nginx-pillar/salt/nginx/install.sls new file mode 100644 index 0000000..d283904 --- /dev/null +++ b/examples/nginx-pillar/salt/nginx/install.sls @@ -0,0 +1,4 @@ +nginx: + pkg: + - name: nginx-full + - installed \ No newline at end of file diff --git a/examples/nginx-pillar/salt/nginx/top.sls b/examples/nginx-pillar/salt/nginx/top.sls new file mode 100644 index 0000000..1380249 --- /dev/null +++ b/examples/nginx-pillar/salt/nginx/top.sls @@ -0,0 +1,4 @@ +base: + '*': + - install + - config \ No newline at end of file From 9cc445d33e762b550515359a5502356b068e32c9 Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Sun, 19 Feb 2017 20:20:16 -0800 Subject: [PATCH 02/16] changing example files to match pillar example --- examples/nginx-pillar/pillar/{dev.sls => dev/top.sls} | 0 examples/nginx-pillar/pillar/{qa.sls => qa/top.sls} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename examples/nginx-pillar/pillar/{dev.sls => dev/top.sls} (100%) rename examples/nginx-pillar/pillar/{qa.sls => qa/top.sls} (100%) diff --git a/examples/nginx-pillar/pillar/dev.sls b/examples/nginx-pillar/pillar/dev/top.sls similarity index 100% rename from examples/nginx-pillar/pillar/dev.sls rename to examples/nginx-pillar/pillar/dev/top.sls diff --git a/examples/nginx-pillar/pillar/qa.sls b/examples/nginx-pillar/pillar/qa/top.sls similarity index 100% rename from examples/nginx-pillar/pillar/qa.sls rename to examples/nginx-pillar/pillar/qa/top.sls From f565148ccdabe603aa4a34bc37fd9f68b8c2d348 Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Sun, 19 Feb 2017 20:31:42 -0800 Subject: [PATCH 03/16] changing pillar to be string type --- examples/nginx-pillar/dev.yaml | 8 +++----- examples/nginx-pillar/qa.yaml | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/examples/nginx-pillar/dev.yaml b/examples/nginx-pillar/dev.yaml index 0392f2d..a73c6e2 100644 --- a/examples/nginx-pillar/dev.yaml +++ b/examples/nginx-pillar/dev.yaml @@ -1,7 +1,5 @@ -app_name: 'example' -description: 'Example' +app_name: 'dev_example' +description: 'Dev Example' layers: - nginx - -pillar: - - dev \ No newline at end of file +pillar: 'dev' \ No newline at end of file diff --git a/examples/nginx-pillar/qa.yaml b/examples/nginx-pillar/qa.yaml index cc67dff..4c06dcc 100644 --- a/examples/nginx-pillar/qa.yaml +++ b/examples/nginx-pillar/qa.yaml @@ -1,7 +1,5 @@ -app_name: 'example' -description: 'Example' +app_name: 'qa_example' +description: 'QA Example' layers: - nginx - -pillar: - - qa \ No newline at end of file +pillar: 'qa' From 23516c8a646126225b88ccc3aaa697420eca60a6 Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Sun, 19 Feb 2017 20:54:36 -0800 Subject: [PATCH 04/16] more reformatting nginx pillar example --- examples/nginx-pillar/dev.yaml | 5 ----- examples/nginx-pillar/flyingcloud.yaml | 8 ++++++++ examples/nginx-pillar/qa.yaml | 5 ----- examples/nginx-pillar/salt/nginx/layer.yaml | 5 +++++ 4 files changed, 13 insertions(+), 10 deletions(-) delete mode 100644 examples/nginx-pillar/dev.yaml create mode 100644 examples/nginx-pillar/flyingcloud.yaml delete mode 100644 examples/nginx-pillar/qa.yaml create mode 100644 examples/nginx-pillar/salt/nginx/layer.yaml diff --git a/examples/nginx-pillar/dev.yaml b/examples/nginx-pillar/dev.yaml deleted file mode 100644 index a73c6e2..0000000 --- a/examples/nginx-pillar/dev.yaml +++ /dev/null @@ -1,5 +0,0 @@ -app_name: 'dev_example' -description: 'Dev Example' -layers: - - nginx -pillar: 'dev' \ No newline at end of file diff --git a/examples/nginx-pillar/flyingcloud.yaml b/examples/nginx-pillar/flyingcloud.yaml new file mode 100644 index 0000000..9c46275 --- /dev/null +++ b/examples/nginx-pillar/flyingcloud.yaml @@ -0,0 +1,8 @@ +app_name: 'nginx_pillar' +description: 'Sample Nginx App With Pillar Support' +layers: + - nginx +pillars: + - dev + - qa + diff --git a/examples/nginx-pillar/qa.yaml b/examples/nginx-pillar/qa.yaml deleted file mode 100644 index 4c06dcc..0000000 --- a/examples/nginx-pillar/qa.yaml +++ /dev/null @@ -1,5 +0,0 @@ -app_name: 'qa_example' -description: 'QA Example' -layers: - - nginx -pillar: 'qa' diff --git a/examples/nginx-pillar/salt/nginx/layer.yaml b/examples/nginx-pillar/salt/nginx/layer.yaml new file mode 100644 index 0000000..030af71 --- /dev/null +++ b/examples/nginx-pillar/salt/nginx/layer.yaml @@ -0,0 +1,5 @@ +app_name: 'nginx_example' +description: 'Nginx Example' +layers: + - nginx +pillar: 'dev' From 8762b02b321fb994fe07f3ee267e0a1a5e2597a8 Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Sun, 19 Feb 2017 21:00:39 -0800 Subject: [PATCH 05/16] initial addition of layer.yaml for pillar example --- examples/nginx-pillar/salt/nginx/layer.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/nginx-pillar/salt/nginx/layer.yaml b/examples/nginx-pillar/salt/nginx/layer.yaml index 030af71..909f44a 100644 --- a/examples/nginx-pillar/salt/nginx/layer.yaml +++ b/examples/nginx-pillar/salt/nginx/layer.yaml @@ -1,5 +1,6 @@ -app_name: 'nginx_example' -description: 'Nginx Example' -layers: - - nginx -pillar: 'dev' +help: nginx layer +description: > + Nginx layer +parent: None +pillar: dev + From 872f0a314f89d38e9894ea3b27ef116352a77d41 Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Mon, 20 Feb 2017 21:46:28 -0800 Subject: [PATCH 06/16] getting closer to a working example - reformatted sls files --- examples/nginx-pillar/flyingcloud.yaml | 10 +++++++++ examples/nginx-pillar/pillar/dev/nginx.sls | 4 ++++ examples/nginx-pillar/pillar/dev/top.sls | 7 +++---- examples/nginx-pillar/pillar/qa/nginx.sls | 4 ++++ examples/nginx-pillar/pillar/qa/top.sls | 8 +++---- examples/nginx-pillar/salt/nginx/config.sls | 8 +++++-- examples/nginx-pillar/salt/nginx/layer.yaml | 2 +- examples/nginx-pillar/salt/sysbase/Dockerfile | 21 +++++++++++++++++++ examples/nginx-pillar/salt/sysbase/layer.yaml | 6 ++++++ 9 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 examples/nginx-pillar/pillar/dev/nginx.sls create mode 100644 examples/nginx-pillar/pillar/qa/nginx.sls create mode 100644 examples/nginx-pillar/salt/sysbase/Dockerfile create mode 100644 examples/nginx-pillar/salt/sysbase/layer.yaml diff --git a/examples/nginx-pillar/flyingcloud.yaml b/examples/nginx-pillar/flyingcloud.yaml index 9c46275..00644fb 100644 --- a/examples/nginx-pillar/flyingcloud.yaml +++ b/examples/nginx-pillar/flyingcloud.yaml @@ -1,8 +1,18 @@ app_name: 'nginx_pillar' description: 'Sample Nginx App With Pillar Support' layers: + - sysbase - nginx pillars: - dev - qa +registry: + host: quay.io + organization: cookbrite + docker_api_version: "1.17" + login_required: false + pull_layer: false + push_layer: false + squash_layer: false + diff --git a/examples/nginx-pillar/pillar/dev/nginx.sls b/examples/nginx-pillar/pillar/dev/nginx.sls new file mode 100644 index 0000000..ec67a93 --- /dev/null +++ b/examples/nginx-pillar/pillar/dev/nginx.sls @@ -0,0 +1,4 @@ +nginx: + server_name: dev.server.com + log_prefix: dev_server_com + backend_server: dev-myapp.server.com diff --git a/examples/nginx-pillar/pillar/dev/top.sls b/examples/nginx-pillar/pillar/dev/top.sls index 02635ba..bbc0f9c 100644 --- a/examples/nginx-pillar/pillar/dev/top.sls +++ b/examples/nginx-pillar/pillar/dev/top.sls @@ -1,4 +1,3 @@ -nginx: - server_name: dev.server.com - log_prefix: dev_server_com - backend_server: dev-myapp.server.com +base: + '*': + - nginx \ No newline at end of file diff --git a/examples/nginx-pillar/pillar/qa/nginx.sls b/examples/nginx-pillar/pillar/qa/nginx.sls new file mode 100644 index 0000000..329662c --- /dev/null +++ b/examples/nginx-pillar/pillar/qa/nginx.sls @@ -0,0 +1,4 @@ +nginx: + server_name: qa.server.com + log_prefix: qa + backend_server: qa-myapp.server.com diff --git a/examples/nginx-pillar/pillar/qa/top.sls b/examples/nginx-pillar/pillar/qa/top.sls index 329662c..cdf885d 100644 --- a/examples/nginx-pillar/pillar/qa/top.sls +++ b/examples/nginx-pillar/pillar/qa/top.sls @@ -1,4 +1,4 @@ -nginx: - server_name: qa.server.com - log_prefix: qa - backend_server: qa-myapp.server.com +base: + '*': + - nginx + diff --git a/examples/nginx-pillar/salt/nginx/config.sls b/examples/nginx-pillar/salt/nginx/config.sls index 2a3ae55..5b25a2d 100644 --- a/examples/nginx-pillar/salt/nginx/config.sls +++ b/examples/nginx-pillar/salt/nginx/config.sls @@ -4,10 +4,14 @@ my_config: - user: root - group: root - mode: 644 - - source: salt://nginx/files/vhost_conf.jinja + - source: salt://files/my_vhost_conf.jinja - template: jinja - context: - env: {{ salt['pillar.get']('nginx') }} + env: + server_name: dev.server.com + log_prefix: dev_server_com + backend_server: dev-myapp.server.com + #env: {{ salt['pillar.get']('nginx') }} - require: - pkg: nginx diff --git a/examples/nginx-pillar/salt/nginx/layer.yaml b/examples/nginx-pillar/salt/nginx/layer.yaml index 909f44a..cf8b2ac 100644 --- a/examples/nginx-pillar/salt/nginx/layer.yaml +++ b/examples/nginx-pillar/salt/nginx/layer.yaml @@ -1,6 +1,6 @@ help: nginx layer description: > Nginx layer -parent: None +parent: sysbase pillar: dev diff --git a/examples/nginx-pillar/salt/sysbase/Dockerfile b/examples/nginx-pillar/salt/sysbase/Dockerfile new file mode 100644 index 0000000..3619028 --- /dev/null +++ b/examples/nginx-pillar/salt/sysbase/Dockerfile @@ -0,0 +1,21 @@ +# FlyingCloud base image - phusion/baseimage + SaltStack +# Note: never use :latest, always use a numbered release tag. +FROM phusion/baseimage:0.9.18 +MAINTAINER MetaBrite, Inc. + +# Use baseimage-docker's init system. +CMD ["/sbin/my_init"] + +# After the image is built, we will use salt, mounted via docker run. + +# Update the sources list +RUN apt-get update + +# Install salt and basic applications +RUN apt-get install -y tar git vim nano wget net-tools build-essential salt-minion + +# SaltStack fail hard if any state fails +RUN echo "failhard: True" >> /etc/salt/minion + +# Clean up APT when done. +RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/examples/nginx-pillar/salt/sysbase/layer.yaml b/examples/nginx-pillar/salt/sysbase/layer.yaml new file mode 100644 index 0000000..a66057e --- /dev/null +++ b/examples/nginx-pillar/salt/sysbase/layer.yaml @@ -0,0 +1,6 @@ +help: Operating System Base Layer +description: > + System base layer + (Phusion Ubuntu 14.04 with Salt, build-essential, + various debugging tools) + From c03b86200d12e99d8a6e5a7b86a0cd19fd4ea26f Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Mon, 20 Feb 2017 21:46:51 -0800 Subject: [PATCH 07/16] set and use pillars --- flyingcloud/base.py | 27 +++++++++++++++++++++++++-- flyingcloud/main.py | 6 +++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/flyingcloud/base.py b/flyingcloud/base.py index 15a0024..cfcf073 100644 --- a/flyingcloud/base.py +++ b/flyingcloud/base.py @@ -93,7 +93,8 @@ def __init__( exposed_ports=None, registry_config=None, source_version_tag="latest", - environment=None + environment=None, + pillar=None ): self.app_name = app_name self.layer_name = layer_name @@ -102,6 +103,7 @@ def __init__( self.description = description self.exposed_ports = exposed_ports or [] self.environment = environment + self.pillar = None config = self.RegistryConfig.copy() if registry_config: @@ -144,6 +146,11 @@ def check_user_is_root(cls): if platform.system() == "Linux" and os.geteuid() != 0 : raise NotSudoError("You must be root (use sudo)") + def set_pillar(self, namespace): + pillar = namespace.pillar + if pillar: + self.pillar = pillar + def check_environment_variables(self, namespace): cfg = self.registry_config if cfg['host'] and cfg['login_required'] and not cfg['aws_ecr_region']: @@ -300,11 +307,17 @@ def salt_highstate( error, commit = None, True target_container_name = None + volume_map = { + salt_dir: "/srv/salt", + } + if namespace.pillar_dir: + volume_map[namespace.pillar_dir] = "/srv/pillar" try: target_container_name = self.docker_create_container( namespace, container_name, source_image_name, environment=self.make_environment(namespace.env_vars, self.environment), - volume_map={salt_dir: "/srv/salt"}) + volume_map=volume_map, + ) self.docker_start(namespace, target_container_name) @@ -766,6 +779,8 @@ def parse_args(self, defaults, *layer_classes, **kwargs): defaults = defaults or {} defaults.setdefault('base_dir', os.path.abspath(os.path.dirname(__file__))) defaults.setdefault('salt_dir', os.path.join(defaults['base_dir'], "salt")) + defaults.setdefault('pillar_dir', None) + defaults.setdefault('pillar', None) defaults.setdefault('logfile', os.path.join(defaults['base_dir'], "flyingcloud.log")) defaults.setdefault('docker_tagsfile', os.path.join(defaults['base_dir'], "docker_tags.json")) defaults.setdefault('timestamp_format', '%Y-%m-%dt%H%M%Sz') @@ -831,6 +846,10 @@ def parse_args(self, defaults, *layer_classes, **kwargs): parser.add_argument( '--email', '-e', help="Email address for Docker registry. Default: %(default)r") + parser.add_argument( + '--pillar', '-l', dest='pillar', type=str, + help="Specify pillar to use for this layer. Default: %(default)r") + if self.docker_machine_platform(): parser.add_argument( @@ -898,6 +917,10 @@ def parse_args(self, defaults, *layer_classes, **kwargs): self.add_additional_configuration(namespace) + if namespace.pillar: + pillar_basedir = os.path.join(defaults['base_dir'], "pillar") + namespace.pillar_dir = os.path.join(pillar_basedir, namespace.pillar) + return namespace @classmethod diff --git a/flyingcloud/main.py b/flyingcloud/main.py index 7b456c5..f27ac19 100755 --- a/flyingcloud/main.py +++ b/flyingcloud/main.py @@ -29,6 +29,7 @@ def get_layer(app_name, layer_name, layer_data, registry_config): exposed_ports = layer_info.get('exposed_ports') container_name = layer_info.get('image_name') environment = layer_info.get('environment') + pillar = layer_info.get('pillar') layer = layer_class( app_name=app_name, @@ -40,6 +41,7 @@ def get_layer(app_name, layer_name, layer_data, registry_config): exposed_ports=exposed_ports, registry_config=registry_config, environment=environment, + pillar=pillar, ) # print(layer.__dict__) @@ -108,8 +110,10 @@ def main(): namespace = instance.parse_args( defaults, *layers, - description=project_info['description']) + description=project_info['description'] + ) instance.check_environment_variables(namespace) + instance.set_pillar(namespace) instance = namespace.layer_inst instance.do_operation(namespace) From 75436a166436bb4a3623e1bf0153f90a69a8f1bd Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Mon, 20 Feb 2017 22:07:57 -0800 Subject: [PATCH 08/16] salt.highstate works on docker image when run manually - still doesn't pass when run in flyingcloud --- examples/nginx-pillar/pillar/dev/top.sls | 4 ++-- examples/nginx-pillar/pillar/qa/top.sls | 4 ++-- examples/nginx-pillar/salt/nginx/config.sls | 6 +----- examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja | 6 +++--- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/examples/nginx-pillar/pillar/dev/top.sls b/examples/nginx-pillar/pillar/dev/top.sls index bbc0f9c..928ece9 100644 --- a/examples/nginx-pillar/pillar/dev/top.sls +++ b/examples/nginx-pillar/pillar/dev/top.sls @@ -1,3 +1,3 @@ base: - '*': - - nginx \ No newline at end of file + '*': + - nginx \ No newline at end of file diff --git a/examples/nginx-pillar/pillar/qa/top.sls b/examples/nginx-pillar/pillar/qa/top.sls index cdf885d..9c26224 100644 --- a/examples/nginx-pillar/pillar/qa/top.sls +++ b/examples/nginx-pillar/pillar/qa/top.sls @@ -1,4 +1,4 @@ base: - '*': - - nginx + '*': + - nginx diff --git a/examples/nginx-pillar/salt/nginx/config.sls b/examples/nginx-pillar/salt/nginx/config.sls index 5b25a2d..1f741f4 100644 --- a/examples/nginx-pillar/salt/nginx/config.sls +++ b/examples/nginx-pillar/salt/nginx/config.sls @@ -7,11 +7,7 @@ my_config: - source: salt://files/my_vhost_conf.jinja - template: jinja - context: - env: - server_name: dev.server.com - log_prefix: dev_server_com - backend_server: dev-myapp.server.com - #env: {{ salt['pillar.get']('nginx') }} + {{ salt['pillar.get']('nginx') }} - require: - pkg: nginx diff --git a/examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja b/examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja index d967d98..72797f1 100644 --- a/examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja +++ b/examples/nginx-pillar/salt/nginx/files/my_vhost_conf.jinja @@ -1,11 +1,11 @@ upstream backend { - server {{ env.backend_server }}; + server {{ backend_server }}; } server { listen 80; - server_name {{ env.server_name }}; + server_name {{ server_name }}; root /var/www; - access_log /var/log/nginx/{{ env.log_prefix }}_http.log; + access_log /var/log/nginx/{{ log_prefix }}_http.log; } From 396729cbc615a946a3f728b963f943446a65c71f Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Mon, 20 Feb 2017 23:11:08 -0800 Subject: [PATCH 09/16] pillar example working --- flyingcloud/base.py | 23 +++++++++++++---------- flyingcloud/main.py | 3 ++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/flyingcloud/base.py b/flyingcloud/base.py index cfcf073..7165bad 100644 --- a/flyingcloud/base.py +++ b/flyingcloud/base.py @@ -94,7 +94,7 @@ def __init__( registry_config=None, source_version_tag="latest", environment=None, - pillar=None + pillar=None, ): self.app_name = app_name self.layer_name = layer_name @@ -103,7 +103,9 @@ def __init__( self.description = description self.exposed_ports = exposed_ports or [] self.environment = environment - self.pillar = None + self.pillar = pillar + self.base_dir = None + self.pillar_dir = None config = self.RegistryConfig.copy() if registry_config: @@ -147,9 +149,13 @@ def check_user_is_root(cls): raise NotSudoError("You must be root (use sudo)") def set_pillar(self, namespace): - pillar = namespace.pillar + pillar = namespace.pillar or self.pillar + self.base_dir = namespace.base_dir if pillar: self.pillar = pillar + pillar_basedir = os.path.join(self.base_dir, 'pillar') + self.pillar_dir = os.path.join(pillar_basedir, self.pillar) + namespace.logger.info("Using pillar '{}' and setting pillar_dir to '{}'.".format(self.pillar, self.pillar_dir)) def check_environment_variables(self, namespace): cfg = self.registry_config @@ -310,13 +316,13 @@ def salt_highstate( volume_map = { salt_dir: "/srv/salt", } - if namespace.pillar_dir: - volume_map[namespace.pillar_dir] = "/srv/pillar" + if self.pillar_dir: + volume_map[self.pillar_dir] = "/srv/pillar" try: target_container_name = self.docker_create_container( namespace, container_name, source_image_name, environment=self.make_environment(namespace.env_vars, self.environment), - volume_map=volume_map, + volume_map=volume_map ) self.docker_start(namespace, target_container_name) @@ -917,10 +923,7 @@ def parse_args(self, defaults, *layer_classes, **kwargs): self.add_additional_configuration(namespace) - if namespace.pillar: - pillar_basedir = os.path.join(defaults['base_dir'], "pillar") - namespace.pillar_dir = os.path.join(pillar_basedir, namespace.pillar) - + namespace.base_dir = defaults['base_dir'] return namespace @classmethod diff --git a/flyingcloud/main.py b/flyingcloud/main.py index f27ac19..81033ab 100755 --- a/flyingcloud/main.py +++ b/flyingcloud/main.py @@ -113,7 +113,8 @@ def main(): description=project_info['description'] ) instance.check_environment_variables(namespace) - instance.set_pillar(namespace) + for layer in layers: + layer.set_pillar(namespace) instance = namespace.layer_inst instance.do_operation(namespace) From e4be00ba41353bc757e127ffa58694e60e40e41d Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Tue, 21 Feb 2017 20:48:57 -0800 Subject: [PATCH 10/16] add pillar name to docker tag - if pillar is present --- flyingcloud/base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flyingcloud/base.py b/flyingcloud/base.py index 7165bad..abc945a 100644 --- a/flyingcloud/base.py +++ b/flyingcloud/base.py @@ -116,6 +116,8 @@ def __init__( self.container_name = container_name or "{}_{}".format(self.app_name, self.layer_name) self.docker_layer_name = "{}{}".format(host_org, self.container_name) + if self.pillar: + self.docker_layer_name = "{}_{}".format(self.docker_layer_name, self.pillar) self.layer_latest_name = "{}:latest".format(self.docker_layer_name) if self.source_image_base_name: From f6cc09658f42c3e3426c18df3ec845731bb4f1d6 Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Wed, 22 Feb 2017 16:42:13 -0800 Subject: [PATCH 11/16] fix docker layer name so it has the right pillar - adding it in set_pillar() instead of __init__() --- flyingcloud/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flyingcloud/base.py b/flyingcloud/base.py index abc945a..7e3cb08 100644 --- a/flyingcloud/base.py +++ b/flyingcloud/base.py @@ -116,8 +116,6 @@ def __init__( self.container_name = container_name or "{}_{}".format(self.app_name, self.layer_name) self.docker_layer_name = "{}{}".format(host_org, self.container_name) - if self.pillar: - self.docker_layer_name = "{}_{}".format(self.docker_layer_name, self.pillar) self.layer_latest_name = "{}:latest".format(self.docker_layer_name) if self.source_image_base_name: @@ -157,6 +155,7 @@ def set_pillar(self, namespace): self.pillar = pillar pillar_basedir = os.path.join(self.base_dir, 'pillar') self.pillar_dir = os.path.join(pillar_basedir, self.pillar) + self.docker_layer_name = "{}_{}".format(self.docker_layer_name, pillar) namespace.logger.info("Using pillar '{}' and setting pillar_dir to '{}'.".format(self.pillar, self.pillar_dir)) def check_environment_variables(self, namespace): @@ -247,6 +246,7 @@ def build(self, namespace): self.layer_squashed_name = "{}-sq".format(self.layer_timestamp_name) self.initialize_build(namespace, salt_dir) + namespace.logger.info("Building docker layer '{}' with tag '{}'.".format(self.layer_name, self.docker_layer_name)) if (namespace.pull_layer and self.registry_config['pull_layer'] From df5f6c86f0e7cf4ce1c052e4d4fba8ebb3ac0064 Mon Sep 17 00:00:00 2001 From: Alexander Zeikidze Date: Sun, 2 Apr 2017 04:57:23 +0300 Subject: [PATCH 12/16] Added custom grains sketch --- examples/nginx-grains/README.md | 6 ++++++ examples/nginx-grains/flyingcloud.yaml | 8 ++++++++ examples/nginx-grains/grains/dev/mygrains.py | 14 +++++++++++++ examples/nginx-grains/grains/qa/mygrains.py | 14 +++++++++++++ .../salt/nginx/files/my_vhost_conf.jinja | 11 ++++++++++ examples/nginx-grains/salt/nginx/init.sls | 19 ++++++++++++++++++ examples/nginx-grains/salt/nginx/layer.yaml | 5 +++++ examples/nginx-grains/salt/nginx/top.sls | 3 +++ examples/nginx-grains/salt/sysbase/Dockerfile | 15 ++++++++++++++ examples/nginx-grains/salt/sysbase/layer.yaml | 5 +++++ flyingcloud/base.py | 20 +++++++++++++++++++ flyingcloud/main.py | 3 +++ 12 files changed, 123 insertions(+) create mode 100644 examples/nginx-grains/README.md create mode 100644 examples/nginx-grains/flyingcloud.yaml create mode 100644 examples/nginx-grains/grains/dev/mygrains.py create mode 100644 examples/nginx-grains/grains/qa/mygrains.py create mode 100644 examples/nginx-grains/salt/nginx/files/my_vhost_conf.jinja create mode 100644 examples/nginx-grains/salt/nginx/init.sls create mode 100644 examples/nginx-grains/salt/nginx/layer.yaml create mode 100644 examples/nginx-grains/salt/nginx/top.sls create mode 100644 examples/nginx-grains/salt/sysbase/Dockerfile create mode 100644 examples/nginx-grains/salt/sysbase/layer.yaml diff --git a/examples/nginx-grains/README.md b/examples/nginx-grains/README.md new file mode 100644 index 0000000..3b1205d --- /dev/null +++ b/examples/nginx-grains/README.md @@ -0,0 +1,6 @@ +Example States +============== + +Simple example of configuration of a nginx server where the config file for nginx is a jinja template drawing from custom Grains (https://docs.saltstack.com/en/latest/topics/grains/index.html#writing-grains). + +Please keep in mind default path to custom Grains directory: /srv/salt/_grains \ No newline at end of file diff --git a/examples/nginx-grains/flyingcloud.yaml b/examples/nginx-grains/flyingcloud.yaml new file mode 100644 index 0000000..c66bbac --- /dev/null +++ b/examples/nginx-grains/flyingcloud.yaml @@ -0,0 +1,8 @@ +app_name: 'nginx-grains' +description: 'Sample Test app for FlyingCloud with custom Grains support' +layers: + - nginx + - sysbase +grains: + - dev + - qa diff --git a/examples/nginx-grains/grains/dev/mygrains.py b/examples/nginx-grains/grains/dev/mygrains.py new file mode 100644 index 0000000..cfe94b9 --- /dev/null +++ b/examples/nginx-grains/grains/dev/mygrains.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +def _my_custom_grain(): + my_grain = { + 'server_name': 'webhost-dev.domain.com', + 'log_prefix': 'webhost-dev_domain_com', + 'backend_server': 'apphost-dev.domain.com' + } + return my_grain + +def main(): + # initialize a grains dictionary + grains = {} + grains['my_grains'] = _my_custom_grain() + return grains diff --git a/examples/nginx-grains/grains/qa/mygrains.py b/examples/nginx-grains/grains/qa/mygrains.py new file mode 100644 index 0000000..2649b81 --- /dev/null +++ b/examples/nginx-grains/grains/qa/mygrains.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +def _my_custom_grain(): + my_grain = { + 'server_name': 'webhost-qa.domain.com', + 'log_prefix': 'webhost-qa_domain_com', + 'backend_server': 'apphost-qa.domain.com' + } + return my_grain + +def main(): + # initialize a grains dictionary + grains = {} + grains['my_grains'] = _my_custom_grain() + return grains diff --git a/examples/nginx-grains/salt/nginx/files/my_vhost_conf.jinja b/examples/nginx-grains/salt/nginx/files/my_vhost_conf.jinja new file mode 100644 index 0000000..72797f1 --- /dev/null +++ b/examples/nginx-grains/salt/nginx/files/my_vhost_conf.jinja @@ -0,0 +1,11 @@ +upstream backend { + server {{ backend_server }}; +} + +server { + listen 80; + server_name {{ server_name }}; + root /var/www; + + access_log /var/log/nginx/{{ log_prefix }}_http.log; +} diff --git a/examples/nginx-grains/salt/nginx/init.sls b/examples/nginx-grains/salt/nginx/init.sls new file mode 100644 index 0000000..4c3d2ce --- /dev/null +++ b/examples/nginx-grains/salt/nginx/init.sls @@ -0,0 +1,19 @@ +nginx: + pkg: + - latest + service.running: + - enable: True + +/etc/nginx/conf.d/my_vhost.conf: + file.managed: + - source: salt://files/my_vhost_conf.jinja + - template: jinja + - require: + - pkg: nginx + - user: root + - group: root + - mode: 644 + - context: + {{ salt['grains.get']('my_grains') }} + - watch_in: + - service: nginx diff --git a/examples/nginx-grains/salt/nginx/layer.yaml b/examples/nginx-grains/salt/nginx/layer.yaml new file mode 100644 index 0000000..3a7e108 --- /dev/null +++ b/examples/nginx-grains/salt/nginx/layer.yaml @@ -0,0 +1,5 @@ +help: nginx layer +description: > + Nginx layer +parent: sysbase +grains: dev diff --git a/examples/nginx-grains/salt/nginx/top.sls b/examples/nginx-grains/salt/nginx/top.sls new file mode 100644 index 0000000..a966bc0 --- /dev/null +++ b/examples/nginx-grains/salt/nginx/top.sls @@ -0,0 +1,3 @@ +base: + '*': + - init diff --git a/examples/nginx-grains/salt/sysbase/Dockerfile b/examples/nginx-grains/salt/sysbase/Dockerfile new file mode 100644 index 0000000..03fe4a4 --- /dev/null +++ b/examples/nginx-grains/salt/sysbase/Dockerfile @@ -0,0 +1,15 @@ +FROM centos:centos6 + +CMD ["/bin/bash"] + +# Add EPEL repository +RUN yum -y install epel-release + +# Install salt and deps +RUN yum -y install salt-minion python2-gnupg cronie + +# SaltStack fail hard if any state fails +RUN echo "failhard: True" >> /etc/salt/minion + +# Clean up YUM when done. +RUN yum clean all && rm -rf /tmp/* /var/tmp/* diff --git a/examples/nginx-grains/salt/sysbase/layer.yaml b/examples/nginx-grains/salt/sysbase/layer.yaml new file mode 100644 index 0000000..58c1b4c --- /dev/null +++ b/examples/nginx-grains/salt/sysbase/layer.yaml @@ -0,0 +1,5 @@ +help: Operating System Base Layer +description: > + System base layer + (CentOS 6.8 with salt-minion) + diff --git a/flyingcloud/base.py b/flyingcloud/base.py index 7e3cb08..2191e49 100644 --- a/flyingcloud/base.py +++ b/flyingcloud/base.py @@ -95,6 +95,7 @@ def __init__( source_version_tag="latest", environment=None, pillar=None, + grains=None, ): self.app_name = app_name self.layer_name = layer_name @@ -104,8 +105,10 @@ def __init__( self.exposed_ports = exposed_ports or [] self.environment = environment self.pillar = pillar + self.grains = grains self.base_dir = None self.pillar_dir = None + self.grains_dir = None config = self.RegistryConfig.copy() if registry_config: @@ -158,6 +161,16 @@ def set_pillar(self, namespace): self.docker_layer_name = "{}_{}".format(self.docker_layer_name, pillar) namespace.logger.info("Using pillar '{}' and setting pillar_dir to '{}'.".format(self.pillar, self.pillar_dir)) + def set_grains(self, namespace): + grains = namespace.grains or self.grains + self.base_dir = namespace.base_dir + if grains: + self.grains = grains + grains_basedir = os.path.join(self.base_dir, 'grains') + self.grains_dir = os.path.join(grains_basedir, self.grains) + self.docker_layer_name = "{}_{}".format(self.docker_layer_name, grains) + namespace.logger.info("Using custom grains '{}' and setting grains_dir to '{}'.".format(self.grains, self.grains_dir)) + def check_environment_variables(self, namespace): cfg = self.registry_config if cfg['host'] and cfg['login_required'] and not cfg['aws_ecr_region']: @@ -320,6 +333,8 @@ def salt_highstate( } if self.pillar_dir: volume_map[self.pillar_dir] = "/srv/pillar" + if self.grains_dir: + volume_map[self.grains_dir] = "/srv/salt/_grains" try: target_container_name = self.docker_create_container( namespace, container_name, source_image_name, @@ -789,6 +804,8 @@ def parse_args(self, defaults, *layer_classes, **kwargs): defaults.setdefault('salt_dir', os.path.join(defaults['base_dir'], "salt")) defaults.setdefault('pillar_dir', None) defaults.setdefault('pillar', None) + defaults.setdefault('grains_dir', None) + defaults.setdefault('grains', None) defaults.setdefault('logfile', os.path.join(defaults['base_dir'], "flyingcloud.log")) defaults.setdefault('docker_tagsfile', os.path.join(defaults['base_dir'], "docker_tags.json")) defaults.setdefault('timestamp_format', '%Y-%m-%dt%H%M%Sz') @@ -857,6 +874,9 @@ def parse_args(self, defaults, *layer_classes, **kwargs): parser.add_argument( '--pillar', '-l', dest='pillar', type=str, help="Specify pillar to use for this layer. Default: %(default)r") + parser.add_argument( + '--grains', '-g', dest='grains', type=str, + help="Specify custom grains to use for this layer. Default: %(default)r") if self.docker_machine_platform(): diff --git a/flyingcloud/main.py b/flyingcloud/main.py index 81033ab..9bf9861 100755 --- a/flyingcloud/main.py +++ b/flyingcloud/main.py @@ -30,6 +30,7 @@ def get_layer(app_name, layer_name, layer_data, registry_config): container_name = layer_info.get('image_name') environment = layer_info.get('environment') pillar = layer_info.get('pillar') + grains = layer_info.get('grains') layer = layer_class( app_name=app_name, @@ -42,6 +43,7 @@ def get_layer(app_name, layer_name, layer_data, registry_config): registry_config=registry_config, environment=environment, pillar=pillar, + grains=grains, ) # print(layer.__dict__) @@ -115,6 +117,7 @@ def main(): instance.check_environment_variables(namespace) for layer in layers: layer.set_pillar(namespace) + layer.set_grains(namespace) instance = namespace.layer_inst instance.do_operation(namespace) From 72c168fdd00a9498fb37844fb2430bf2da5fec77 Mon Sep 17 00:00:00 2001 From: Alexander Zeikidze Date: Sun, 2 Apr 2017 05:49:27 +0300 Subject: [PATCH 13/16] Updated nginx-grains example: switched to ubuntu for now --- examples/nginx-grains/salt/nginx/init.sls | 3 ++- examples/nginx-grains/salt/sysbase/Dockerfile | 22 ++++++++++++------- examples/nginx-grains/salt/sysbase/layer.yaml | 3 ++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/examples/nginx-grains/salt/nginx/init.sls b/examples/nginx-grains/salt/nginx/init.sls index 4c3d2ce..18900c0 100644 --- a/examples/nginx-grains/salt/nginx/init.sls +++ b/examples/nginx-grains/salt/nginx/init.sls @@ -1,10 +1,11 @@ nginx: pkg: + - name: nginx-full - latest service.running: - enable: True -/etc/nginx/conf.d/my_vhost.conf: +/etc/nginx/sites-enabled/my_vhost.conf: file.managed: - source: salt://files/my_vhost_conf.jinja - template: jinja diff --git a/examples/nginx-grains/salt/sysbase/Dockerfile b/examples/nginx-grains/salt/sysbase/Dockerfile index 03fe4a4..3619028 100644 --- a/examples/nginx-grains/salt/sysbase/Dockerfile +++ b/examples/nginx-grains/salt/sysbase/Dockerfile @@ -1,15 +1,21 @@ -FROM centos:centos6 +# FlyingCloud base image - phusion/baseimage + SaltStack +# Note: never use :latest, always use a numbered release tag. +FROM phusion/baseimage:0.9.18 +MAINTAINER MetaBrite, Inc. -CMD ["/bin/bash"] +# Use baseimage-docker's init system. +CMD ["/sbin/my_init"] -# Add EPEL repository -RUN yum -y install epel-release +# After the image is built, we will use salt, mounted via docker run. -# Install salt and deps -RUN yum -y install salt-minion python2-gnupg cronie +# Update the sources list +RUN apt-get update + +# Install salt and basic applications +RUN apt-get install -y tar git vim nano wget net-tools build-essential salt-minion # SaltStack fail hard if any state fails RUN echo "failhard: True" >> /etc/salt/minion -# Clean up YUM when done. -RUN yum clean all && rm -rf /tmp/* /var/tmp/* +# Clean up APT when done. +RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/examples/nginx-grains/salt/sysbase/layer.yaml b/examples/nginx-grains/salt/sysbase/layer.yaml index 58c1b4c..a66057e 100644 --- a/examples/nginx-grains/salt/sysbase/layer.yaml +++ b/examples/nginx-grains/salt/sysbase/layer.yaml @@ -1,5 +1,6 @@ help: Operating System Base Layer description: > System base layer - (CentOS 6.8 with salt-minion) + (Phusion Ubuntu 14.04 with Salt, build-essential, + various debugging tools) From 7308ffd479c1d4195274743f79b8700524e154aa Mon Sep 17 00:00:00 2001 From: Alexander Zeikidze Date: Sun, 2 Apr 2017 18:44:31 +0300 Subject: [PATCH 14/16] Fixed & added nginx-grains-centos example --- examples/nginx-grains-centos/README.md | 6 ++++++ examples/nginx-grains-centos/flyingcloud.yaml | 8 ++++++++ .../grains/dev/mygrains.py | 14 ++++++++++++++ .../nginx-grains-centos/grains/qa/mygrains.py | 14 ++++++++++++++ .../salt/nginx/files/my_vhost_conf.jinja | 11 +++++++++++ .../nginx-grains-centos/salt/nginx/init.sls | 19 +++++++++++++++++++ .../nginx-grains-centos/salt/nginx/layer.yaml | 5 +++++ .../nginx-grains-centos/salt/nginx/top.sls | 3 +++ .../salt/sysbase/Dockerfile | 15 +++++++++++++++ .../salt/sysbase/layer.yaml | 5 +++++ 10 files changed, 100 insertions(+) create mode 100644 examples/nginx-grains-centos/README.md create mode 100644 examples/nginx-grains-centos/flyingcloud.yaml create mode 100644 examples/nginx-grains-centos/grains/dev/mygrains.py create mode 100644 examples/nginx-grains-centos/grains/qa/mygrains.py create mode 100644 examples/nginx-grains-centos/salt/nginx/files/my_vhost_conf.jinja create mode 100644 examples/nginx-grains-centos/salt/nginx/init.sls create mode 100644 examples/nginx-grains-centos/salt/nginx/layer.yaml create mode 100644 examples/nginx-grains-centos/salt/nginx/top.sls create mode 100644 examples/nginx-grains-centos/salt/sysbase/Dockerfile create mode 100644 examples/nginx-grains-centos/salt/sysbase/layer.yaml diff --git a/examples/nginx-grains-centos/README.md b/examples/nginx-grains-centos/README.md new file mode 100644 index 0000000..3b1205d --- /dev/null +++ b/examples/nginx-grains-centos/README.md @@ -0,0 +1,6 @@ +Example States +============== + +Simple example of configuration of a nginx server where the config file for nginx is a jinja template drawing from custom Grains (https://docs.saltstack.com/en/latest/topics/grains/index.html#writing-grains). + +Please keep in mind default path to custom Grains directory: /srv/salt/_grains \ No newline at end of file diff --git a/examples/nginx-grains-centos/flyingcloud.yaml b/examples/nginx-grains-centos/flyingcloud.yaml new file mode 100644 index 0000000..3eb2494 --- /dev/null +++ b/examples/nginx-grains-centos/flyingcloud.yaml @@ -0,0 +1,8 @@ +app_name: 'nginx-grains-centos' +description: 'Sample Test app for FlyingCloud with custom Grains support' +layers: + - nginx + - sysbase +grains: + - dev + - qa diff --git a/examples/nginx-grains-centos/grains/dev/mygrains.py b/examples/nginx-grains-centos/grains/dev/mygrains.py new file mode 100644 index 0000000..cfe94b9 --- /dev/null +++ b/examples/nginx-grains-centos/grains/dev/mygrains.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +def _my_custom_grain(): + my_grain = { + 'server_name': 'webhost-dev.domain.com', + 'log_prefix': 'webhost-dev_domain_com', + 'backend_server': 'apphost-dev.domain.com' + } + return my_grain + +def main(): + # initialize a grains dictionary + grains = {} + grains['my_grains'] = _my_custom_grain() + return grains diff --git a/examples/nginx-grains-centos/grains/qa/mygrains.py b/examples/nginx-grains-centos/grains/qa/mygrains.py new file mode 100644 index 0000000..2649b81 --- /dev/null +++ b/examples/nginx-grains-centos/grains/qa/mygrains.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +def _my_custom_grain(): + my_grain = { + 'server_name': 'webhost-qa.domain.com', + 'log_prefix': 'webhost-qa_domain_com', + 'backend_server': 'apphost-qa.domain.com' + } + return my_grain + +def main(): + # initialize a grains dictionary + grains = {} + grains['my_grains'] = _my_custom_grain() + return grains diff --git a/examples/nginx-grains-centos/salt/nginx/files/my_vhost_conf.jinja b/examples/nginx-grains-centos/salt/nginx/files/my_vhost_conf.jinja new file mode 100644 index 0000000..72797f1 --- /dev/null +++ b/examples/nginx-grains-centos/salt/nginx/files/my_vhost_conf.jinja @@ -0,0 +1,11 @@ +upstream backend { + server {{ backend_server }}; +} + +server { + listen 80; + server_name {{ server_name }}; + root /var/www; + + access_log /var/log/nginx/{{ log_prefix }}_http.log; +} diff --git a/examples/nginx-grains-centos/salt/nginx/init.sls b/examples/nginx-grains-centos/salt/nginx/init.sls new file mode 100644 index 0000000..4c3d2ce --- /dev/null +++ b/examples/nginx-grains-centos/salt/nginx/init.sls @@ -0,0 +1,19 @@ +nginx: + pkg: + - latest + service.running: + - enable: True + +/etc/nginx/conf.d/my_vhost.conf: + file.managed: + - source: salt://files/my_vhost_conf.jinja + - template: jinja + - require: + - pkg: nginx + - user: root + - group: root + - mode: 644 + - context: + {{ salt['grains.get']('my_grains') }} + - watch_in: + - service: nginx diff --git a/examples/nginx-grains-centos/salt/nginx/layer.yaml b/examples/nginx-grains-centos/salt/nginx/layer.yaml new file mode 100644 index 0000000..3a7e108 --- /dev/null +++ b/examples/nginx-grains-centos/salt/nginx/layer.yaml @@ -0,0 +1,5 @@ +help: nginx layer +description: > + Nginx layer +parent: sysbase +grains: dev diff --git a/examples/nginx-grains-centos/salt/nginx/top.sls b/examples/nginx-grains-centos/salt/nginx/top.sls new file mode 100644 index 0000000..a966bc0 --- /dev/null +++ b/examples/nginx-grains-centos/salt/nginx/top.sls @@ -0,0 +1,3 @@ +base: + '*': + - init diff --git a/examples/nginx-grains-centos/salt/sysbase/Dockerfile b/examples/nginx-grains-centos/salt/sysbase/Dockerfile new file mode 100644 index 0000000..445dcac --- /dev/null +++ b/examples/nginx-grains-centos/salt/sysbase/Dockerfile @@ -0,0 +1,15 @@ +FROM centos:centos6 + +CMD ["/sbin/init"] + +# Add EPEL repository +RUN yum -y install epel-release + +# Install salt and deps +RUN yum -y install salt-minion python2-gnupg cronie + +# SaltStack fail hard if any state fails +RUN echo "failhard: True" >> /etc/salt/minion + +# Clean up YUM when done. +RUN yum clean all && rm -rf /tmp/* /var/tmp/* diff --git a/examples/nginx-grains-centos/salt/sysbase/layer.yaml b/examples/nginx-grains-centos/salt/sysbase/layer.yaml new file mode 100644 index 0000000..58c1b4c --- /dev/null +++ b/examples/nginx-grains-centos/salt/sysbase/layer.yaml @@ -0,0 +1,5 @@ +help: Operating System Base Layer +description: > + System base layer + (CentOS 6.8 with salt-minion) + From bbf95674ef6ad379f4c5106999f8da2bf28d2b3a Mon Sep 17 00:00:00 2001 From: Alexander Zeikidze Date: Fri, 7 Apr 2017 03:04:17 +0300 Subject: [PATCH 15/16] Added container hostname support --- flyingcloud/base.py | 15 ++++++++++++--- flyingcloud/main.py | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/flyingcloud/base.py b/flyingcloud/base.py index 2191e49..4de04e5 100644 --- a/flyingcloud/base.py +++ b/flyingcloud/base.py @@ -90,6 +90,7 @@ def __init__( help, description=None, container_name=None, + container_hostname=None, exposed_ports=None, registry_config=None, source_version_tag="latest", @@ -99,6 +100,7 @@ def __init__( ): self.app_name = app_name self.layer_name = layer_name + self.container_hostname = container_hostname self.source_image_base_name = source_image_base_name self.help = help self.description = description @@ -188,6 +190,7 @@ def do_run(self, namespace): target_container_name = self.docker_create_container( namespace, self.container_name, + self.container_hostname, self.layer_latest_name, environment=self.make_environment(namespace.env_vars, self.environment)) self.docker_start(namespace, target_container_name) @@ -275,7 +278,7 @@ def build(self, namespace): self.make_expose_ports(namespace) target_container_name = self.salt_highstate( - namespace, self.container_name, + namespace, self.container_name, self.container_hostname, source_image_name=self.source_image_name, result_image_name=self.layer_timestamp_name, salt_dir=salt_dir) @@ -314,6 +317,7 @@ def salt_highstate( self, namespace, container_name, + container_hostname, source_image_name, result_image_name, salt_dir, timeout=SaltExecTimeout): @@ -337,7 +341,7 @@ def salt_highstate( volume_map[self.grains_dir] = "/srv/salt/_grains" try: target_container_name = self.docker_create_container( - namespace, container_name, source_image_name, + namespace, container_name, container_hostname, source_image_name, environment=self.make_environment(namespace.env_vars, self.environment), volume_map=volume_map ) @@ -502,7 +506,7 @@ def build_dockerfile(self, namespace, tag, dockerfile=None, fileobj=None): return image_id def docker_create_container( - self, namespace, container_name, image_name, + self, namespace, container_name, container_hostname, image_name, environment=None, detach=True, volume_map=None, **kwargs): namespace.logger.info("Creating container '%s' from image %s", container_name, image_name) @@ -516,6 +520,7 @@ def docker_create_container( kwargs['environment'] = environment kwargs['detach'] = detach kwargs['ports'] = self.container_ports(self.exposed_ports) + kwargs['hostname'] = container_hostname kwargs.update(self.docker_host_config(namespace, volume_map)) namespace.logger.info("create_container: %r", kwargs) @@ -806,6 +811,7 @@ def parse_args(self, defaults, *layer_classes, **kwargs): defaults.setdefault('pillar', None) defaults.setdefault('grains_dir', None) defaults.setdefault('grains', None) + defaults.setdefault('hostname', None) defaults.setdefault('logfile', os.path.join(defaults['base_dir'], "flyingcloud.log")) defaults.setdefault('docker_tagsfile', os.path.join(defaults['base_dir'], "docker_tags.json")) defaults.setdefault('timestamp_format', '%Y-%m-%dt%H%M%Sz') @@ -877,6 +883,9 @@ def parse_args(self, defaults, *layer_classes, **kwargs): parser.add_argument( '--grains', '-g', dest='grains', type=str, help="Specify custom grains to use for this layer. Default: %(default)r") + parser.add_argument( + '--hostname', '-n', dest='hostname', type=str, + help="Specify hostname to use for this layer. Default: %(default)r") if self.docker_machine_platform(): diff --git a/flyingcloud/main.py b/flyingcloud/main.py index 9bf9861..a7e57df 100755 --- a/flyingcloud/main.py +++ b/flyingcloud/main.py @@ -28,6 +28,7 @@ def get_layer(app_name, layer_name, layer_data, registry_config): description = layer_info.get('description') exposed_ports = layer_info.get('exposed_ports') container_name = layer_info.get('image_name') + container_hostname = layer_info.get('hostname') environment = layer_info.get('environment') pillar = layer_info.get('pillar') grains = layer_info.get('grains') @@ -39,6 +40,7 @@ def get_layer(app_name, layer_name, layer_data, registry_config): help=help, description=description, container_name=container_name, + container_hostname=container_hostname, exposed_ports=exposed_ports, registry_config=registry_config, environment=environment, From ab629bda35b423728f090982bc7fbbbed2d23e6a Mon Sep 17 00:00:00 2001 From: Alexander Zeikidze Date: Fri, 7 Apr 2017 03:40:32 +0300 Subject: [PATCH 16/16] Fixed flask-web-app.testrunner example --- examples/flask-web-app/salt/testrunner/testrunner_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/flask-web-app/salt/testrunner/testrunner_layer.py b/examples/flask-web-app/salt/testrunner/testrunner_layer.py index f83b737..c838b53 100644 --- a/examples/flask-web-app/salt/testrunner/testrunner_layer.py +++ b/examples/flask-web-app/salt/testrunner/testrunner_layer.py @@ -32,7 +32,7 @@ def do_run(self, namespace): namespace.logger.info( "Running tests: type=%s, environment=%r", test_type, environment) container_id = self.docker_create_container( - namespace, None, self.source_image_name, environment=environment) + namespace, None, None, self.source_image_name, environment=environment) self.docker_start(namespace, container_id) cmd = ["/venv/bin/py.test", "--tb=long", test_dir]