From 7435fa433db435af94445b9f328ad1d9f8879182 Mon Sep 17 00:00:00 2001 From: Arthur Dayton Date: Mon, 25 Mar 2024 11:58:08 -0700 Subject: [PATCH] fix: CS-252 fix failing tests --- .github/workflows/AWS-EC2-Tests-Old.yaml | 232 ++++++++++++ .github/workflows/AWS-EC2-Tests.yaml | 201 ++--------- .github/workflows/Azure-Compute-Tests.yaml | 2 +- .github/workflows/GCP-Compute-Tests.yaml | 2 +- .gitignore | 10 +- test_code_v2/aws/README.md | 2 + test_code_v2/aws/aws_helper/SETUP_README.md | 72 ++++ test_code_v2/aws/aws_helper/aws-creds | 283 +++++++++++++++ .../aws/aws_helper/image/CLI_success.png | Bin 0 -> 45300 bytes .../aws/aws_helper/image/LoginScreen.png | Bin 0 -> 61117 bytes .../aws/aws_helper/image/terminal_success.png | Bin 0 -> 148850 bytes test_code_v2/aws/aws_helper/make_me_env.sh | 130 +++++++ .../host_monitoring/ec2/TERRAFORM_README.md | 172 +++++++++ .../ec2/terraform/02-module/main.tf | 58 +++ .../ec2/terraform/02-module/versions.tf | 16 + .../ec2/terraform/ec2_module/data.tf | 12 + .../ec2/terraform/ec2_module/main.tf | 41 +++ .../ec2/terraform/ec2_module/outputs.tf | 18 + .../ec2/terraform/ec2_module/variables.tf | 210 +++++++++++ .../ec2/terraform/ec2_module/versions.tf | 15 + .../ec2/terraform/keypair_module/main.tf | 23 ++ .../ec2/terraform/keypair_module/outputs.tf | 7 + .../ec2/terraform/keypair_module/variables.tf | 18 + .../ec2/terraform/keypair_module/versions.tf | 18 + .../aws/host_monitoring/ec2/terraform/main.tf | 79 +++++ .../ec2/terraform/observe/host_mon/main.tf | 40 +++ .../ec2/terraform/observe/host_mon/outputs.tf | 8 + .../terraform/observe/host_mon/variables.tf | 11 + .../terraform/observe/host_mon/versions.tf | 12 + .../ec2/terraform/observe/quickstart/main.tf | 37 ++ .../terraform/observe/quickstart/outputs.tf | 8 + .../terraform/observe/quickstart/variables.tf | 11 + .../terraform/observe/quickstart/versions.tf | 12 + .../host_monitoring/ec2/terraform/outputs.tf | 28 ++ ...ptbased_linux_configuration_script_repo.sh | 157 +++++++++ .../ec2/terraform/user_data/aptbased_otel.sh | 277 +++++++++++++++ .../terraform/user_data/aptbased_otel_repo.sh | 117 +++++++ .../aptbased_otel_repo_noagentinstall.sh | 102 ++++++ .../user_data/garbage/aptbased_fluent.sh | 84 +++++ .../user_data/garbage/aptbased_telegraf.sh | 79 +++++ .../ec2/terraform/user_data/windows.ps | Bin 0 -> 6069 bytes .../user_data/windows_noagentinstall.ps | Bin 0 -> 6311 bytes .../ec2/terraform/user_data/windows_otel.ps | Bin 0 -> 6309 bytes ...m_based_linux_configuration_script_repo.sh | 55 +++ .../user_data/yum_based_noagentinstall.sh | 8 + .../user_data/yum_based_otel_repo.sh | 10 + .../ec2/terraform/variables.tf | 305 ++++++++++++++++ .../host_monitoring/ec2/terraform/versions.tf | 21 ++ .../ec2/terraform/vpc_module/main.tf | 55 +++ .../ec2/terraform/vpc_module/outputs.tf | 11 + .../terraform/vpc_module/security_group.tf | 31 ++ .../ec2/terraform/vpc_module/variables.tf | 182 ++++++++++ .../ec2/terraform/vpc_module/versions.tf | 10 + test_code_v2/python/README.md | 26 ++ test_code_v2/python/envfile.md | 1 + test_code_v2/python/main.py | 84 +++++ test_code_v2/python/package/queries.py | 331 ++++++++++++++++++ test_code_v2/python/package/results.py | 118 +++++++ test_code_v2/python/package/terraform.py | 270 ++++++++++++++ test_code_v2/python/package/utils.py | 168 +++++++++ test_code_v2/python/requirements.txt | 35 ++ test_code_v2/python/summaryfile.md | 19 + 62 files changed, 4158 insertions(+), 186 deletions(-) create mode 100644 .github/workflows/AWS-EC2-Tests-Old.yaml create mode 100644 test_code_v2/aws/README.md create mode 100644 test_code_v2/aws/aws_helper/SETUP_README.md create mode 100755 test_code_v2/aws/aws_helper/aws-creds create mode 100644 test_code_v2/aws/aws_helper/image/CLI_success.png create mode 100644 test_code_v2/aws/aws_helper/image/LoginScreen.png create mode 100644 test_code_v2/aws/aws_helper/image/terminal_success.png create mode 100755 test_code_v2/aws/aws_helper/make_me_env.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/TERRAFORM_README.md create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/02-module/main.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/02-module/versions.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/data.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/main.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/outputs.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/variables.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/versions.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/keypair_module/main.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/keypair_module/outputs.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/keypair_module/variables.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/keypair_module/versions.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/main.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/observe/host_mon/main.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/observe/host_mon/outputs.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/observe/host_mon/variables.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/observe/host_mon/versions.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/observe/quickstart/main.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/observe/quickstart/outputs.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/observe/quickstart/variables.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/observe/quickstart/versions.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/outputs.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_linux_configuration_script_repo.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel_repo.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel_repo_noagentinstall.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/garbage/aptbased_fluent.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/garbage/aptbased_telegraf.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows.ps create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows_noagentinstall.ps create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows_otel.ps create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_linux_configuration_script_repo.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_noagentinstall.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_otel_repo.sh create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/variables.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/versions.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/main.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/outputs.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/security_group.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/variables.tf create mode 100644 test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/versions.tf create mode 100644 test_code_v2/python/README.md create mode 100644 test_code_v2/python/envfile.md create mode 100644 test_code_v2/python/main.py create mode 100644 test_code_v2/python/package/queries.py create mode 100644 test_code_v2/python/package/results.py create mode 100644 test_code_v2/python/package/terraform.py create mode 100644 test_code_v2/python/package/utils.py create mode 100644 test_code_v2/python/requirements.txt create mode 100644 test_code_v2/python/summaryfile.md diff --git a/.github/workflows/AWS-EC2-Tests-Old.yaml b/.github/workflows/AWS-EC2-Tests-Old.yaml new file mode 100644 index 00000000..7f6a96f2 --- /dev/null +++ b/.github/workflows/AWS-EC2-Tests-Old.yaml @@ -0,0 +1,232 @@ +run-name: AWS EC2 - ${{ github.event_name }} by @${{ github.actor }} +# name: Fabric Build +concurrency: aws-workflow +on: + workflow_dispatch: + inputs: + this_repo_branch: + type: string + description: Select the branch to use from this repo + default: main + windows_repo_branch: + type: string + description: Select the branch to use from windows-host-configuration repo + default: main + terraform_run_destroy: + type: choice + options: + - true + - false + fail_first_test: + type: choice + options: + - false + - true + fail_second_test: + type: choice + options: + - false + - true + push: + branches: + - 'arthur/secret-manager' + # pull_request: + + schedule: + # only runs on default branch + # * is a special character in YAML so you have to quote this string + - cron: '15 */12 * * *' + +jobs: + + Run-Test-Build: + strategy: + max-parallel: 30 + fail-fast: false + matrix: + test_groups: ['base_defaults'] + runs-on: ubuntu-latest + permissions: + id-token: write + contents: write + pull-requests: write + issues: read + checks: write + env: + TF_VAR_REGION: "us-west-2" + THIS_REPO_BRANCH: main + WINDOWS_REPO_BRANCH: main + TERRAFORM_RUN_DESTROY: true + FAIL_FIRST_TEST: false + FAIL_SECOND_TEST: false + WORK_DIR: test_code + CLOUD: aws + MODULE: aws_machines + # TF_LOG: DEBUG + + steps: + # GCP Login + # This is key generated in GCP console for service account + - id: 'auth' + uses: 'google-github-actions/auth@v0' + with: + credentials_json: ${{ secrets.GCP_CREDENTIALS }} + + - name: 'Set up Cloud SDK' + uses: 'google-github-actions/setup-gcloud@v0' + with: + project_id: ${{ secrets.GCP_PROJECT_ID }} + + - id: 'secrets' + uses: 'google-github-actions/get-secretmanager-secrets@v1' + with: + secrets: |- + TF_VAR_PUBLIC_KEY:projects/896946759488/secrets/TF_VAR_PUBLIC_KEY + THUNDERDOME_AWS_ROLE:projects/896946759488/secrets/THUNDERDOME_AWS_ROLE + PRIVATE_KEY:projects/896946759488/secrets/PRIVATE_KEY + STAGE_CUSTOMER_ID:projects/896946759488/secrets/STAGE_CUSTOMER_ID + STAGE_DATASTREAM_TOKEN:projects/896946759488/secrets/STAGE_DATASTREAM_TOKEN + STAGE_DOMAIN:projects/896946759488/secrets/STAGE_DOMAIN + STAGE_USER_EMAIL:projects/896946759488/secrets/STAGE_USER_EMAIL + STAGE_USER_PASSWORD:projects/896946759488/secrets/STAGE_USER_PASSWORD + + + + # AWS Login - orig role - has to occur before checkout + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + role-to-assume: ${{ steps.secrets.outputs.THUNDERDOME_AWS_ROLE }} + aws-region: ${{ env.TF_VAR_REGION }} + + - name: Set code repo #Set branches based on via Workflow Dispatch or Pull Request + run: | + if ${{ github.event.inputs.this_repo_branch != '' }}; then + echo "THIS_REPO_BRANCH=refs/heads/${{ github.event.inputs.this_repo_branch }}" >> $GITHUB_ENV + echo "WINDOWS_REPO_BRANCH=refs/heads/${{ github.event.inputs.windows_repo_branch }}" >> $GITHUB_ENV + elif ${{ github.event_name == 'pull_request' }}; then + echo "THIS_REPO_BRANCH=refs/heads/${{ github.head_ref }}" >> $GITHUB_ENV + echo "WINDOWS_REPO_BRANCH=refs/heads/${{ env.WINDOWS_REPO_BRANCH}}" >> $GITHUB_ENV + fi + + - name: Set env var + run: | + echo "TF_VAR_PUBLIC_KEY=${{ steps.secrets.outputs.TF_VAR_PUBLIC_KEY }}" >> $GITHUB_ENV + + - name: Check out repository code + uses: actions/checkout@v3 + with: + ref: ${{ env.THIS_REPO_BRANCH }} + + - name: Set contexts + run: | + mkdir context + echo '${{ toJSON(github) }}' > context/github_context.json + echo '${{ toJSON(matrix) }}' > context/matrix_context.json + echo '${{ steps.secrets.outputs.PRIVATE_KEY }}' > context/private_key + + working-directory: "${{ env.WORK_DIR }}/python_scripts" + + - name: workflow helper + run: | + python3 -c "from workflow_tasks import set_custom_vars; set_custom_vars(context_dir='context')" + + python3 -c "from workflow_tasks import tf_override_file; tf_override_file(cloud=\"${{ env.CLOUD }}\", test_group=\"${{ matrix.test_groups }}\")" + + # !!! vvvvv THIS OVERWRITES MAIN.TF FILE for specific cloud module vvvvv !!! + python3 -c "from workflow_tasks import tf_main_file; tf_main_file(module=\"${{ env.MODULE }}\")" + + python3 -c "from workflow_tasks import tf_output_file; tf_output_file(module=\"${{ env.MODULE }}\")" + + python3 -c "from workflow_tasks import config_ini; config_ini(custid=\"${{ steps.secrets.outputs.STAGE_CUSTOMER_ID }}\", domain=\"${{ steps.secrets.outputs.STAGE_DOMAIN }}\", token=\"${{ steps.secrets.outputs.STAGE_DATASTREAM_TOKEN }}\",user_email=\"${{ steps.secrets.outputs.STAGE_USER_EMAIL }}\",user_password=\"${{ steps.secrets.outputs.STAGE_USER_PASSWORD }}\")" + + working-directory: "${{ env.WORK_DIR }}/python_scripts" + + - name: Print Environment Variables - troubleshooting + run: | + env | sort -f + + - name: Setup Terraform + uses: hashicorp/setup-terraform@v2 + with: + terraform_wrapper: false + + - name: terraform tasks + run: | + terraform version + + terraform init + + terraform validate + working-directory: "${{ env.WORK_DIR }}" + + - name: terraform apply + run: | + terraform apply -auto-approve + working-directory: "${{ env.WORK_DIR }}" + + # Run tests + - name: run fabric tests python script + run: | + # create output directory for archive files + mkdir file_outputs + mkdir log_outputs + + # install dependencies + pip3 install -r requirements.txt + + # run tests + fab test -a ${{ env.FAIL_FIRST_TEST }} -b ${{ env.THIS_REPO_BRANCH }} -w ${{ env.WINDOWS_REPO_BRANCH }} -o "1: run fabric tests python script" + working-directory: "${{ env.WORK_DIR }}/python_scripts" + + - name: Retry tests + if: ${{ env.TEST_RESULT == 'FAIL' }} + run: | + # run tests + fab test -a ${{ env.FAIL_SECOND_TEST }} -o "2: Retry tests" -w ${{ env.WINDOWS_REPO_BRANCH }} -b ${{ env.THIS_REPO_BRANCH }} + + working-directory: "${{ env.WORK_DIR }}/python_scripts" + + - name: cleanup + if: always() + run: | + rm -f python_scripts/config.ini + + sed -i 's/${{ steps.secrets.outputs.STAGE_DATASTREAM_TOKEN }}/******/g' ./python_scripts/file_outputs/* + sed -i 's/${{ steps.secrets.outputs.STAGE_CUSTOMER_ID }}/******/g' ./python_scripts/file_outputs/* + sed -i 's/${{ steps.secrets.outputs.STAGE_USER_EMAIL}}/******/g' ./python_scripts/file_outputs/* + sed -i 's/${{ steps.secrets.outputs.STAGE_USER_PASSWORD}}/******/g' ./python_scripts/file_outputs/* + + + sed -i 's/${{ steps.secrets.outputs.STAGE_DATASTREAM_TOKEN }}/******/g' ./python_scripts/log_outputs/* + sed -i 's/${{ steps.secrets.outputs.STAGE_CUSTOMER_ID }}/******/g' ./python_scripts/log_outputs/* + sed -i 's/${{ steps.secrets.outputs.STAGE_USER_EMAIL }}/******/g' ./python_scripts/log_outputs/* + sed -i 's/${{ steps.secrets.outputs.STAGE_USER_PASSWORD }}/******/g' ./python_scripts/log_outputs/* + + working-directory: "${{ env.WORK_DIR }}" + + - name: Archive test results + uses: actions/upload-artifact@v3 + with: + name: file_outputs + path: | + /home/runner/work/linux-host-configuration-scripts/linux-host-configuration-scripts/test_code/python_scripts/file_outputs/ + /home/runner/work/linux-host-configuration-scripts/linux-host-configuration-scripts/test_code/python_scripts/log_outputs/ + retention-days: 1 + + - name: terraform destroy + if: always() + run: | + echo "Value of input ${{ env.TERRAFORM_RUN_DESTROY == 'true' }}" + + if ${{ env.TERRAFORM_RUN_DESTROY == 'true' }}; then + terraform destroy -auto-approve + fi + working-directory: "${{ env.WORK_DIR }}" + + - name: Fail Check + if: ${{ env.TEST_RESULT == 'FAIL' }} + uses: actions/github-script@v3 + with: + script: | + core.setFailed('Fabric tests failed') diff --git a/.github/workflows/AWS-EC2-Tests.yaml b/.github/workflows/AWS-EC2-Tests.yaml index 932ac049..396169d5 100644 --- a/.github/workflows/AWS-EC2-Tests.yaml +++ b/.github/workflows/AWS-EC2-Tests.yaml @@ -1,36 +1,9 @@ run-name: AWS EC2 - ${{ github.event_name }} by @${{ github.actor }} -# name: Fabric Build +name: PR Tests V2 concurrency: aws-workflow on: workflow_dispatch: - inputs: - this_repo_branch: - type: string - description: Select the branch to use from this repo - default: main - windows_repo_branch: - type: string - description: Select the branch to use from windows-host-configuration repo - default: main - terraform_run_destroy: - type: choice - options: - - true - - false - fail_first_test: - type: choice - options: - - false - - true - fail_second_test: - type: choice - options: - - false - - true - push: - branches: - - 'arthur/secret-manager' - pull_request: + # pull_request: schedule: # only runs on default branch @@ -54,179 +27,45 @@ jobs: checks: write env: TF_VAR_REGION: "us-west-2" - THIS_REPO_BRANCH: main - WINDOWS_REPO_BRANCH: main - TERRAFORM_RUN_DESTROY: true - FAIL_FIRST_TEST: false - FAIL_SECOND_TEST: false - WORK_DIR: test_code - CLOUD: aws - MODULE: aws_machines + WORK_DIR: test_code_v2 # TF_LOG: DEBUG steps: - # GCP Login - # This is key generated in GCP console for service account - - id: 'auth' - uses: 'google-github-actions/auth@v0' - with: - credentials_json: ${{ secrets.GCP_CREDENTIALS }} - - - name: 'Set up Cloud SDK' - uses: 'google-github-actions/setup-gcloud@v0' - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - - id: 'secrets' - uses: 'google-github-actions/get-secretmanager-secrets@v1' - with: - secrets: |- - TF_VAR_PUBLIC_KEY:projects/896946759488/secrets/TF_VAR_PUBLIC_KEY - THUNDERDOME_AWS_ROLE:projects/896946759488/secrets/THUNDERDOME_AWS_ROLE - PRIVATE_KEY:projects/896946759488/secrets/PRIVATE_KEY - STAGE_CUSTOMER_ID:projects/896946759488/secrets/STAGE_CUSTOMER_ID - STAGE_DATASTREAM_TOKEN:projects/896946759488/secrets/STAGE_DATASTREAM_TOKEN - STAGE_DOMAIN:projects/896946759488/secrets/STAGE_DOMAIN - STAGE_USER_EMAIL:projects/896946759488/secrets/STAGE_USER_EMAIL - STAGE_USER_PASSWORD:projects/896946759488/secrets/STAGE_USER_PASSWORD - - - # AWS Login - orig role - has to occur before checkout - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: - role-to-assume: ${{ steps.secrets.outputs.THUNDERDOME_AWS_ROLE }} + role-to-assume: ${{ secrets.THUNDERDOME_AWS_ROLE }} aws-region: ${{ env.TF_VAR_REGION }} - - name: Set code repo #Set branches based on via Workflow Dispatch or Pull Request - run: | - if ${{ github.event.inputs.this_repo_branch != '' }}; then - echo "THIS_REPO_BRANCH=refs/heads/${{ github.event.inputs.this_repo_branch }}" >> $GITHUB_ENV - echo "WINDOWS_REPO_BRANCH=refs/heads/${{ github.event.inputs.windows_repo_branch }}" >> $GITHUB_ENV - elif ${{ github.event_name == 'pull_request' }}; then - echo "THIS_REPO_BRANCH=refs/heads/${{ github.head_ref }}" >> $GITHUB_ENV - echo "WINDOWS_REPO_BRANCH=refs/heads/${{ env.WINDOWS_REPO_BRANCH}}" >> $GITHUB_ENV - fi - - - name: Set env var - run: | - echo "TF_VAR_PUBLIC_KEY=${{ steps.secrets.outputs.TF_VAR_PUBLIC_KEY }}" >> $GITHUB_ENV - name: Check out repository code - uses: actions/checkout@v3 + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 with: - ref: ${{ env.THIS_REPO_BRANCH }} - - - name: Set contexts - run: | - mkdir context - echo '${{ toJSON(github) }}' > context/github_context.json - echo '${{ toJSON(matrix) }}' > context/matrix_context.json - echo '${{ steps.secrets.outputs.PRIVATE_KEY }}' > context/private_key - - working-directory: "${{ env.WORK_DIR }}/python_scripts" + python-version: '3.10' - - name: workflow helper + - name: Run Tests run: | - python3 -c "from workflow_tasks import set_custom_vars; set_custom_vars(context_dir='context')" - - python3 -c "from workflow_tasks import tf_override_file; tf_override_file(cloud=\"${{ env.CLOUD }}\", test_group=\"${{ matrix.test_groups }}\")" - - # !!! vvvvv THIS OVERWRITES MAIN.TF FILE for specific cloud module vvvvv !!! - python3 -c "from workflow_tasks import tf_main_file; tf_main_file(module=\"${{ env.MODULE }}\")" - - python3 -c "from workflow_tasks import tf_output_file; tf_output_file(module=\"${{ env.MODULE }}\")" - - python3 -c "from workflow_tasks import config_ini; config_ini(custid=\"${{ steps.secrets.outputs.STAGE_CUSTOMER_ID }}\", domain=\"${{ steps.secrets.outputs.STAGE_DOMAIN }}\", token=\"${{ steps.secrets.outputs.STAGE_DATASTREAM_TOKEN }}\",user_email=\"${{ steps.secrets.outputs.STAGE_USER_EMAIL }}\",user_password=\"${{ steps.secrets.outputs.STAGE_USER_PASSWORD }}\")" - - working-directory: "${{ env.WORK_DIR }}/python_scripts" + pip install -r requirements.txt + python main.py + working-directory: "${{ env.WORK_DIR }}/python" + env: + OBSERVE_CUSTOMER: ${{ secrets.TERRAFORM_MODULES_TEST_OBSERVE_CUSTOMER }} + OBSERVE_DOMAIN: ${{ secrets.TERRAFORM_MODULES_TEST_OBSERVE_DOMAIN }} + OBSERVE_USER_EMAIL: ${{ secrets.TERRAFORM_MODULES_TEST_OBSERVE_USER_EMAIL }} + OBSERVE_USER_PASSWORD: ${{ secrets.TERRAFORM_MODULES_TEST_OBSERVE_USER_PASSWORD }} + O2_OBSERVE_TOKEN: ${{ secrets.O2_OBSERVE_TOKEN }} - name: Print Environment Variables - troubleshooting run: | env | sort -f - - name: Setup Terraform - uses: hashicorp/setup-terraform@v2 - with: - terraform_wrapper: false - - - name: terraform tasks - run: | - terraform version - - terraform init - - terraform validate - working-directory: "${{ env.WORK_DIR }}" - - - name: terraform apply - run: | - terraform apply -auto-approve - working-directory: "${{ env.WORK_DIR }}" - - # Run tests - - name: run fabric tests python script - run: | - # create output directory for archive files - mkdir file_outputs - mkdir log_outputs - - # install dependencies - pip3 install -r requirements.txt - - # run tests - fab test -a ${{ env.FAIL_FIRST_TEST }} -b ${{ env.THIS_REPO_BRANCH }} -w ${{ env.WINDOWS_REPO_BRANCH }} -o "1: run fabric tests python script" - working-directory: "${{ env.WORK_DIR }}/python_scripts" - - - name: Retry tests - if: ${{ env.TEST_RESULT == 'FAIL' }} - run: | - # run tests - fab test -a ${{ env.FAIL_SECOND_TEST }} -o "2: Retry tests" -w ${{ env.WINDOWS_REPO_BRANCH }} -b ${{ env.THIS_REPO_BRANCH }} - - working-directory: "${{ env.WORK_DIR }}/python_scripts" - - - name: cleanup - if: always() - run: | - rm -f python_scripts/config.ini - - sed -i 's/${{ steps.secrets.outputs.STAGE_DATASTREAM_TOKEN }}/******/g' ./python_scripts/file_outputs/* - sed -i 's/${{ steps.secrets.outputs.STAGE_CUSTOMER_ID }}/******/g' ./python_scripts/file_outputs/* - sed -i 's/${{ steps.secrets.outputs.STAGE_USER_EMAIL}}/******/g' ./python_scripts/file_outputs/* - sed -i 's/${{ steps.secrets.outputs.STAGE_USER_PASSWORD}}/******/g' ./python_scripts/file_outputs/* - - - sed -i 's/${{ steps.secrets.outputs.STAGE_DATASTREAM_TOKEN }}/******/g' ./python_scripts/log_outputs/* - sed -i 's/${{ steps.secrets.outputs.STAGE_CUSTOMER_ID }}/******/g' ./python_scripts/log_outputs/* - sed -i 's/${{ steps.secrets.outputs.STAGE_USER_EMAIL }}/******/g' ./python_scripts/log_outputs/* - sed -i 's/${{ steps.secrets.outputs.STAGE_USER_PASSWORD }}/******/g' ./python_scripts/log_outputs/* - - working-directory: "${{ env.WORK_DIR }}" - - - name: Archive test results - uses: actions/upload-artifact@v3 - with: - name: file_outputs - path: | - /home/runner/work/linux-host-configuration-scripts/linux-host-configuration-scripts/test_code/python_scripts/file_outputs/ - /home/runner/work/linux-host-configuration-scripts/linux-host-configuration-scripts/test_code/python_scripts/log_outputs/ - retention-days: 1 - - - name: terraform destroy - if: always() - run: | - echo "Value of input ${{ env.TERRAFORM_RUN_DESTROY == 'true' }}" - - if ${{ env.TERRAFORM_RUN_DESTROY == 'true' }}; then - terraform destroy -auto-approve - fi - working-directory: "${{ env.WORK_DIR }}" - - name: Fail Check if: ${{ env.TEST_RESULT == 'FAIL' }} uses: actions/github-script@v3 with: script: | - core.setFailed('Fabric tests failed') + core.setFailed('Integration tests failed') diff --git a/.github/workflows/Azure-Compute-Tests.yaml b/.github/workflows/Azure-Compute-Tests.yaml index b14fc80e..711d48af 100644 --- a/.github/workflows/Azure-Compute-Tests.yaml +++ b/.github/workflows/Azure-Compute-Tests.yaml @@ -26,7 +26,7 @@ on: # push: # branches: # - 'arthur/secret-manager' - pull_request: + # pull_request: schedule: # only runs on default branch diff --git a/.github/workflows/GCP-Compute-Tests.yaml b/.github/workflows/GCP-Compute-Tests.yaml index f9896e55..e4eb5030 100644 --- a/.github/workflows/GCP-Compute-Tests.yaml +++ b/.github/workflows/GCP-Compute-Tests.yaml @@ -26,7 +26,7 @@ on: push: branches: - 'arthur/secret-manager' - pull_request: + # pull_request: schedule: # only runs on default branch diff --git a/.gitignore b/.gitignore index 1b335b73..054f9ab5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,7 @@ override.tf *.tfvars .terraform* -terraform.tfstate -terraform.tfstate.backup +terraform.tfstate* tf_hosts.json __pycache__ /test_code/python_scripts/file_outputs @@ -13,4 +12,9 @@ test_code/python_scripts/testenv log_outputs /test_code/python_scripts/context /test_code/python_scripts/.idea -/test_code/outputs.tf \ No newline at end of file +/test_code/outputs.tf +/test_code_v2/python/.*env +observe_datastream_token_hostmon +observe_name_format_hostmon +aws_machines* +ephemeral_key \ No newline at end of file diff --git a/test_code_v2/aws/README.md b/test_code_v2/aws/README.md new file mode 100644 index 00000000..6eb0abd3 --- /dev/null +++ b/test_code_v2/aws/README.md @@ -0,0 +1,2 @@ + +[Creating ephemeral account and logging in ](aws_helper/SETUP_README.md) diff --git a/test_code_v2/aws/aws_helper/SETUP_README.md b/test_code_v2/aws/aws_helper/SETUP_README.md new file mode 100644 index 00000000..ccda6c15 --- /dev/null +++ b/test_code_v2/aws/aws_helper/SETUP_README.md @@ -0,0 +1,72 @@ +# FOR OBSERVE INTERNAL USERS + +## One Time Setup for Terraform AWS Sample Infrastructure +Clone or download this repository to your local machine + +Observe uses Britive for employees to check out credentials to use against AWS accounts and uses dce to create ephemeral AWS accounts in our Blunderdome Account. + +There are several dependencies you need to setup the first time you use this sample infrastructure. + +### One Time Set Up for MAC +Upgrade bash if you don't have version 5 +``` +brew install bash +``` + +Install pybritive + +``` +pip3 install click pybritive urllib3==1.26.6 + +# if this gives you an error, remove the `urllib==1.26.6` from the command +``` + +Install DCE +``` +# Download the zip file - works on intel chip too +wget https://github.com/Optum/dce-cli/releases/download/v0.5.0/dce_darwin_amd64.zip + +# Unzip to a directory on your path +unzip dce_darwin_amd64.zip -d /usr/local/bin +``` +Initialize DCE +``` +dce init +``` + +Update config file +``` +cat < ~/.dce/config.yaml +api: + host: playground.observe-blunderdome.com + basepath: / + token: +region: us-west-2 +terraform: + bin: null + source: null +EOF +``` + + +## Login +Run script for sample interactive login command +``` +./make_me_env.sh +``` +Will produce command for your local user that looks like: +``` +./make_me_env.sh --principal_id YOU@observeinc.com --email YOU@observeinc.com +``` + +Run that command for interactive login you should see a screen like this (enter your email): + +![Login Screen](./image/LoginScreen.png) + +When you have success screen return to terminal: + +![Login Success Screen](./image/CLI_success.png) + +Your terminal should look like: + +![CLI Success Screen](./image/terminal_success.png) \ No newline at end of file diff --git a/test_code_v2/aws/aws_helper/aws-creds b/test_code_v2/aws/aws_helper/aws-creds new file mode 100755 index 00000000..5725b113 --- /dev/null +++ b/test_code_v2/aws/aws_helper/aws-creds @@ -0,0 +1,283 @@ +#!/usr/bin/env bash +# helper script for managing awscli profiles with pybritive +# https://www.notion.so/observeinc/How-to-Use-Britive-Access-Management-36393b713cbf41ada73a846ddabfea21 + +set -eu +set -o pipefail +OBSERVE_ROOT=$(realpath "$(dirname "$0")"/..) + +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) + + +# shellcheck source=/home/dev/observe/s/functions.sh +# source "$parent_path/functions.sh" + +# format: alias|pybritive profile name +# a pybritive profile can be listed multiple times to have multiple aliases for 'checkout'. +# checking out any of the aliases will checkout creds to all aliases for a given account. +aliases=" +prod-cap1|AWS Cap1 Account/238922581007 (AWS Cap1)/BritiveCap1-FullAWSAdmin +prod|AWS Observe Organization/158067661102 (Observe Prod)/BritiveProd-FullAWSAdmin +prod-ap-1|AWS Observe Organization/368861046847 (observe-prod-ap-1)/BritiveAP1-FullAWSAdmin +sockshop|AWS Observe Organization/384876807807 (sockshop)/BritiveSockshop-FullAWSAdmin +o2|AWS Observe Organization/623960370597 (O2)/BritiveO2-FullAWSAdmin +default|AWS Observe Organization/723346149663 (observe)/BritiveEng-FullAWSAdmin +eng|AWS Observe Organization/723346149663 (observe)/BritiveEng-FullAWSAdmin +thunderdome|AWS Observe Organization/739672403694 (observe-thunderdome)/BritiveThunderdome-FullAWSAdmin +staging|AWS Observe Organization/802757454165 (Observe Staging)/BritiveStaging-FullAWSAdmin +tf-account|AWS Observe Organization/989541196905 (observe-tf-account)/Britivetf-FullAWSAdmin +ops|AWS Observe Organization/677999842303 (observe-ops)/BritiveOps-FullAWSAdmin +marketplace|AWS Observe Organization/608198493184 (observe-marketplace)/BritiveMarketplace-FullAWSAdmin +costbench|AWS Observe Organization/864418771691 (observe-costbench)/BritiveCostbench-FullAWSAdmin +demo|AWS Observe Organization/039787680367 (observe-demo)/BritiveDemo-FullAWSAdmin +blunderdome|AWS Blunderdome Organization/460044344528 (observe-blunderdome)/BritiveBlunderdome-FullAWSAdmin +blunderdome-user|AWS Blunderdome Organization/460044344528 (observe-blunderdome)/BritiveBlunderdome-User +" + +MODES=( + aliases + checkin + checkout + console + list +) + +export BRITIVE_TENANT=observe + +function debug() { + if [[ -v DEBUG && "${DEBUG}" == "true" ]]; then + echo -e "DEBUG - $*" >&2 + fi +} + +# Make sure pybritive is installed, configured for the observe tenant, and logged in. +function britive_setup() { + # virtualenv users do not need help with PATH + if [[ -z "${VIRTUAL_ENV:-}" ]]; then + local py3_user_bin + py3_user_bin="$(python3 -m site --user-base)/bin" + if [[ -d $py3_user_bin ]]; then + export PATH="${py3_user_bin}:${PATH}" + fi + fi + + if ! command -v pybritive >/dev/null; then + echo -n "pybritive is not installed; try running: " >&2 + + if [[ "$(uname -o)" = "Darwin" ]]; then + # OS X default python has some oddity with both the bundled and latest urllib3 version, + # so pin a working one for now. + echo "pip3 install click pybritive urllib3==1.26.6" >&2 + else + # we have to upgrade system pyopenssl because of https://github.com/pyca/pyopenssl/issues/1143 + echo "sudo pip3 install -U pyopenssl && pip3 install -U click pybritive" >&2 + fi + exit 1 + fi + + # Ensure we have a proper tenant configured. We use the alias in $BRITIVE_TENANT to ensure + # what we configure here is what gets used in later commands. + pybritive configure tenant -P -t "${BRITIVE_TENANT}.britive-app.com" -a "${BRITIVE_TENANT}" -f list + + # Ensure we have a valid login session. If we're not logged in (or our previous token has + # expired) pybritive opens a browser, this commands lets the user auth and grabs new tokens. + pybritive login + + # There's a bug where 'pybritive login' exits 0 but we're not actually logged in. Try to catch + # that and run logout/login. + if pybritive ls profiles 2>&1 | grep -q -e 'You have logged out of Britive' -e 'Please login again'; then + pybritive logout || true + pybritive cache clear || true + pybritive login + fi +} + +# translate from alias -> Britive profile +function lookup_alias() { + local alias="$1" + awk -F'|' '$1 == "'"${alias}"'" {print $2; exit;}' <(echo "${aliases}") +} + +# translate from Britive profile -> main awscli profile +# if a profile is listed more than once in $aliases, we only return the first one. +function lookup_profile() { + local profile="$1" + awk -F'|' '$2 == "'"${profile}"'" {print $1; exit;}' <(echo "${aliases}") +} + +# translate from Britive profile -> list of awscli profile aliases +# if a profile is listed more than once in $aliases, we return all of the names excluding the first one. +function lookup_profile_aliases() { + local profile="$1" + awk -F'|' '$2 == "'"${profile}"'" {print $1;}' <(echo "${aliases}") | sed -e 1d +} + +# find the right Britive profile to use given user input. If the input does not +# match an alias (in $aliases), match against all available pybritive profiles. +function find_profile() { + local account="$1" + + # see if we were given an alias + local profile + profile=$(lookup_alias "${account}") + + # if we didn't match an alias, try to match a pybritive profile + if [[ -z $profile ]]; then + debug "No alias match, matching against pybritive profiles" + profile=$(pybritive ls profiles | grep -i -F "${account}" || true) + local match_count + match_count=$(echo "${profile}" | wc -l) + if [[ -z $profile ]]; then + echo "No profiles match ${account}" >&2 + exit 2 + elif [[ $match_count -gt 1 ]]; then + debug "Matching profiles (${match_count}):\n${profile}" + echo "Too many profiles match ${account}" >&2 + exit 2 + fi + fi + + debug "matched input '${account}' to profile '${profile}'" + echo "${profile}" +} + +function mode_aliases() { + echo -e "alias|profile\n${aliases}" | column -t -s"|" +} + +function usage_aliases() { + echo "aws-creds aliases" + echo -e "\t Display Britive profile aliases" +} + +function mode_checkin() { + [[ $# -eq 0 ]] && set -- default + for account; do + pybritive_checkin "$account" + done +} + +function pybritive_checkin() { + local profile + profile=$(find_profile "$1") + pybritive checkin "${profile}" + echo "Checked in profile ${profile}" +} + +function usage_checkin() { + echo "aws-creds checkin profile1 [profile2 ... profileN]" + echo -e "\t Checkin the given profiles. Same arguments as checkout." +} + +function mode_checkout() { + [[ $# -eq 0 ]] && set -- default + for account; do + pybritive_checkout "$account" + done +} + +# copy credentials & default region to another profile (called when we have aliases) +function profile_copy() { + local src="$1" + local dst="$2" + local val + + for var in aws_access_key_id aws_secret_access_key aws_session_token aws_expiration region; do + val=$(aws --profile="${src}" configure get "${var}") + aws --profile="${dst}" configure set "${var}" "${val}" + done +} + +function pybritive_checkout() { + local profile + profile=$(find_profile "$1") + + local awscli_profile awscli_profile_aliases + awscli_profile=$(lookup_profile "${profile}") + + # pybritive "-m integrate" will write credentials directly to ~/.aws/credentials under the alias + # specified by "-a". + pybritive checkout -s -m integrate -a "${awscli_profile}" "${profile}" + + # populate the default region for the new awscli profile + local region + region=$(aws --profile=default configure get region || true) + [[ -n "$region" ]] && aws --profile="${awscli_profile}" configure set region "$region" + + echo "Checked out '${profile}' into awscli profile '${awscli_profile}'" + for profile_alias in $(lookup_profile_aliases "${profile}"); do + profile_copy "${awscli_profile}" "${profile_alias}" + echo "Checked out '${profile}' into awscli profile '${profile_alias}'" + done +} + +function usage_checkout() { + echo "aws-creds checkout profile1 [profile2 ... profileN]" + echo -e "\t Checkout the given profile. profile can be one of:" + echo -e "\t - a predefined alias (run 'aws-creds aliases' to see a list)" + echo -e "\t - anything matching a pybritive profile name (e.g. an account number)" + echo -e "\t If no profile is provided, check out the 'default' alias." +} + +function mode_console() { + local awscli_profile + local profile + + [[ $# -eq 0 ]] && set -- default + profile=$(find_profile "$1") + awscli_profile=$(lookup_profile "${profile}") + + # make sure the profile exists & is not expired + if ! aws --profile="${awscli_profile}" sts get-caller-identity >/dev/null 2>&1; then + mode_checkout "${profile}" + fi + + pybritive aws console -p "${awscli_profile}" +} + +function usage_console() { + echo "aws-creds console profile" + echo -e "\t Load the AWS console for the given profile. profile can be one of:" + echo -e "\t - a predefined alias (run 'aws-creds aliases' to see a list)" + echo -e "\t - anything matching a pybritive profile name (e.g. an account number)" + echo -e "\t If no profile is provided, loads console for the 'default' alias." +} + +function mode_list() { + pybritive ls profiles | grep '^AWS' +} + +function usage_list() { + echo "aws-creds list" + echo -e "\t Lists all available accounts/roles available in Britive" +} + +function usage() { + [[ $# -gt 0 ]] && echo "$@" + echo "aws-creds is a helper script to manage AWS credentails through Britive" + echo "" + echo "aws-creds [options]" + echo "" + for runmode in "${MODES[@]}"; do + usage_"${runmode}" + done + exit 1 +} + +function needle_in_haystack() { + local needle="$1" + shift + for arg in "$@"; do + [[ "${needle}" = "${arg}" ]] && return 0 + done + return 1 +} + +[[ $# == 0 ]] && usage +runmode="$1" +shift +needle_in_haystack "${runmode}" "${MODES[@]}" || usage "unknown mode: ${runmode}" + +britive_setup + +mode_"${runmode}" "$@" diff --git a/test_code_v2/aws/aws_helper/image/CLI_success.png b/test_code_v2/aws/aws_helper/image/CLI_success.png new file mode 100644 index 0000000000000000000000000000000000000000..11c6778742191734f72ceb8fb6032f651d7dd56e GIT binary patch literal 45300 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 literal 0 HcmV?d00001 diff --git a/test_code_v2/aws/aws_helper/image/terminal_success.png b/test_code_v2/aws/aws_helper/image/terminal_success.png new file mode 100644 index 0000000000000000000000000000000000000000..35912da5b612bfed3139f74f4ad3e6f1fcbfb698 GIT binary patch literal 148850 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

M+FqfXxT=rX^1+oMFB9m%GgobM|0xmYmML@ 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 observe_vars.auto.tfvars +name_format = "host-explorer-test-%s" +OBSERVE_ENDPOINT = "https://[123456789].collect.[observe-staging].com" +OBSERVE_CUSTOMER_DOMAIN = = "[123456789].observe-staging.com" +OBSERVE_TOKEN_OTEL = "[gobbly:gook]" +OBSERVE_TOKEN_HOST_MONITORING = "[gobbly:gook]" +OBSERVE_CUSTOMER = "[123456789]" +EOF +``` + +For simplicity I have assumed you have docker desktop installed and therefore can run terraform with the below commands. + +To pull image from DockerHub: +``` +docker pull hashicorp/terraform:1.6 +``` + +[Login to Britive using script](../../aws_helper/SETUP_README.md) + +Look at test_machines local variable in variables.tf file for a list of machines you can create. Comment out as needed. + +To run terraform init - notice the mapping of volumes(-v) and environment variables (-e) +``` +docker run -i -t \ +-v $(pwd)/:/workspace \ +-v $HOME/.aws:/aws_creds \ +-e AWS_SHARED_CREDENTIALS_FILE=/aws_creds/credentials \ +-e AWS_PROFILE=dce -w /workspace \ +-e AWS_REGION=us-west-2 \ +hashicorp/terraform:1.6 \ +init +``` + +To create the ec2 instances within an ephemeral account run the following: +``` +docker run -i -t \ +-v $(pwd)/:/workspace \ +-v $HOME/.aws:/aws_creds \ +-e AWS_SHARED_CREDENTIALS_FILE=/aws_creds/credentials \ +-e AWS_PROFILE=dce -w /workspace \ +-e AWS_REGION=us-west-2 \ +hashicorp/terraform:1.6 \ +apply -auto-approve; +``` + +To see what terraform will do run a plan: +``` +docker run -i -t \ +-v $(pwd)/:/workspace \ +-v $HOME/.aws:/aws_creds \ +-e AWS_SHARED_CREDENTIALS_FILE=/aws_creds/credentials \ +-e AWS_PROFILE=dce -w /workspace \ +-e AWS_REGION=us-west-2 \ +hashicorp/terraform:1.6 \ +plan +``` + +After the create process is completed you should start to see data flowing to your Observe account. + +To delete the ec2 instances within an ephemeral account run the following: +``` +docker run -i -t \ +-v $(pwd)/:/workspace \ +-v $HOME/.aws:/aws_creds \ +-e AWS_SHARED_CREDENTIALS_FILE=/aws_creds/credentials \ +-e AWS_PROFILE=dce -w /workspace \ +-e AWS_REGION=us-west-2 \ +hashicorp/terraform:1.6 \ +destroy -auto-approve +``` + +Destroy and Create + +``` +docker run -i -t \ +-v $(pwd)/:/workspace \ +-v $HOME/.aws:/aws_creds \ +-e AWS_SHARED_CREDENTIALS_FILE=/aws_creds/credentials \ +-e AWS_PROFILE=dce -w /workspace \ +-e AWS_REGION=us-west-2 \ +hashicorp/terraform:1.6 \ +destroy -auto-approve; +docker run -i -t \ +-v $(pwd)/:/workspace \ +-v $HOME/.aws:/aws_creds \ +-e AWS_SHARED_CREDENTIALS_FILE=/aws_creds/credentials \ +-e AWS_PROFILE=dce -w /workspace \ +-e AWS_REGION=us-west-2 \ +hashicorp/terraform:1.6 \ +apply -auto-approve; +``` + +If you have terraform installed locally - and you don't want to use docker - then run +``` +export AWS_PROFILE=dce; export AWS_REGION=us-west-2 before running terraform commands. +``` + +## Other commands you run (replace destroy -auto-approve above ^^^^^^ ) +``` +plan + +output -json | jq -cr '.hosts_aws.value' + +``` + +Terraform will create ephemeral key files for you that you can use to log in to your vm. You should see a list of vms created in outputs when apply is complete that look like this: +``` + "host-explorer-test-otel_0-UBUNTU_20_04_LTS_MKjlCd" = { + "host" = "34.209.148.230" + "instance_id" = "i-063135d0980a0120f" + "machine" = "AWS_UBUNTU_20_04_LTS" + "public_ssh_link" = "ssh -i keypair_module/keys/ephemeral_key ubuntu@34.209.148.230" + "sleep" = 120 + "user" = "ubuntu" + } +``` +If you want to login to your vm for any reason use the public_ssh_link value to ssh to your machine. + +Following assumes you have jq installed: +``` +brew install jq +``` +To get a list of outputs at any time use the following command: +``` +docker run -i -t \ +-v $(pwd)/:/workspace \ +-v $HOME/.aws:/aws_creds \ +-e AWS_SHARED_CREDENTIALS_FILE=/aws_creds/credentials \ +-e AWS_PROFILE=dce -w /workspace \ +-e AWS_REGION=us-west-2 \ +hashicorp/terraform:1.6 \ +output -json | jq -cr '.hosts_aws.value' +``` + + +# References +### Setup Britive +https://www.notion.so/observeinc/How-to-Use-Britive-Access-Management-36393b713cbf41ada73a846ddabfea21?pvs=4#e51bfe23dc8a4dc3a8e51aaeda4ee4fe + + +### create an ephemeral account - you will need dce utility +[Setup dce](https://dce.readthedocs.io/en/latest/howto.html) + +systemctl --type=service --state=running + + +while IFS= read -r line; do + echo "Processing line: $line" + # Perform actions on each line here + tf taint $line +done < <(tf state list | grep linux) \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/02-module/main.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/02-module/main.tf new file mode 100644 index 00000000..a57d362d --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/02-module/main.tf @@ -0,0 +1,58 @@ +variable "OBSERVE_TOKEN_OTEL" { + description = "A datastream token" + nullable = true + default = "TOKEN" + type = string +} + +module "o2" { + source = "../" + OBSERVE_CUSTOMER = "102" + OBSERVE_DOMAIN = "observe-o2.com" + OBSERVE_TOKEN_OTEL = var.OBSERVE_TOKEN_OTEL + CREATE_INTEGRATION = { + host_mon = false, + otel = true, + no_agent = false + } + + debian_machines = { + + UBUNTU_22_04_INSTALLED = { + # ami used in testing + ami_instance_type = "t3.small" + ami_id = "ami-008fe2fc65df48dac" + ami_description = "Canonical, Ubuntu, 22.04 LTS, amd64 jammy image build on 2023-05-16" + default_user = "ubuntu" + sleep = 120 + host_mon_user_data_path = "user_data/aptbased_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/aptbased_otel_repo.sh" + no_agent_user_data_path = "user_data/aptbased_otel_repo_noagentinstall.sh" + } + + UBUNTU_20_04_LTS_INSTALLED = { + # ami used in testing + ami_instance_type = "t3.small" + ami_id = "ami-0892d3c7ee96c0bf7" + ami_description = "Canonical, Ubuntu, 20.04 LTS, amd64 focal image build on 2021-11-29" + default_user = "ubuntu" + sleep = 120 + host_mon_user_data_path = "user_data/aptbased_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/aptbased_otel_repo.sh" + no_agent_user_data_path = "user_data/aptbased_otel_repo_noagentinstall.sh" + } + + UBUNTU_18_04_LTS_INSTALLED = { + ami_instance_type = "t3.small" + ami_id = "ami-0cfa91bdbc3be780c" + ami_description = "Canonical, Ubuntu, 18.04 LTS, amd64 bionic image build on 2022-04-11" + default_user = "ubuntu" + sleep = 120 + host_mon_user_data_path = "user_data/aptbased_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/aptbased_otel_repo.sh" + no_agent_user_data_path = "user_data/aptbased_otel_repo_noagentinstall.sh" + } + + } +} + diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/02-module/versions.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/02-module/versions.tf new file mode 100644 index 00000000..69648545 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/02-module/versions.tf @@ -0,0 +1,16 @@ +# https://www.terraform.io/language/expressions/version-constraints +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 4.11" + } + + random = { + source = "hashicorp/random" + version = ">= 3.4.3" + } + } + required_version = ">= 1.2" +} + diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/data.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/data.tf new file mode 100644 index 00000000..7b31ba77 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/data.tf @@ -0,0 +1,12 @@ +# The Canonical User ID data source allows access to the canonical user ID for the effective account in which Terraform is working. +# tflint-ignore: terraform_unused_declarations +data "aws_canonical_user_id" "current_user" { +} + + +# # # rando value for filtering output and validating results +# resource "random_string" "output" { +# for_each = var.AWS_MACHINE_CONFIGS +# length = 6 +# special = false +# } diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/main.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/main.tf new file mode 100644 index 00000000..666e7f45 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/main.tf @@ -0,0 +1,41 @@ +locals { + # machine_loop = { for key, value in var.AWS_MACHINE_CONFIGS : key => value if key == var.AWS_MACHINE_FILTER || var.AWS_MACHINE_FILTER == true } + + # compute_instances = { for key, value in var.AWS_MACHINE_CONFIGS } + # : + # key => value if contains(var.AWS_MACHINE_FILTER, key) || length(var.AWS_MACHINE_FILTER) == 0 } + +} + + +# EC2 instance for linux host +resource "aws_instance" "linux_host_integration" { + # for_each = var.AWS_MACHINE_CONFIGS + + ami = var.AWS_MACHINE_CONFIGS.ami_id + instance_type = var.AWS_MACHINE_CONFIGS.ami_instance_type + + associate_public_ip_address = true + + subnet_id = var.subnet_public_id + + vpc_security_group_ids = [var.aws_security_group_public_id] + key_name = var.aws_key_pair_name + + user_data = var.USERDATA + get_password_data = can(regex("WINDOWS", var.name)) ? true : false + + root_block_device { + volume_size = 100 + } + + tags = merge( + var.BASE_TAGS, + { + Name = var.name + # OS_KEY = each.key + }, + ) +} + + diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/outputs.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/outputs.tf new file mode 100644 index 00000000..9043b784 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/outputs.tf @@ -0,0 +1,18 @@ +output "instance" { + value = { + # tflint-ignore: terraform_deprecated_interpolation + "${aws_instance.linux_host_integration.tags["Name"]}" = { + "host" = aws_instance.linux_host_integration.public_ip + "instance_id" = aws_instance.linux_host_integration.id + "user" = var.AWS_MACHINE_CONFIGS.default_user + "public_ssh_link" = "ssh -i ${var.PRIVATE_KEY_PATH} ${var.AWS_MACHINE_CONFIGS.default_user}@${aws_instance.linux_host_integration.public_ip}" + # "sleep" : var.AWS_MACHINE_CONFIGS[key].sleep + "private_ip" = aws_instance.linux_host_integration.private_ip + "password_data" : aws_instance.linux_host_integration.password_data + "password_decrypted" : aws_instance.linux_host_integration.password_data == "" ? null : rsadecrypt(aws_instance.linux_host_integration.password_data, file(var.PRIVATE_KEY_PATH)) + } + } +} +# output "instance" { +# value = aws_instance.linux_host_integration +# } diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/variables.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/variables.tf new file mode 100644 index 00000000..26d0b1b7 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/ec2_module/variables.tf @@ -0,0 +1,210 @@ +# your local key path (assumes it exists) - this will allow you to access ec2 instances +# tflint-ignore: terraform_naming_convention,terraform_unused_declarations +variable "PUBLIC_KEY_PATH" { + description = "Public key path" + nullable = true + default = null + type = string +} + +# tflint-ignore: terraform_naming_convention,terraform_unused_declarations +variable "PRIVATE_KEY_PATH" { + description = "Private key path" + nullable = true + default = null + type = string +} + +# where to deploy +# tflint-ignore: terraform_naming_convention +# variable "REGION" { +# default = "us-west-2" +# description = "Where resources will be deployed" +# type = string +# } + +# appended to resource names so you can find your stuff +variable "name" { + description = "name" + type = string +} + +# tflint-ignore: terraform_naming_convention +variable "BASE_TAGS" { + description = "base resource tags" + type = map(string) + default = { + owner = "Observe" + createdBy = "terraform" + team = "content" + purpose = "test auto configuration script" + git_repo_url = "https://github.com/observeinc/linux-host-configuration-scripts" + } +} + +# tflint-ignore: terraform_naming_convention +# variable "USE_BRANCH_NAME" { +# default = "main" +# description = "git repository branch to use" +# type = string +# } + +# tflint-ignore: terraform_naming_convention +# variable "CI" { +# type = bool +# default = false +# description = "This variable is set to true by github actions to tell us we are running in ci" +# } + +# # tflint-ignore: terraform_naming_convention +# variable "PUBLIC_KEY" { +# description = "This value comes from a variable in github actions" +# nullable = true +# default = null +# type = string +# } + +# tflint-ignore: terraform_naming_convention +variable "AWS_MACHINE_CONFIGS" { + type = map(any) + description = "variables for supported OS" + default = { + + # UBUNTU_22_04_LTS = { + # # ami used in testing + # ami_instance_type = "t3.small" + # ami_id = " /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +EOT +# nginx error +tee /home/ubuntu/templates/nginx_error.template > /dev/null << EOT +[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%% +EOT +# apache access +tee /home/ubuntu/templates/apache_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET %%{randomitem(/cgi-bin/try/, ,/hidden/)}%% HTTP/1.0" %%{randomitem(200,400,401,403,404,405,500,502,503)}%% 3395 +EOT +# apache error +tee /home/ubuntu/templates/apache_error.template > /dev/null << EOT +[%%{utcnow()}%%] [error] [client 1.2.3.4] %%{randomitem(Directory index forbidden by rule: /home/test/,Directory index forbidden by rule: /apache/web-data/test2,Client sent malformed Host header,user test: authentication failure for "/~dcid/test1": Password Mismatch)}%% +EOT + +# create script to generate logs using templates +tee /home/ubuntu/genlogs.sh > /dev/null << EOT +#!/bin/bash +/usr/local/bin/lignator -t /home/ubuntu/templates --token-opening "%%{" --token-closing "}%%" -l 50 -o /var/log/ +EOT + +sudo chmod +x /home/ubuntu/genlogs.sh + +# create cron jobs to generate logs and system stress +(crontab -l 2>/dev/null; echo "* * * * * /home/ubuntu/genlogs.sh >> /var/log/cron_gen.log 2>&1") | crontab - +(crontab -l 2>/dev/null; echo "*/2 * * * * /usr/bin/stress-ng --matrix 0 -t 1m >> /var/log/cron_stress.log 2>&1") | crontab - + +${SCRIPT} +# Get the current timestamp +timestamp_date=$(date +"%Y-%m-%d %H:%M:%S") +timestamp_timedatectl=$(timedatectl status) + +# Specify the filename +filename="/tmp/hostmon_install_complete.log" + +# Write the timestamp to the file +echo "$timestamp_date" > "$filename" +echo "$timestamp_timedatectl" >> "$filename" + +input="${OBSERVE_ENDPOINT}" + +# Remove "https://" from the input string +OBSERVE_ENVIRONMENT="$${input#https://}" + +sudo curl -o "/etc/fluent-bit/observe-monitoring-all-platforms.conf" "https://raw.githubusercontent.com/observeinc/linux-host-configuration-scripts/${BRANCH}/other_configs/fluent_monitoring/observe-monitoring-all-platforms.conf" +sudo curl -o "/etc/fluent-bit/observe-monitoring-linux-only.conf" "https://raw.githubusercontent.com/observeinc/linux-host-configuration-scripts/${BRANCH}/other_configs/fluent_monitoring/observe-monitoring-linux-only.conf" + +sudo sed -i "s/REPLACE_WITH_CUSTOMER_INGEST_TOKEN/${OBSERVE_TOKEN}/g" /etc/fluent-bit/* + +sudo sed -i "s/REPLACE_WITH_OBSERVE_ENVIRONMENT/$${OBSERVE_ENVIRONMENT}/g" /etc/fluent-bit/* + +sudo sed -i "s/http_server Off/http_server On/g" /etc/fluent-bit/fluent-bit.conf + +# create script to generate logs using templates +sudo tee /etc/fluent-bit/observe-timestamp.conf > /dev/null << EOT +[FILTER] + Name record_modifier + Match * +# if you want to group your servers into an application group +# [e.g. Proxy nodes] so you have have custom alert levels for them +# uncomment this next line + #REPLACE_WITH_OBSERVE_APP_GROUP_OPTION + Record host $${HOSTNAME} + Record datacenter hostmon_test + Record obs_ver 20230412 + Remove_key _MACHINE_ID +[INPUT] + name tail + tag tail_hostmon_install_complete + Path_Key path + path /tmp/hostmon_install_complete.log + Read_from_Head true +[OUTPUT] + name http + match tail_hostmon_install_complete + host ${trimprefix("${OBSERVE_ENDPOINT}", "https://")} + port 443 + URI /v1/http/fluentbit/hostmon_install_complete + Format msgpack + Header X-Observe-Decoder fluent + Header Authorization Bearer ${OBSERVE_TOKEN} + Compress gzip + tls on +EOT + +sudo service fluent-bit restart \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel.sh b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel.sh new file mode 100644 index 00000000..6758e2d2 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel.sh @@ -0,0 +1,277 @@ +#!/bin/bash + +################################ +# WARNING USING THIS AS TEMPLATE FILE FOR TERRAFORM +# Percent signs are doubled to escape them +################################ +apt-get update -y + +apt-get install wget curl sed nano uuid-runtime ca-certificates apt-utils stress-ng cron ca-certificates -y + +# need to add a line for high precision timestamp +# make syslog use precise timestamp +sudo sed -i "s/\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/#\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/g" /etc/rsyslog.conf +sudo systemctl restart syslog + +# install otel collector +wget "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.88.0/otelcol-contrib_0.88.0_linux_amd64.deb" +dpkg -i otelcol-contrib_0.88.0_linux_amd64.deb + +# create otel config +cp /etc/otelcol-contrib/config.yaml /etc/otelcol-contrib/config.OLD +rm /etc/otelcol-contrib/config.yaml + +# # add collector user to syslog group +sudo usermod -a -G syslog otelcol-contrib + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs + +wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb +sudo dpkg -i packages-microsoft-prod.deb +rm packages-microsoft-prod.deb + +sudo apt-get update +sudo apt-get install -y dotnet-sdk-7.0 + + +wget https://github.com/microsoft/lignator/archive/v0.8.0.tar.gz \ +&& tar xvzf v0.8.0.tar.gz \ +&& cd ./lignator-0.8.0/src \ +&& sudo dotnet publish -r linux-x64 -c Release -o /usr/local/bin/ -p:PublishSingleFile=true --self-contained true -p:InformationalVersion=0.8.0 \ +&& lignator --version + +sudo su ubuntu + +mkdir /home/ubuntu/templates + +# create lignator templates +# nginx access +tee /home/ubuntu/templates/nginx_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +EOT +# nginx error +tee /home/ubuntu/templates/nginx_error.template > /dev/null << EOT +[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%% +EOT +# apache access +tee /home/ubuntu/templates/apache_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET %%{randomitem(/cgi-bin/try/, ,/hidden/)}%% HTTP/1.0" %%{randomitem(200,400,401,403,404,405,500,502,503)}%% 3395 +EOT +# apache error +tee /home/ubuntu/templates/apache_error.template > /dev/null << EOT +[%%{utcnow()}%%] [error] [client 1.2.3.4] %%{randomitem(Directory index forbidden by rule: /home/test/,Directory index forbidden by rule: /apache/web-data/test2,Client sent malformed Host header,user test: authentication failure for "/~dcid/test1": Password Mismatch)}%% +EOT + +# create script to generate logs using templates +tee /home/ubuntu/genlogs.sh > /dev/null << EOT +#!/bin/bash +/usr/local/bin/lignator -t /home/ubuntu/templates --token-opening "%%{" --token-closing "}%%" -l 50 -o /home/ubuntu/logs +EOT + +sudo chmod +x /home/ubuntu/genlogs.sh + +# create cron jobs to generate logs and system stress +(crontab -l 2>/dev/null; echo "* * * * * /home/ubuntu/genlogs.sh >> /home/ubuntu/cron_gen.log 2>&1") | crontab - +(crontab -l 2>/dev/null; echo "*/2 * * * * /usr/bin/stress-ng --matrix 0 -t 1m >> /home/ubuntu/cron_stress.log 2>&1") | crontab - + +tee /etc/otelcol-contrib/config.yaml > /dev/null << EOT +exporters: + logging: + loglevel: + otlphttp: + endpoint: "${OBSERVE_ENDPOINT}/v1/otel" + headers: + authorization: "Bearer ${OBSERVE_TOKEN}" +processors: + batch: + resource: + attributes: + - key: OBSERVE_GUID + value: $${HOSTNAME} + action: upsert + resourcedetection: + detectors: [env, ec2, eks, system] + system: + hostname_sources: ["lookup", "cname", "dns", "os"] +receivers: + filestats: + include: /var/log/dpkg.log + collection_interval: 5m + initial_delay: 1s + + filelog/base: + include: [/var/log/*.log, /root/*.log, /root/logs/*.log] + include_file_path: true + #start_at: beginning + operators: + #- type: regex_parser + #regex: (?P\w+ \d+ \d+:\d+:\d+) + - type: filter + expr: 'body matches "otel-contrib"' + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver + hostmetrics: + root_path: / + collection_interval: 60s + scrapers: + cpu: + metrics: + # Default + system.cpu.time: + enabled: "${DEFAULT_METRICS_ENABLED}" + # Optional + # system.cpu.frequency: + # enabled: "${OPTIONAL_METRICS_ENABLED}" + system.cpu.logical.count: + enabled: "${OPTIONAL_METRICS_ENABLED}" + system.cpu.physical.count: + enabled: "${OPTIONAL_METRICS_ENABLED}" + system.cpu.utilization: + enabled: "${OPTIONAL_METRICS_ENABLED}" + disk: + metrics: + # Default + system.disk.io: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.disk.io_time: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.disk.merged: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.disk.operation_time: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.disk.operations: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.disk.pending_operations: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.disk.weighted_io_time: + enabled: "${DEFAULT_METRICS_ENABLED}" + load: + metrics: + # Default + system.cpu.load_average.15m: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.cpu.load_average.1m: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.cpu.load_average.5m: + enabled: "${DEFAULT_METRICS_ENABLED}" + # Config - divide by cpus + cpu_average: true + filesystem: + metrics: + # Default + system.filesystem.inodes.usage: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.filesystem.usage: + enabled: "${DEFAULT_METRICS_ENABLED}" + # Optional + system.filesystem.utilization: + enabled: "${OPTIONAL_METRICS_ENABLED}" + memory: + metrics: + # Default + system.memory.usage: + enabled: "${DEFAULT_METRICS_ENABLED}" + # Optional + system.memory.utilization: + enabled: "${OPTIONAL_METRICS_ENABLED}" + network: + metrics: + # Default + system.network.connections: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.network.dropped: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.network.errors: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.network.io: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.network.packets: + enabled: "${DEFAULT_METRICS_ENABLED}" + # Optional + system.network.conntrack.count: + enabled: "${OPTIONAL_METRICS_ENABLED}" + system.network.conntrack.max: + enabled: "${OPTIONAL_METRICS_ENABLED}" + paging: + metrics: + # Default + system.paging.faults: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.paging.operations: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.paging.usage: + enabled: "${DEFAULT_METRICS_ENABLED}" + # Optional + system.paging.utilization: + enabled: "${OPTIONAL_METRICS_ENABLED}" + processes: + metrics: + # Default + system.processes.count: + enabled: "${DEFAULT_METRICS_ENABLED}" + system.processes.created: + enabled: "${DEFAULT_METRICS_ENABLED}" + process: + metrics: + # Default + process.cpu.time: + enabled: "${PROCESS_DEFAULT_METRICS_ENABLED}" + process.disk.io: + enabled: "${PROCESS_DEFAULT_METRICS_ENABLED}" + process.memory.usage: + enabled: "${PROCESS_DEFAULT_METRICS_ENABLED}" + process.memory.virtual: + enabled: "${PROCESS_DEFAULT_METRICS_ENABLED}" + # Optional + process.context_switches: + enabled: "${PROCESS_OPTIONAL_METRICS_ENABLED}" + process.cpu.utilization: + enabled: "${PROCESS_OPTIONAL_METRICS_ENABLED}" + process.disk.operations: + enabled: "${PROCESS_OPTIONAL_METRICS_ENABLED}" + process.handles: + enabled: "${PROCESS_OPTIONAL_METRICS_ENABLED}" + process.open_file_descriptors: + enabled: "${PROCESS_OPTIONAL_METRICS_ENABLED}" + process.paging.faults: + enabled: "${PROCESS_OPTIONAL_METRICS_ENABLED}" + process.signals_pending: + enabled: "${PROCESS_OPTIONAL_METRICS_ENABLED}" + process.threads: + enabled: "${PROCESS_OPTIONAL_METRICS_ENABLED}" + otlp: + protocols: + grpc: + include_metadata: true + http: + include_metadata: true +service: + pipelines: + traces: + receivers: [otlp] + processors: [resource, batch] + exporters: [otlphttp, logging] + logs/base: + receivers: [filelog/base] + processors: [resource,batch] + exporters: [otlphttp] + metrics/two: + receivers: [filestats] + processors: [resource,resourcedetection,batch] + exporters: [otlphttp] + metrics: + receivers: [hostmetrics, otlp] + processors: [resource] + exporters: [logging, otlphttp] +EOT + +sudo service otelcol-contrib restart \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel_repo.sh b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel_repo.sh new file mode 100644 index 00000000..074081c1 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel_repo.sh @@ -0,0 +1,117 @@ +#!/bin/bash + +################################ +# WARNING USING THIS AS TEMPLATE FILE FOR TERRAFORM +# Percent signs are doubled to escape them +################################ +sudo apt-get update -y + +sudo apt-get install wget curl sed nano uuid-runtime ca-certificates apt-utils stress-ng cron acl ca-certificates -y + +# need to add a line for high precision timestamp +# make syslog use precise timestamp +sudo sed -i "s/\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/#\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/g" /etc/rsyslog.conf +sudo systemctl restart syslog + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +# identify OS and architecture +OS=$(lsb_release -is | tr '[:upper:]' '[:lower:]') +VERSION=$(lsb_release -rs | tr '[:upper:]' '[:lower:]') +lsb_release -rs +CODENAME=$(lsb_release -cs) + +SYS_ARCH=$(uname -m) +if [[ $SYS_ARCH = "aarch64" ]]; then + ARCH="arm64" +else + ARCH="amd64" +fi + +if [[ $VERSION == "22.04" ]]; then + # download package with wget + wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb + + # install package locally + sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb +fi + +wget https://packages.microsoft.com/config/ubuntu/"$${VERSION}"/packages-microsoft-prod.deb -O packages-microsoft-prod.deb +sudo dpkg -i packages-microsoft-prod.deb +rm packages-microsoft-prod.deb + +sudo apt-get update +sudo apt-get install -y dotnet-sdk-8.0 + + +wget https://github.com/microsoft/lignator/archive/v0.8.0.tar.gz \ +&& tar xvzf v0.8.0.tar.gz \ +&& cd ./lignator-0.8.0/src \ +&& sudo dotnet publish -r linux-x64 -c Release -o /usr/local/bin/ -p:PublishSingleFile=true --self-contained true -p:InformationalVersion=0.8.0 \ +&& lignator --version + +sudo setfacl -Rm u:ubuntu:rwX /var/log + +sudo su ubuntu + +mkdir /home/ubuntu/templates + +# create lignator templates +# nginx access +tee /home/ubuntu/templates/nginx_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +EOT +# nginx error +tee /home/ubuntu/templates/nginx_error.template > /dev/null << EOT +[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%% +EOT +# apache access +tee /home/ubuntu/templates/apache_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET %%{randomitem(/cgi-bin/try/, ,/hidden/)}%% HTTP/1.0" %%{randomitem(200,400,401,403,404,405,500,502,503)}%% 3395 +EOT +# apache error +tee /home/ubuntu/templates/apache_error.template > /dev/null << EOT +[%%{utcnow()}%%] [error] [client 1.2.3.4] %%{randomitem(Directory index forbidden by rule: /home/test/,Directory index forbidden by rule: /apache/web-data/test2,Client sent malformed Host header,user test: authentication failure for "/~dcid/test1": Password Mismatch)}%% +EOT + +# create script to generate logs using templates +tee /home/ubuntu/genlogs.sh > /dev/null << EOT +#!/bin/bash +/usr/local/bin/lignator -t /home/ubuntu/templates --token-opening "%%{" --token-closing "}%%" -l 50 -o /var/log/ +EOT + +sudo chmod +x /home/ubuntu/genlogs.sh + +# create cron jobs to generate logs and system stress +(crontab -l 2>/dev/null; echo "* * * * * /home/ubuntu/genlogs.sh >> /var/log/cron_gen.log 2>&1") | crontab - +(crontab -l 2>/dev/null; echo "*/2 * * * * /usr/bin/stress-ng --matrix 0 -t 1m >> /var/log/cron_stress.log 2>&1") | crontab - + +${SCRIPT} + +sudo setcap 'cap_dac_read_search=ep' "/usr/bin/otelcol-contrib" + +# echo -e "Setting the CAP_DAC_READ_SEARCH Linux capability on the collector binary to allow it to read host metrics from /proc directory: setcap 'cap_dac_read_search=ep' \""/usr/bin/otelcol-contrib"\"" +# echo -e "You can remove it with the following command: sudo setcap -r \"/usr/bin/otelcol-contrib"\"" +# echo -e "Without this capability, the collector will not be able to collect some of the host metrics." +# setcap 'cap_dac_read_search=ep' "/usr/bin/otelcol-contrib" + + +# Get the current timestamp +timestamp_date=$(date +"%Y-%m-%d %H:%M:%S") +timestamp_timedatectl=$(timedatectl status) + +# Specify the filename +filename="/tmp/quickstart_install_complete.log" + +# Write the timestamp to the file +echo "$timestamp_date" > "$filename" +echo "$timestamp_timedatectl" >> "$filename" \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel_repo_noagentinstall.sh b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel_repo_noagentinstall.sh new file mode 100644 index 00000000..8a164f28 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/aptbased_otel_repo_noagentinstall.sh @@ -0,0 +1,102 @@ +#!/bin/bash + +################################ +# WARNING USING THIS AS TEMPLATE FILE FOR TERRAFORM +# Percent signs are doubled to escape them +################################ +sudo apt-get update -y + +sudo apt-get install wget curl sed nano uuid-runtime ca-certificates apt-utils stress-ng cron acl ca-certificates -y + +sudo apt-get install gnupg2 -y +sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 97A80C63C9D8B80B +sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 9F9DDC083888C1CD + +# need to add a line for high precision timestamp +# make syslog use precise timestamp +sudo sed -i "s/\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/#\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/g" /etc/rsyslog.conf +sudo systemctl restart syslog + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +# identify OS and architecture +OS=$(lsb_release -is | tr '[:upper:]' '[:lower:]') +VERSION=$(lsb_release -rs | tr '[:upper:]' '[:lower:]') +lsb_release -rs +CODENAME=$(lsb_release -cs) + +SYS_ARCH=$(uname -m) +if [[ $SYS_ARCH = "aarch64" ]]; then + ARCH="arm64" +else + ARCH="amd64" +fi + +if [[ $VERSION == "22.04" ]]; then + # download package with wget + wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb + + # install package locally + sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb +fi + +wget https://packages.microsoft.com/config/ubuntu/"$${VERSION}"/packages-microsoft-prod.deb -O packages-microsoft-prod.deb +sudo dpkg -i packages-microsoft-prod.deb +rm packages-microsoft-prod.deb + +sudo apt-get update +sudo apt-get install -y dotnet-sdk-8.0 + + +wget https://github.com/microsoft/lignator/archive/v0.8.0.tar.gz \ +&& tar xvzf v0.8.0.tar.gz \ +&& cd ./lignator-0.8.0/src \ +&& sudo dotnet publish -r linux-x64 -c Release -o /usr/local/bin/ -p:PublishSingleFile=true --self-contained true -p:InformationalVersion=0.8.0 \ +&& lignator --version + +sudo setfacl -Rm u:ubuntu:rwX /var/log + +sudo su ubuntu + +mkdir /home/ubuntu/templates + +# create lignator templates +# nginx access +tee /home/ubuntu/templates/nginx_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +EOT +# nginx error +tee /home/ubuntu/templates/nginx_error.template > /dev/null << EOT +[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%% +EOT +# apache access +tee /home/ubuntu/templates/apache_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET %%{randomitem(/cgi-bin/try/, ,/hidden/)}%% HTTP/1.0" %%{randomitem(200,400,401,403,404,405,500,502,503)}%% 3395 +EOT +# apache error +tee /home/ubuntu/templates/apache_error.template > /dev/null << EOT +[%%{utcnow()}%%] [error] [client 1.2.3.4] %%{randomitem(Directory index forbidden by rule: /home/test/,Directory index forbidden by rule: /apache/web-data/test2,Client sent malformed Host header,user test: authentication failure for "/~dcid/test1": Password Mismatch)}%% +EOT + +# create script to generate logs using templates +tee /home/ubuntu/genlogs.sh > /dev/null << EOT +#!/bin/bash +/usr/local/bin/lignator -t /home/ubuntu/templates --token-opening "%%{" --token-closing "}%%" -l 50 -o /var/log/ +EOT + +sudo chmod +x /home/ubuntu/genlogs.sh + +# create cron jobs to generate logs and system stress +(crontab -l 2>/dev/null; echo "* * * * * /home/ubuntu/genlogs.sh >> /var/log/cron_gen.log 2>&1") | crontab - +(crontab -l 2>/dev/null; echo "*/2 * * * * /usr/bin/stress-ng --matrix 0 -t 1m >> /var/log/cron_stress.log 2>&1") | crontab - + +# curl https://raw.githubusercontent.com/observeinc/host-config-scripts/main/opentelemetry/linux/observe_otel_install.sh | bash -s -- --observe_collection_endpoint ${OBSERVE_ENDPOINT} --observe_token ${OBSERVE_TOKEN} diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/garbage/aptbased_fluent.sh b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/garbage/aptbased_fluent.sh new file mode 100644 index 00000000..1ad90fc0 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/garbage/aptbased_fluent.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +################################ +# WARNING USING THIS AS TEMPLATE FILE FOR TERRAFORM +# Percent signs are doubled to escape them +################################ +apt-get update -y + +apt-get install wget curl sed nano uuid-runtime ca-certificates apt-utils stress-ng cron ca-certificates -y + +# need to add a line for high precision timestamp +# make syslog use precise timestamp +sudo sed -i "s/\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/#\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/g" /etc/rsyslog.conf +sudo systemctl restart syslog + +# # add collector user to syslog group +# sudo usermod -a -G syslog otelcol-contrib + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs + +wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb +sudo dpkg -i packages-microsoft-prod.deb +rm packages-microsoft-prod.deb + +sudo apt-get update +sudo apt-get install -y dotnet-sdk-7.0 + + +wget https://github.com/microsoft/lignator/archive/v0.8.0.tar.gz \ +&& tar xvzf v0.8.0.tar.gz \ +&& cd ./lignator-0.8.0/src \ +&& sudo dotnet publish -r linux-x64 -c Release -o /usr/local/bin/ -p:PublishSingleFile=true --self-contained true -p:InformationalVersion=0.8.0 \ +&& lignator --version + +sudo su ubuntu + +mkdir /home/ubuntu/templates + +# create lignator templates +# nginx access +tee /home/ubuntu/templates/nginx_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +EOT +# nginx error +tee /home/ubuntu/templates/nginx_error.template > /dev/null << EOT +[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%% +EOT +# apache access +tee /home/ubuntu/templates/apache_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET %%{randomitem(/cgi-bin/try/, ,/hidden/)}%% HTTP/1.0" %%{randomitem(200,400,401,403,404,405,500,502,503)}%% 3395 +EOT +# apache error +tee /home/ubuntu/templates/apache_error.template > /dev/null << EOT +[%%{utcnow()}%%] [error] [client 1.2.3.4] %%{randomitem(Directory index forbidden by rule: /home/test/,Directory index forbidden by rule: /apache/web-data/test2,Client sent malformed Host header,user test: authentication failure for "/~dcid/test1": Password Mismatch)}%% +EOT + +# create script to generate logs using templates +tee /home/ubuntu/genlogs.sh > /dev/null << EOT +#!/bin/bash +/usr/local/bin/lignator -t /home/ubuntu/templates --token-opening "%%{" --token-closing "}%%" -l 50 -o /home/ubuntu/logs +EOT + +sudo chmod +x /home/ubuntu/genlogs.sh + +# create cron jobs to generate logs and system stress +(crontab -l 2>/dev/null; echo "* * * * * /home/ubuntu/genlogs.sh >> /home/ubuntu/cron_gen.log 2>&1") | crontab - +(crontab -l 2>/dev/null; echo "*/2 * * * * /usr/bin/stress-ng --matrix 0 -t 1m >> /home/ubuntu/cron_stress.log 2>&1") | crontab - + +sudo tee /etc/default/fluent-bit > /dev/null << EOT +OBSERVE_HOST=${OBSERVE_ENDPOINT} +OBSERVE_TOKEN=${OBSERVE_TOKEN} +EOT + +curl https://raw.githubusercontent.com/yasar-observe/host-configuration-scripts/yasar/init/fluent-bit/linux/observe_fluent_install.sh | bash -s -- --observe_host "${OBSERVE_ENDPOINT}" --observe_token "${OBSERVE_TOKEN}" \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/garbage/aptbased_telegraf.sh b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/garbage/aptbased_telegraf.sh new file mode 100644 index 00000000..505513c4 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/garbage/aptbased_telegraf.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +################################ +# WARNING USING THIS AS TEMPLATE FILE FOR TERRAFORM +# Percent signs are doubled to escape them +################################ +apt-get update -y + +apt-get install wget curl sed nano uuid-runtime ca-certificates apt-utils stress-ng cron ca-certificates -y + +# need to add a line for high precision timestamp +# make syslog use precise timestamp +sudo sed -i "s/\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/#\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat/g" /etc/rsyslog.conf +sudo systemctl restart syslog + +# # add collector user to syslog group +# sudo usermod -a -G syslog otelcol-contrib + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs + +# install lignator log generator +# https://github.com/microsoft/lignator +# sample commands +## lignator -t "timestamp: %%{utcnow()}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs +## lignator -t "[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%%" --token-opening "%%{" --token-closing "}%%" -o /home/ubuntu/testlogs + +wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb +sudo dpkg -i packages-microsoft-prod.deb +rm packages-microsoft-prod.deb + +sudo apt-get update +sudo apt-get install -y dotnet-sdk-7.0 + + +wget https://github.com/microsoft/lignator/archive/v0.8.0.tar.gz \ +&& tar xvzf v0.8.0.tar.gz \ +&& cd ./lignator-0.8.0/src \ +&& sudo dotnet publish -r linux-x64 -c Release -o /usr/local/bin/ -p:PublishSingleFile=true --self-contained true -p:InformationalVersion=0.8.0 \ +&& lignator --version + +sudo su ubuntu + +mkdir /home/ubuntu/templates + +# create lignator templates +# nginx access +tee /home/ubuntu/templates/nginx_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36" +EOT +# nginx error +tee /home/ubuntu/templates/nginx_error.template > /dev/null << EOT +[%%{utcnow()}%%] - [%%{randomitem(INFO ,WARN ,ERROR)}%%] - I am a log for request with id: %%{uuid}%% +EOT +# apache access +tee /home/ubuntu/templates/apache_access.template > /dev/null << EOT +192.168.%%{randombetween(0, 99)}%%.%%{randombetween(0, 99)}%% - - [%%{utcnow()}%%] "GET %%{randomitem(/cgi-bin/try/, ,/hidden/)}%% HTTP/1.0" %%{randomitem(200,400,401,403,404,405,500,502,503)}%% 3395 +EOT +# apache error +tee /home/ubuntu/templates/apache_error.template > /dev/null << EOT +[%%{utcnow()}%%] [error] [client 1.2.3.4] %%{randomitem(Directory index forbidden by rule: /home/test/,Directory index forbidden by rule: /apache/web-data/test2,Client sent malformed Host header,user test: authentication failure for "/~dcid/test1": Password Mismatch)}%% +EOT + +# create script to generate logs using templates +tee /home/ubuntu/genlogs.sh > /dev/null << EOT +#!/bin/bash +/usr/local/bin/lignator -t /home/ubuntu/templates --token-opening "%%{" --token-closing "}%%" -l 50 -o /home/ubuntu/logs +EOT + +sudo chmod +x /home/ubuntu/genlogs.sh + +# create cron jobs to generate logs and system stress +(crontab -l 2>/dev/null; echo "* * * * * /home/ubuntu/genlogs.sh >> /home/ubuntu/cron_gen.log 2>&1") | crontab - +(crontab -l 2>/dev/null; echo "*/2 * * * * /usr/bin/stress-ng --matrix 0 -t 1m >> /home/ubuntu/cron_stress.log 2>&1") | crontab - + +curl https://raw.githubusercontent.com/yasar-observe/host-configuration-scripts/yasar/init/telegraf/linux/observe_telegraf_install.sh | bash -s -- --observe_host ${OBSERVE_ENDPOINT} --observe_token ${OBSERVE_TOKEN} \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows.ps b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows.ps new file mode 100644 index 0000000000000000000000000000000000000000..a73a501ef0f6bff8c98264d11f7f60ef6c9d70cf GIT binary patch literal 6069 zcmeHLS#R4$5Ps*c7_bIx1768?ineeLRPm7*jbp)7Y7|i(*3?SchT^i^rDXN^@BL=E z)a5p|TeN6_=tbZjGqW?_oX-j~Q>7iNEPD}sL8rGWt(+q5Xr|qmRHmlVsR0$LoM>yc z$t{kZD4UkLaQHkTeD}uMQoTevw@zjm$;z3DbUMYyoZMKEDO4`39n(-rSCxunJ|LCL zn~WJopc6h^W)E72G&Cg*%q-809N6gnTjg4bDyKSCU88e%A#*uW<%grA1VWeE&AX*> zCN&v7r*L|Gy*Douj`u+RklCdr1kw4(OXdYL*+7+Eu7fL@_n zlXoRxw7A=6tt`LR`1RQ&C0?gX0FI5{zya8?wc#VH+%0uGz1I|PseF1=fc(?DYHnoh zuXDh2CU>|rfMtj_Y?fZpQn!jk?HBwUlj(F$FXx4{mW0<#Ai&TbvuPW8V z!1AfdbCt4kZ1h&m1b}^pH_zZGR~0lZ-pUC?0X1k++ai;5zp@=3L+k~B=?)*+-G+4D zhX&LuE8IQ-El-`!^BYsa$Hc-hddFQ7oqD&EWoAa=je&=DP3h#K%W{02yGn{bX)I z^T}beu=J7s^q{rhUkbqX2GxeWmp^eOM+tFe%2Y-Ev3~}LB!$?7+o|&S;2Td#t6SRH zVOw9`{0QSvEl-O>8eIA~(+DZMt&z4zZA||3>fdtwzbQm6IYH#)=rt50 zHsW2ToMSbpX_NH2G!OWKz!!jt&VVp->XwnohQRvi6bd5_%K-#^4k?#j7WIf$-27KbNz z9CB05&u3&LWl3pek%$40g<{B)_1g2~XjtNa1T2D#*$145EsfnXweJ{LA z-D>OXo==w8&ka=U6RJ<nB={a)Z2(+LkvTbildWYw6Sz+X*_`-QA^M zBGw$Eu{q44s@Bv(Wum@K;a>C`i+qhzpiZwF?~MG;Bj_Qr1_LZCfmquZV8s^VBIv#` zLbUzu--mwyRzT`MjIAdd*a}?l#nr6#qtBSi9pHICM*ka_^3n1iM%0%Zi1Iw|#gpPV z{uxdGD>SVFsgR|d?D*jQ-uiU?Aw=iB^~I3(!YcZ?4^5EWIJii88|xw8MW}#2=c&J% zr#MkTeMzBGJ*?YwZmGB^=Zv4LSzRWET;ywUR34}b*Nee^U0OD|+Gj~FP~q>(^5{{w zxwu)Q5HixEh=e<9bbK6o6cvA?rs1(xSJ85z9bW^@7G=jusmgl9Xd~z#_{pzm;G8%% zxdXIAoxP&pKdLA{afS87uW6WsC*RL&MW4-G|IqtyE;M*Y8|x(`ULt+3$ugn}=4x(H z2=`E9hE6oJ*J#<6eOc(kI_0REu$tn!*M1Q2R-jY!4^RCUMOX)3ErnOxzbL~BY_|}J zM;Mm<5%*r$5|=sJ712S>{tEa!L8rJ&;z||DY3`@af!A^>GxCjWPft{W84!sJonvHZ z>A(l#D>Xu208W0Kver>V&E7f)NH7$93lzUnU^6s6jG&WjL|cg8%q~`OCEj6bL-E@l zb>8(}UtXQ}e&{DZB)!v%_+cD_tscs>0n^{+>+SPUt~Gc*#goIhZ!W2a;5{`o&~v>zCyC>b%?gEqc~oj-p;f&oBbBaHkgzlRa#O GuipVU7~S#! literal 0 HcmV?d00001 diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows_noagentinstall.ps b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows_noagentinstall.ps new file mode 100644 index 0000000000000000000000000000000000000000..7a759c56c68898442f944084199f55415fb7fc7a GIT binary patch literal 6311 zcmeHLZBHXP68_%5qSQMQAmI)$tGyHRqRl|qK??-YnL(?`2$_zP_~^9zYYw6wH`04F$KA7Q~AI ziGttej$s5kVPSK#pB&IoX&R_mkt;qh(WeVxlT_%b%*3UVg+1p59|`^W@GynYTH5)g zR#s&yr#BQ%ukZKfrNHqX$R9X%nT8;;7x?hcs6e&3Iv#A2lq%jfhT*sk#&F zTHIcVe^vt5*as~s9$Qp-ER-})ar;r{zJ&EyTW4cA-S|ih_<&xa zTUA_gz-V!|@3gX9t?}zSlW4q7Y5>j|zkvg=V`{@kM%a70Z1>(%{6ZAd!xH3QJydfe zYk!>so-=vCr2(viXv1dd6^XbP#A?5A&r!L|=Jak}a$|^j%>)7t+JmGt`wuvPg!d{f zCJL6%R8fe`DaS+?V#WaM6TEo_N4ct?X?DRU5CznrNomTQ&;8C;cnmo&08F>tk)16_ z=Y42EJze4UF=%<}bXwf13O>dbj?p{1B-XCKw)0%gh@B~T=%vz@4&W4pumu0b$`N-j zaemxb!W)HWW0lT!~R^mED>P5{P-l?GfxMe#KGR)0d@+j=U(L?y7E{Y zp5SrFO*KECk&%=+WtBl920RvuAy3w8&y%B}#sLmk1R2S4bC<-<`;W#VyK||@MaTMH zc$c`B#+qH9Eb+ZiP_a*_KAB@@n_-W(KLxBGOFk+T@f03VMPHoA*C++*^t$oR$bWeTJw(=EfQ2OxYa0Ws*n*u0 z-8V*vwtoEM@DIQWNd1$s^>PDSf$O8Vn$>>v4O4{$JRisC{|2UfwEUA1_5B8-JkLk* zBwQT-hNk~3G_3-umeenKde7gP|qVw+hW=MNs7yaDlCdh6aT%^2>{gCe>R6yVI z)PI|&T%v;d(o$q{Shwk}rE*2N%lL(u)n#JHMZOkC<$yoCE+)5(Y` z*j00jLb!(-GjyV%y++Hn?8`zQ*4CqH;?xw^z4nuUw*sA-e|YL&D8f4MYAL+h{z4g6 zVEY1*c!Xiu?{V*iPpn&@U14q1>^}jY$LJJyh+TbQ`S0)sQI=I0%8sdz6FYZ5@0h_K8&D~Y(!g#-^?ynam7Ah zYD4iwkJ=x4@4Hv0ywUHemY0e7$|1%C!d1*Lb=x?wd=}RY7VP z+I(z#ukyo|dYa{@Rx1&QSm^2E&F++3vtOHLwKF9qLc-bK+uO%#(G;!qq?opaz9@ds zk9q=|J?IAeBzD8)uSwqoKOz^39BkL(3wD-xqTe1KaQAVu9@V0GUK#9u_q>5~jH&W2 zxzX}|{da(ggUMgUuP~E%IJ-6C9XB$&j7xW~)>b%Ei*RExiY_pK{k8ip?Oc8A-1NFXcP_qwO0#j)Jv-|h^-jAN oH=T>)%kC+>bLD)q_XRVC*RAF7?QQfLLqCH6^44OOiBDnmZyOmi;{X5v literal 0 HcmV?d00001 diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows_otel.ps b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/windows_otel.ps new file mode 100644 index 0000000000000000000000000000000000000000..9211365225d91a028b4bac5abdf5ace594937fd1 GIT binary patch literal 6309 zcmeHLZBHXP68_%5qSQAMAmI)$tGyHRqRl|qK??-YnL(?`2$_zP_~^8IZFfR$cmDf5 zcDwV&-T=4S)txl?64`B6m8+h5eO;=V&}J<1{B86%>fDR0vVx?gnY3dPxtMY*22=_? zk;X_>7#uqmCeyOCSRNAAy|FY@Z;>pF<#|rLvTDMu%&?e~9Sc&WD3~#08VYVJEr=Hb z5(U4_9m5E8!ouceKRKYG(lk)BB3FE1qE8pXCaKUp-ER-})ar;r{zJ&EyTW4cA-S|ih_<&xa zTUA_gz-V!|@3gX9t?}zSlW4q7Y5>j|zkvg=V`{@kM%a70Z1>(%{6ZAd!xH3QJydfe zYk!>so-=vCr2(viXv1dd6^XbP#A?5A&r!L|=Jak}a$|^j%>)7t+JmGt`wuvPg!d{f zCJL6%R8fe`DaS+?V#WaM6TEo_N4ct?X?DRU5CznrNomTQ&;8C;cnmo&08F>tk)16_ z=Y42EJze4UF=%<}bXwf13O>dbj?p{1B-XCKw)0%gh@B~T=%vz@4&W4pumu0b$`N-j zaemxb!W)HWW0wyI!!!tV{m zX*L!EIQJm+Iy_UO)Egm=Uf>lT!~R^mED>P5{P-l?GfxMe#KGR)0d@+j=U(L?y7E{Y zp5SrFO*KECk&%=+WtBl920RvuAy3w8&y%B}#sLmk1R2S4bC<-<`;W#VyK||@MaTMH zc$c`B#+qH9Eb+ZiP_a*_KAB@@n_-W(KLxBGOFk+T@f03VMPHoA*C++*^t$oR$bWeTJw(=EfQ2OxYa0Ws*n*u0 z-8V*vwto2I@DIQWNd1$s^>PDSf$O8Vn$>>v4O4{$JRisC{|2UfwEUA1_1y-dJkLk* zBwQT-hNk~3G_3-umeenKde7gP|qVw+hW=MNs7yaDlCdh6aT%^2>{gCe>R6yVI z)PI|&T%v;d(o$q{Shwk}rE*2N%lL(u)n#JHMZOkC<$yoCE+)5(Y` z*j00jLb!(-GjyV%y++Hn?8`zQ*4CqH;?xw^z4nuUw*sA-e|YL&D8f4MYAL+h{z4g6 zVEY1*c!Xiu?{V*iPpn&@U14q1>^}mZ$LJJyh+TbQ`S0)sQI=I0%8sdz6FYZ6ksz{K8&D~Y(!g#-^?ynam7Ah zYD4iwkJ=x4@4Hv0y`TH(&uOo79zTs^u+>wUHemY0e7$|1%C!d1*Lb=x?wd=}RY7VP z+I(z#ukyo|dYa{@Rx1&QSm^2E&F++3vtOHLwKF9qLc-bK+uO%#(G;!qq?opaz9@ds zk9q=|J?IAeBzD8)uSwqoKOz^39BkL(3wD-xqTe1KaQ87l@snEg&MR}>=Z%|V%#?S@ z4VL%ozXQx0O#U){g^9$&$*mFZxRKc<$K)4-rNtCi^I1|)aw}jOb3&IP{7_fjVq+>~ zk+sHXq8X;7*`1%kF&rDpQKkLRpf%yLXkiA0tGSp6G^?#yJp^k78aJ3h<~J)tBsiL? zteXa5H0!lsT(Wz$w!)cOgd2-Nbb;~fuibZP=jvnUrq}(cbMXaKnvJ9G*;(hPciO$U o>0BINc2D7(E9aZNFPJdAZY@V|Z==^3`5A "$filename" +echo "$timestamp_timedatectl" >> "$filename" + +# create script to generate logs using templates +sudo tee /etc/fluent-bit/observe-timestamp.conf > /dev/null << EOT +[FILTER] + Name record_modifier + Match * +# if you want to group your servers into an application group +# [e.g. Proxy nodes] so you have have custom alert levels for them +# uncomment this next line + #REPLACE_WITH_OBSERVE_APP_GROUP_OPTION + Record host $${HOSTNAME} + Record datacenter hostmon_test + Record obs_ver 20230412 + Remove_key _MACHINE_ID +[INPUT] + name tail + tag tail_hostmon_install_complete + Path_Key path + path /tmp/hostmon_install_complete.log + Read_from_Head true +[OUTPUT] + name http + match tail_hostmon_install_complete + host ${trimprefix("${OBSERVE_ENDPOINT}", "https://")} + port 443 + URI /v1/http/fluentbit/hostmon_install_complete + Format msgpack + Header X-Observe-Decoder fluent + Header Authorization Bearer ${OBSERVE_TOKEN} + Compress gzip + tls on +EOT + +sudo service fluent-bit restart \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_noagentinstall.sh b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_noagentinstall.sh new file mode 100644 index 00000000..fcdc20f7 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_noagentinstall.sh @@ -0,0 +1,8 @@ +#!/bin/bash +yum update -y + +yum install curl -y + +yum install wget -y + +yum install ca-certificates -y \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_otel_repo.sh b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_otel_repo.sh new file mode 100644 index 00000000..c91d44cd --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/user_data/yum_based_otel_repo.sh @@ -0,0 +1,10 @@ +#!/bin/bash +yum update -y + +yum install curl -y + +yum install wget -y + +yum install ca-certificates -y + +${SCRIPT} \ No newline at end of file diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/variables.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/variables.tf new file mode 100644 index 00000000..48e00c5b --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/variables.tf @@ -0,0 +1,305 @@ +variable "name_format" { + description = "name format string" + type = string + default = "blunderdome-%s" +} + +# github actions uppercases all of there vars +# tflint-ignore: terraform_naming_convention +variable "WORKFLOW_MATRIX_VALUE" { + type = string + description = "Uses value for naming resources" + default = "base" +} + +# tflint-ignore: terraform_naming_convention +variable "CI" { + type = bool + default = false + description = "This variable is set to true by github actions to tell us we are running in ci" +} + +variable "FULL_PATH" { + description = "Public key var for running in ci" + nullable = true + default = null + type = string +} + +# tflint-ignore: terraform_naming_convention +variable "OBSERVE_TOKEN_OTEL" { + description = "A datastream token" + nullable = true + default = "TOKEN" + type = string +} + +# tflint-ignore: terraform_naming_convention +variable "OBSERVE_TOKEN_HOST_MONITORING" { + description = "A datastream token" + nullable = true + default = "TOKEN" + type = string +} + +variable "OBSERVE_TOKEN_NOAGENT" { + description = "A datastream token" + nullable = true + default = "TOKEN" + type = string +} + + +# tflint-ignore: terraform_naming_convention +variable "OBSERVE_CUSTOMER" { + description = "Observe customer id" + nullable = true + default = null + type = string +} + +# tflint-ignore: terraform_naming_convention,terraform_unused_declarations +variable "OBSERVE_DOMAIN" { + description = "Observe customer domain" + nullable = true + default = null + type = string +} + + +variable "debian_machines" { + description = "Map of Debian machines to create" + type = map(any) + default = { + + DEBIAN_12_INSTALLED = { + # ami used in testing + ami_instance_type = "t3.small" + ami_id = "ami-0c2644caf041bb6de" + ami_description = "Debian 12 (HVM), EBS General Purpose (SSD) Volume Type. Community developed free GNU/Linux distribution. https://www.debian.org/" + default_user = "admin" + sleep = 120 + host_mon_user_data_path = "user_data/aptbased_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/aptbased_otel_repo.sh" + no_agent_user_data_path = "user_data/aptbased_otel_repo_noagentinstall.sh" + } + + UBUNTU_22_04_INSTALLED = { + # ami used in testing + ami_instance_type = "t3.small" + ami_id = "ami-008fe2fc65df48dac" + ami_description = "Canonical, Ubuntu, 22.04 LTS, amd64 jammy image build on 2023-05-16" + default_user = "ubuntu" + sleep = 120 + host_mon_user_data_path = "user_data/aptbased_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/aptbased_otel_repo.sh" + no_agent_user_data_path = "user_data/aptbased_otel_repo_noagentinstall.sh" + } + + UBUNTU_20_04_LTS_INSTALLED = { + # ami used in testing + ami_instance_type = "t3.small" + ami_id = "ami-0892d3c7ee96c0bf7" + ami_description = "Canonical, Ubuntu, 20.04 LTS, amd64 focal image build on 2021-11-29" + default_user = "ubuntu" + sleep = 120 + host_mon_user_data_path = "user_data/aptbased_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/aptbased_otel_repo.sh" + no_agent_user_data_path = "user_data/aptbased_otel_repo_noagentinstall.sh" + } + + UBUNTU_18_04_LTS_INSTALLED = { + ami_instance_type = "t3.small" + ami_id = "ami-0cfa91bdbc3be780c" + ami_description = "Canonical, Ubuntu, 18.04 LTS, amd64 bionic image build on 2022-04-11" + default_user = "ubuntu" + sleep = 120 + host_mon_user_data_path = "user_data/aptbased_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/aptbased_otel_repo.sh" + no_agent_user_data_path = "user_data/aptbased_otel_repo_noagentinstall.sh" + } + + } +} + +variable "rhel_machines" { + description = "Map of RHEL machines to create" + type = map(any) + default = { + RHEL_8_4_0_NO_AGENT_INSTALLED = { + ami_instance_type = "t3.small" + ami_id = "ami-0b28dfc7adc325ef4" + ami_description = "Red Hat Enterprise Linux 8 (HVM), SSD Volume Type" + default_user = "ec2-user" + sleep = 120 + host_mon_user_data_path = "user_data/yum_based_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/yum_based_otel_repo.sh" + no_agent_user_data_path = "user_data/yum_based_noagentinstall.sh" + } + + CENT_OS_7_INSTALLED = { + # https://wiki.centos.org/Cloud/AWS + # Have to run install script on this machine manually + ami_instance_type = "t3.small" + ami_id = "ami-0686851c4e7b1a8e1" + ami_description = "CentOS 7.9.2009 x86_64 ami-0686851c4e7b1a8e1" + default_user = "centos" + sleep = 120 + host_mon_user_data_path = "user_data/yum_based_linux_configuration_script_repo.sh" + otel_user_data_path = "user_data/yum_based_otel_repo.sh" + no_agent_user_data_path = "user_data/yum_based_noagentinstall.sh" + + } + } +} + +variable "windows_machines" { + description = "Map of Windows machines to create" + type = map(any) + default = { + WINDOWS_SERVER_2022_BASE_OTEL_AGENT_INSTALLED = { + ami_instance_type = "t3.small" + ami_id = "ami-091f300417a06d788" + ami_description = "Microsoft Windows Server 2022 Full Locale English AMI provided by Amazon" + default_user = "Administrator" + sleep = 120 + + host_mon_user_data_path = "user_data/windows.ps" + otel_user_data_path = "user_data/windows_otel.ps" + no_agent_user_data_path = "user_data/windows_noagentinstall.ps" + } + + WINDOWS_SERVER_2019_BASE_NO_AGENT_INSTALLED = { + ami_instance_type = "t3.small" + ami_id = "ami-01baa2562e8727c9d" + ami_description = "Microsoft Windows Server 2022 Full Locale English AMI provided by Amazon" + default_user = "Administrator" + sleep = 120 + + host_mon_user_data_path = "user_data/windows.ps" + otel_user_data_path = "user_data/windows_otel.ps" + no_agent_user_data_path = "user_data/windows_noagentinstall.ps" + } + } +} + +variable "INTEGRATION" { + default = { + host_mon = "host_mon_user_data_path", + otel = "otel_user_data_path", + no_agent = "no_agent_user_data_path" + } + +} + +variable "MACHINES_TO_CREATE" { + default = ["rhel", "debian", "windows"] + type = list(string) +} + + +locals { + name_format = var.CI == true ? "gha-lht-${var.WORKFLOW_MATRIX_VALUE}-%s" : var.name_format + + OBSERVE_ENDPOINT = "https://${var.OBSERVE_CUSTOMER}.collect.${var.OBSERVE_DOMAIN}" + + CREATE_INTEGRATION = { + host_mon = var.CREATE_HOST_MON, + otel = var.CREATE_OTEL, + no_agent = var.CREATE_NOAGENT, + } + + TOKENS = { + host_mon = var.OBSERVE_TOKEN_HOST_MONITORING + otel = var.OBSERVE_TOKEN_OTEL + no_agent = var.OBSERVE_TOKEN_NOAGENT + + } + BRANCH = { + host_mon = var.OBSERVE_BRANCH_HOSTMON + otel = var.OBSERVE_BRANCH_OTEL + no_agent = var.OBSERVE_BRANCH_NOAGENT + } + + PRE = "https://raw.githubusercontent.com/observeinc" + SCRIPTS = { + host_mon = < { for key, value in local.machines[machine] : key => value } } + test_machines = merge({}, values(local.list_of_machines)...) + + merged_map = { + for name, integration in var.INTEGRATION : + name => { for key, value in local.test_machines : + key => merge(value, { USERDATA = templatefile("${path.module}/${value[integration]}", { + OBSERVE_ENDPOINT = local.OBSERVE_ENDPOINT + OBSERVE_TOKEN = local.TOKENS[name] + SCRIPT = local.SCRIPTS[name] + BRANCH = local.BRANCH[name] + }) }) + } } + +} + +variable "OBSERVE_BRANCH_HOSTMON" { + description = "Github branch name" + nullable = true + default = "main" + type = string +} + +variable "OBSERVE_BRANCH_OTEL" { + description = "Github branch name" + nullable = true + default = "main" + type = string +} + +variable "OBSERVE_BRANCH_NOAGENT" { + description = "Github branch name" + nullable = true + default = "main" + type = string +} + +variable "enable_app_content" { + description = "Enable creation of content" + default = false + type = bool +} + +variable "CREATE_HOST_MON" { + description = "Enable creation of content" + default = false + type = bool +} + +variable "CREATE_OTEL" { + description = "Enable creation of content" + default = false + type = bool +} + +variable "CREATE_NOAGENT" { + description = "Enable creation of content" + default = false + type = bool +} diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/versions.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/versions.tf new file mode 100644 index 00000000..f0021a7c --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/versions.tf @@ -0,0 +1,21 @@ +# https://www.terraform.io/language/expressions/version-constraints +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 4.11" + } + + random = { + source = "hashicorp/random" + version = ">= 3.4.3" + } + } + required_version = ">= 1.2" +} + +provider "aws" { + region = "us-west-2" + profile = "dce" +} + diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/main.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/main.tf new file mode 100644 index 00000000..4d389436 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/main.tf @@ -0,0 +1,55 @@ +# data "aws_canonical_user_id" "current_user" { +# } + +#Create VPC +resource "aws_vpc" "vpc_public" { + cidr_block = "10.0.0.0/16" + enable_dns_hostnames = "true" + tags = merge( + var.BASE_TAGS, + { Name = format(var.name_format, "vpc") }, + ) +} + +# Creating Internet Gateway attached to VPC +resource "aws_internet_gateway" "gateway_public" { + vpc_id = aws_vpc.vpc_public.id # vpc_id will be generated after we create VPC + tags = merge( + var.BASE_TAGS, + { Name = format(var.name_format, "gateway") } + ) +} + +#Create public subnet within our VPC +resource "aws_subnet" "subnet_public" { + vpc_id = aws_vpc.vpc_public.id + cidr_block = "10.0.0.0/24" + + tags = merge( + var.BASE_TAGS, + { Name = format(var.name_format, "subnet") } + ) +} + +#Create route table on our VPC +resource "aws_route_table" "rt_public" { + vpc_id = aws_vpc.vpc_public.id + + route { + cidr_block = "0.0.0.0/0" + gateway_id = aws_internet_gateway.gateway_public.id + } + + + tags = merge( + var.BASE_TAGS, + { Name = format(var.name_format, "route-table") } + ) +} + + +#Associate Public subnet with abve Route Table +resource "aws_route_table_association" "rt_public_to_subnet" { + subnet_id = aws_subnet.subnet_public.id + route_table_id = aws_route_table.rt_public.id +} diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/outputs.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/outputs.tf new file mode 100644 index 00000000..84fef38a --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/outputs.tf @@ -0,0 +1,11 @@ +output "vpc_id" { + value = aws_vpc.vpc_public.id +} + +output "subnet_public_id" { + value = aws_subnet.subnet_public.id +} + +output "aws_security_group_public_id" { + value = aws_security_group.ec2_public.id +} diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/security_group.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/security_group.tf new file mode 100644 index 00000000..f459de90 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/security_group.tf @@ -0,0 +1,31 @@ +resource "aws_security_group" "ec2_public" { + name = format(var.name_format, "ec2_sg") + vpc_id = aws_vpc.vpc_public.id + ingress { + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + description = "Allow incomming SSH connections" + } + + ingress { + from_port = 3389 + to_port = 3389 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + description = "Allow incoming RDP connections" + } + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + tags = merge( + var.BASE_TAGS, + { + Name = format(var.name_format, "_ec2") + }, + ) +} diff --git a/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/variables.tf b/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/variables.tf new file mode 100644 index 00000000..413a1832 --- /dev/null +++ b/test_code_v2/aws/host_monitoring/ec2/terraform/vpc_module/variables.tf @@ -0,0 +1,182 @@ +# your local key path (assumes it exists) - this will allow you to access ec2 instances +# tflint-ignore: terraform_naming_convention +# variable "PUBLIC_KEY_PATH" { +# description = "Public key path" +# nullable = true +# default = null +# type = string +# } + +# # tflint-ignore: terraform_naming_convention +# variable "PRIVATE_KEY_PATH" { +# description = "Private key path" +# nullable = true +# default = null +# type = string +# } + +# where to deploy +# tflint-ignore: terraform_naming_convention +# variable "REGION" { +# default = "us-west-2" +# description = "Where resources will be deployed" +# type = string +# } + +# appended to resource names so you can find your stuff +variable "name_format" { + description = "Common prefix for resource names" + type = string +} + +# tflint-ignore: terraform_naming_convention +variable "BASE_TAGS" { + description = "base resource tags" + type = map(string) + default = { + owner = "Observe" + createdBy = "terraform" + team = "content" + purpose = "test auto configuration script" + git_repo_url = "https://github.com/observeinc/linux-host-configuration-scripts" + } +} + +# tflint-ignore: terraform_naming_convention +# variable "USE_BRANCH_NAME" { +# default = "main" +# description = "git repository branch to use" +# type = string +# } + +# tflint-ignore: terraform_naming_convention +# variable "CI" { +# type = bool +# default = false +# description = "This variable is set to true by github actions to tell us we are running in ci" +# } + +# # tflint-ignore: terraform_naming_convention +# variable "PUBLIC_KEY" { +# description = "This value comes from a variable in github actions" +# nullable = true +# default = null +# type = string +# } + +# tflint-ignore: terraform_naming_convention +# variable "AWS_MACHINE_CONFIGS" { +# type = map(any) +# description = "variables for supported OS" +# default = { + +# # UBUNTU_22_04_LTS = { +# # # ami used in testing +# # ami_instance_type = "t3.small" +# # ami_id = "