From d6d1299ae2e49f6dc074e3163f7bacb56998c27f Mon Sep 17 00:00:00 2001 From: "aynic.os" Date: Sun, 11 Jul 2021 08:56:03 +0100 Subject: [PATCH] wip --- Makefile | 4 +- ansible/ansible.mk | 17 +++-- ansible/def.ansible.mk | 6 ++ ansible/inventories/host_vars/localhost | 5 ++ ansible/roles/aws-cli/tasks/main.yml | 80 ++--------------------- ansible/roles/aws-cli/tasks/myos.yml | 31 +++++++++ ansible/roles/disks/tasks/main.yml | 14 ---- ansible/roles/docker/defaults/main.yml | 19 ++++-- ansible/roles/docker/handlers/main.yml | 7 +- ansible/roles/docker/tasks/config.yml | 18 +++++ ansible/roles/docker/tasks/group.yml | 2 +- ansible/roles/docker/tasks/main.yml | 9 ++- ansible/roles/docker/tasks/myos.yml | 61 +++++++++++++++++ ansible/roles/docker/tasks/myos_ec2.yml | 20 ++++++ ansible/roles/docker/tasks/package.yml | 1 + ansible/roles/docker/templates/daemon.json.j2 | 1 + ansible/roles/hosts/tasks/files.yml | 1 + ansible/roles/hosts/tasks/git.yml | 1 + ansible/roles/hosts/tasks/ssh.yml | 20 +----- ansible/roles/hosts/tasks/user.yml | 18 ++++- ansible/roles/hosts/tests/goss/file.yml | 19 +++++- ansible/roles/hosts/tests/goss/package_alpine.yml | 2 + ansible/roles/hosts/tests/goss/package_debian.yml | 2 + ansible/roles/hosts/tests/goss/package_redhat.yml | 2 + ansible/roles/hosts/vars/alpine.yml | 1 + ansible/roles/hosts/vars/debian.yml | 1 + ansible/roles/hosts/vars/redhat.yml | 1 + make/apps/common.mk | 4 +- make/apps/def.docker.mk | 5 +- make/apps/def.setup.mk | 4 -- make/apps/docker.mk | 8 +-- make/apps/install.mk | 30 ++++----- make/apps/{setup.mk => myos/def.setup.mk} | 20 ++---- make/apps/myos/setup.mk | 31 +++++++++ make/def.docker.mk | 1 + make/def.mk | 69 ++++++++++--------- make/monorepo/common.mk | 4 +- packer/def.packer.mk | 6 +- packer/packer.mk | 4 +- stack/base.mk | 2 +- stack/node.mk | 2 +- 41 files changed, 342 insertions(+), 211 deletions(-) create mode 100644 ansible/roles/aws-cli/tasks/myos.yml create mode 100644 ansible/roles/docker/tasks/myos.yml create mode 100644 ansible/roles/docker/tasks/myos_ec2.yml create mode 100644 ansible/roles/docker/templates/daemon.json.j2 delete mode 100644 make/apps/def.setup.mk rename make/apps/{setup.mk => myos/def.setup.mk} (61%) create mode 100644 make/apps/myos/setup.mk diff --git a/Makefile b/Makefile index 3875e52..bd5748a 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ include make/include.mk ## # APP -app-bootstrap: setup-sysctl setup-nfsd +app-bootstrap: setup-docker-group setup-nfsd setup-sysctl app-build: base install-build-config $(call make,docker-compose-build docker-compose-up) @@ -12,4 +12,6 @@ app-build: base install-build-config app-install: ansible-run base node +app-tests: ansible-tests + app-start: ssh-add diff --git a/ansible/ansible.mk b/ansible/ansible.mk index 1a10c55..d8a2987 100644 --- a/ansible/ansible.mk +++ b/ansible/ansible.mk @@ -1,16 +1,16 @@ # target ansible: Fire docker-build-ansible, Call ansible ANSIBLE_ARGS ARGS or ansible-run target .PHONY: ansible -ansible: $(if $(DOCKER_RUN),docker-build-ansible) +ansible: $(if $(DOCKER_RUN),docker-build-ansible,install-ansible) $(call ansible,$(ANSIBLE_ARGS) $(ARGS)) # target ansible-playbook: Call ansible-playbook ANSIBLE_ARGS ARGS .PHONY: ansible-playbook -ansible-playbook: $(if $(DOCKER_RUN),docker-build-ansible) +ansible-playbook: $(if $(DOCKER_RUN),docker-build-ansible,install-ansible) $(call ansible-playbook,$(ANSIBLE_ARGS) $(ARGS)) # target ansible-pull: Call ansible-pull ANSIBLE_GIT_REPOSITORY ANSIBLE_PLAYBOOK .PHONY: ansible-pull -ansible-pull: +ansible-pull: install-ansible $(call ansible-pull,--url $(ANSIBLE_GIT_REPOSITORY) $(if $(ANSIBLE_GIT_KEY_FILE),--key-file $(ANSIBLE_GIT_KEY_FILE)) $(if $(ANSIBLE_GIT_VERSION),--checkout $(ANSIBLE_GIT_VERSION)) $(if $(ANSIBLE_GIT_DIRECTORY),--directory $(ANSIBLE_GIT_DIRECTORY)) $(if $(ANSIBLE_TAGS),--tags $(ANSIBLE_TAGS)) $(if $(ANSIBLE_EXTRA_VARS),--extra-vars '$(ANSIBLE_EXTRA_VARS)') $(if $(findstring true,$(FORCE)),--force) $(if $(findstring true,$(DRYRUN)),--check) --full $(if $(ANSIBLE_INVENTORY),--inventory $(ANSIBLE_INVENTORY)) $(ANSIBLE_PLAYBOOK)) # target ansible-pull@%: Fire ssh-get-PrivateIpAddress-% for SERVER_NAME, Call ssh-exec make ansible-pull DOCKER_IMAGE_TAG @@ -24,5 +24,14 @@ ansible-run: ansible-run-localhost # target ansible-run-%: Fire docker-build-ansible, Call ansible-playbook ANSIBLE_PLAYBOOK .PHONY: ansible-run-% -ansible-run-%: $(if $(DOCKER_RUN),docker-build-ansible,install-ansible) +ansible-run-%: $(if $(DOCKER_RUN),docker-build-ansible,install-ansible) debug-ANSIBLE_PLAYBOOK $(call ansible-playbook,$(if $(ANSIBLE_TAGS),--tags $(ANSIBLE_TAGS)) $(if $(ANSIBLE_EXTRA_VARS),--extra-vars '$(patsubst target=localhost,target=$*,$(ANSIBLE_EXTRA_VARS))') $(if $(findstring true,$(DRYRUN)),--check) $(if $(ANSIBLE_INVENTORY),--inventory $(ANSIBLE_INVENTORY)) $(ANSIBLE_PLAYBOOK)) + +# target ansible-tests: Fire ssh-add ansible-tests-localhost +.PHONY: ansible-tests +ansible-tests: ansible-tests-localhost + +# target ansible-tests-%: Fire docker-run-% with ANSIBLE_PLAYBOOK ansible/roles/*/tests/playbook.yml +.PHONY: ansible-tests-% +ansible-tests-%: ANSIBLE_PLAYBOOK := $(wildcard ansible/roles/*/tests/playbook.yml) +ansible-tests-%: ansible-run-%; diff --git a/ansible/def.ansible.mk b/ansible/def.ansible.mk index 95f3675..8889927 100644 --- a/ansible/def.ansible.mk +++ b/ansible/def.ansible.mk @@ -46,3 +46,9 @@ define ansible-pull $(call INFO,ansible-pull,$(1)) $(call env-run,$(RUN) ansible-pull $(ANSIBLE_ARGS) $(ANSIBLE_VERBOSE) $(1)) endef +# function ansible-user-add-groups: Call ansible to add user 1 in groups 2 +define ansible-user-add-groups + $(call INFO,ansible-user-add-groups,$(1)$(comma) $(2)) + $(if $(DOCKER_RUN),$(call make,docker-build-ansible),$(call make,install-ansible)) + $(call ansible,-b -m user -a 'name=$(1) groups=$(2) append=yes' localhost) +endef diff --git a/ansible/inventories/host_vars/localhost b/ansible/inventories/host_vars/localhost index 88b624d..dc47a45 100644 --- a/ansible/inventories/host_vars/localhost +++ b/ansible/inventories/host_vars/localhost @@ -1,6 +1,11 @@ --- # file: inventories/host_vars/localhost +disks_additional_disks: +- disk: none + fstype: btrfs + mount: /var/lib/docker + service: docker docker_image_tag: "{{ lookup('env','ANSIBLE_DOCKER_IMAGE_TAG') or 'latest' }}" docker_registry: "{{ lookup('env','ANSIBLE_DOCKER_REGISTRY') }}" hosts_enable_local: true diff --git a/ansible/roles/aws-cli/tasks/main.yml b/ansible/roles/aws-cli/tasks/main.yml index 1924c5a..e42c0d7 100644 --- a/ansible/roles/aws-cli/tasks/main.yml +++ b/ansible/roles/aws-cli/tasks/main.yml @@ -67,79 +67,7 @@ mode=0600 force=yes -- name: aws - check AWS meta-data URI - uri: - url: http://169.254.169.254/latest/meta-data - timeout: 1 - register: aws_uri_check - tags: 'aws' - failed_when: False - -- name: aws - get instance metadata - tags: 'aws' - ec2_metadata_facts: - when: aws_uri_check.status == 200 - -- name: aws - get instance tags - tags: 'aws' - ec2_tag: - aws_access_key: "{{ aws_access_key_id }}" - aws_secret_key: "{{ aws_secret_access_key }}" - region: "{{ ansible_ec2_placement_region }}" - resource: "{{ ansible_ec2_instance_id }}" - state: list - register: ec2_tags - when: ansible_ec2_instance_id is defined - -- name: aws - set hostname - hostname: name="{{ ec2_tags.tags.hostname }}{% if ec2_tags.tags.domainname is defined %}.{{ ec2_tags.tags.domainname }}{% endif %}" - tags: 'aws' - when: ec2_tags.tags is defined and ec2_tags.tags.hostname is defined - -- name: aws - ecr login - shell: "$(aws ecr get-login --no-include-email --region {{ aws_region }})" - tags: 'aws' - when: ec2_tags.tags is defined - -# ansible v2.8 -# - name: aws - prune docker objects -# docker_prune: -# containers: yes -# images: yes -# images_filters: -# dangling: false -# networks: yes -# volumes: yes -# builder_cache: yes -# tags: 'aws' - -- name: aws - launch docker containers - docker_container: - image: "{{docker_registry|default(ec2_tags.tags.user)}}/{{ec2_tags.tags.user}}/{{ec2_tags.tags.env}}/{% if ':' in item %}{{item}}{% else %}{{item}}:{{docker_image_tag|default('latest')}}{% endif %}" - name: "{{ec2_tags.tags.user}}_{{ec2_tags.tags.env}}_{{item|replace('/','_')|regex_replace(':.*','')}}" - network_mode: host - pull: yes - restart_policy: always - volumes: - - "{{ lookup('env','ANSIBLE_DISKS_NFS_PATH') }}:/shared" - - /etc/localtime:/etc/localtime:ro - - /var/run/docker.sock:/tmp/docker.sock:ro - tags: 'aws' - with_items: '{{ec2_tags.tags.services.split(" ")}}' - when: ec2_tags.tags is defined and ec2_tags.tags.env is defined and ec2_tags.tags.services is defined and ec2_tags.tags.user is defined - -- name: aws - add docker containers to inventory - add_host: - name: "{{ec2_tags.tags.user}}_{{ec2_tags.tags.env}}_{{item|replace('/','_')|regex_replace(':.*','')}}" - ansible_connection: docker - changed_when: false - tags: 'aws' - with_items: '{{ec2_tags.tags.services.split(" ")}}' - when: ec2_tags.tags is defined and ec2_tags.tags.env is defined and ec2_tags.tags.services is defined and ec2_tags.tags.user is defined - -- name: aws - run make deploy-hook in docker containers - delegate_to: "{{ec2_tags.tags.user}}_{{ec2_tags.tags.env}}_{{item|replace('/','_')|regex_replace(':.*','')}}" - raw: "command -v make || exit 0 && make deploy-hook CONTAINER={{ec2_tags.tags.user}}_{{ec2_tags.tags.env}}_{{item|replace('/','_')|regex_replace(':.*','')}} HOST={{ansible_ec2_local_ipv4}}" - tags: 'aws' - with_items: '{{ec2_tags.tags.services.split(" ")}}' - when: ec2_tags.tags is defined and ec2_tags.tags.env is defined and ec2_tags.tags.services is defined and ec2_tags.tags.user is defined +- import_tasks: myos.yml + tags: + - aws + - myos diff --git a/ansible/roles/aws-cli/tasks/myos.yml b/ansible/roles/aws-cli/tasks/myos.yml new file mode 100644 index 0000000..e3648a1 --- /dev/null +++ b/ansible/roles/aws-cli/tasks/myos.yml @@ -0,0 +1,31 @@ +--- +# file: tasks/myos.yml + +- name: myos - check AWS meta-data URI + uri: + url: http://169.254.169.254/latest/meta-data + timeout: 1 + register: aws_uri_check + tags: 'aws' + failed_when: False + +- name: myos - get instance metadata + tags: 'aws' + ec2_metadata_facts: + when: aws_uri_check.status == 200 + +- name: myos - get instance tags + tags: 'aws' + ec2_tag: + aws_access_key: "{{ aws_access_key_id }}" + aws_secret_key: "{{ aws_secret_access_key }}" + region: "{{ ansible_ec2_placement_region }}" + resource: "{{ ansible_ec2_instance_id }}" + state: list + register: ec2_tags + when: ansible_ec2_instance_id is defined + +- name: myos - set hostname + hostname: name="{{ ec2_tags.tags.hostname }}{% if ec2_tags.tags.domainname is defined %}.{{ ec2_tags.tags.domainname }}{% endif %}" + tags: 'aws' + when: ec2_tags.tags is defined and ec2_tags.tags.hostname is defined diff --git a/ansible/roles/disks/tasks/main.yml b/ansible/roles/disks/tasks/main.yml index 63524d8..063dfd4 100644 --- a/ansible/roles/disks/tasks/main.yml +++ b/ansible/roles/disks/tasks/main.yml @@ -1,17 +1,3 @@ -- name: 'Install Python PIP' - package: > - name=py3-pip - state=present - when: ansible_os_family|lower == "alpine" - become: yes - -- name: 'Install Python PIP' - package: > - name=python-pip - state=present - when: ansible_os_family|lower != "alpine" - become: yes - - name: 'Install python-pathlib' pip: > name=pathlib diff --git a/ansible/roles/docker/defaults/main.yml b/ansible/roles/docker/defaults/main.yml index 7e0d516..9bc77c7 100644 --- a/ansible/roles/docker/defaults/main.yml +++ b/ansible/roles/docker/defaults/main.yml @@ -4,6 +4,18 @@ # minimum kernel version docker_check_kernel: '3.10' +# Location of configuration files of docker daemon +docker_daemon_config_directory: "/etc/docker" + +# Configuration files of docker daemon +docker_daemon_config_file: "{{docker_daemon_config_directory}}/daemon.json" + +# Configure docker daemon storage driver +docker_daemon_config_storage: "{% if ansible_cmdline.fstype == 'btrfs'%}btrfs{% endif %}" + +# Docker daemon configuration +docker_daemon_config: {} + # The docker package name docker_package: docker @@ -21,13 +33,6 @@ docker_opts: "OPTIONS" docker_services: - docker -# dockers -# dockers: -# - nginx - -# docker cluster -# docker_cluster: "" - # Start docker docker_start: true diff --git a/ansible/roles/docker/handlers/main.yml b/ansible/roles/docker/handlers/main.yml index 96777da..be22ae1 100644 --- a/ansible/roles/docker/handlers/main.yml +++ b/ansible/roles/docker/handlers/main.yml @@ -2,7 +2,8 @@ # file handlers/main.yml - name: restart docker + with_items: "{{docker_services|default([])}}" service: - name: "{{docker_service}}" - state: "restarted" - + name: "{{item}}" + state: restarted + become: yes diff --git a/ansible/roles/docker/tasks/config.yml b/ansible/roles/docker/tasks/config.yml index 37bdd56..7b2f9e4 100644 --- a/ansible/roles/docker/tasks/config.yml +++ b/ansible/roles/docker/tasks/config.yml @@ -2,10 +2,27 @@ # file: tasks/config.yml - name: config - add docker storage setup + notify: restart docker lineinfile: dest="{{docker_init_config_directory}}/{{docker_package}}-storage-setup" state="present" line="STORAGE_DRIVER=\"\"" when: docker_package|length > 0 and ansible_service_mgr == "systemd" and ansible_os_family|lower == "redhat" become: yes +- name: config - register docker_daemon_config + set_fact: + docker_daemon_config: "{{ lookup('file',docker_daemon_config_file)|default('{}')|from_json}}" + ignore_errors: true + +- name: config - add docker daemon storage configuration for btrfs + notify: restart docker + template: + src: daemon.json.j2 + dest: "{{docker_daemon_config_file}}" + owner: root + group: docker + mode: "0640" + when: docker_package|length > 0 + become: yes + # - name: config - disable docker iptables setup # lineinfile: dest="/lib/systemd/system/docker.service" state="present" regex="^ExecStart=" line="ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=false" # notify: restart docker @@ -13,6 +30,7 @@ # become: yes - name: config - setup docker mtu on Openstack VMs + notify: restart docker lineinfile: dest="{{docker_init_config_directory}}/{{docker_package}}" state="present" backrefs=true regexp='^{{docker_opts}}=(?:\'|\")?((?:\s*[\w=\/\-\.](?