AWS Systems Manager를 사용하여 mac1.metal 인스턴스 플릿에서 Ansible 플레이북 실행

16829 단어 devopsmacosawsansible
컨테이너와 서버리스 애플리케이션의 시대에 Ansible은 그다지 트렌디해 보이지 않습니다.

그러나 여전히 도움이 되는 경우가 있고 EC2 Mac 인스턴스와 같은 새로운 제품 오퍼링과 매우 잘 결합되는 경우가 있습니다.

AWS에서 mac1.metal을 더 많이 사용할수록 Ansible이 제 경우 소프트웨어 사용자 정의의 기반이 되는 것을 더 많이 볼 수 있습니다.

대규모 인스턴스 플릿이 있는 경우 AWS Systems Manager이 가장 친한 친구가 됩니다(더 빨리 친해질수록 더 좋음).

그렇다면 AWS Systems Manager의 도움을 받아 mac1.metal용 Ansible 플레이북을 대규모로 사용할 수 있습니까?

(아님) 즉시 사용 가능



AWS Systems Manager(이하 SSM)에는 Ansible 플레이북을 실행할 수 있는 사전 정의된 공유 문서가 있습니다.
“AWS-RunAnsiblePlaybook”이라고 하며 AWS SSM → Documents → Owned by Amazon에서 찾을 수 있습니다.

그러나 이 문서는 macOS에 "친근"하지 않습니다. SSM 에이전트가 Mac EC2 인스턴스에서 Ansible을 호출할 때 Homebrew(사실상 가장 많이 사용되는 macOS 패키지 관리자)와 함께 설치된 Ansible을 인식하지 못합니다.

따라서 이 문서를 사용하여 mac1.metal 인스턴스에서 명령을 실행하려고 하면 다음 오류가 발생합니다.

Ansible is not installed. Please install Ansible and rerun the command.

근본 원인은 간단합니다. Ansible 바이너리에 대한 경로는 기본적으로 SSM 에이전트에서 사용할 수 있는 경로 목록에 없습니다.

이를 해결하는 방법에는 여러 가지가 있지만 가장 편리한 방법은 AWS에서 제공하는 기본 문서의 약간 조정된 버전인 사용자 지정 문서를 만드는 것입니다.

Homebrew와 함께 설치된 Ansible용 자체 SSM 문서 생성



AWS에서 제공한 문서를 복제하고 코드를 약간 변경하기만 하면 됩니다. ansible의 콜아웃을 바이너리의 전체 경로로 바꾸십시오.

AWS SSM → 문서 → Amazon 소유로 이동하고 검색 필드에 AWS-RunAnsiblePlaybook를 입력합니다.

오른쪽 상단 모서리에 있는 원을 눌러 문서를 선택한 다음 작업 → 문서 복제를 클릭합니다.



새 SSM 문서에 이름(예: macos-arbitrary-ansible-playbook )을 지정하고 ansible 콜아웃(코드 끝에 있음)을 Homebrew에서 만든 ansible symlink의 전체 경로(/usr/local/bin/ansible)로 변경합니다.

다음은 Ansible 경로가 조정된 문서의 전체 소스 코드입니다.

문서 소스 코드를 보려면 클릭하십시오.


{
  "schemaVersion": "2.0",
  "description": "Use this document to run arbitrary Ansible playbooks on macOS EC2 instances. Specify either YAML text or URL. If you specify both, the URL parameter will be used. Use the extravar parameter to send runtime variables to the Ansible execution. Use the check parameter to perform a dry run of the Ansible execution. The output of the dry run shows the changes that will be made when the playbook is executed.",
  "parameters": {
    "playbook": {
      "type": "String",
      "description": "(Optional) If you don't specify a URL, then you must specify playbook YAML in this field.",
      "default": "",
      "displayType": "textarea"
    },
    "playbookurl": {
      "type": "String",
      "description": "(Optional) If you don't specify playbook YAML, then you must specify a URL where the playbook is stored. You can specify the URL in the following formats: http://example.com/playbook.yml or s3://examplebucket/plabook.url. For security reasons, you can't specify a URL with quotes.",
      "default": "",
      "allowedPattern": "^\\s*$|^(http|https|s3)://[^']*$"
    },
    "extravars": {
      "type": "String",
      "description": "(Optional) Additional variables to pass to Ansible at runtime. Enter a space separated list of key/value pairs. For example: color=red or fruits=[apples,pears]",
      "default": "foo=bar",
      "displayType": "textarea",
      "allowedPattern": "^((^|\\s)\\w+=(\\S+|'.*'))*$"
    },
    "check": {
      "type": "String",
      "description": " (Optional) Use the check parameter to perform a dry run of the Ansible execution.",
      "allowedValues": [
        "True",
        "False"
      ],
      "default": "False"
    },
    "timeoutSeconds": {
      "type": "String",
      "description": "(Optional) The time in seconds for a command to be completed before it is considered to have failed.",
      "default": "3600"
    }
  },
  "mainSteps": [
    {
      "action": "aws:runShellScript",
      "name": "runShellScript",
      "inputs": {
        "timeoutSeconds": "",
        "runCommand": [
          "#!/bin/bash",
          "/usr/local/bin/ansible --version",
          "if [$? -ne 0]; then",
          " echo \"Ansible is not installed. Please install Ansible and rerun the command\" >&2",
          " exit 1",
          "fi",
          "execdir=$(dirname $0)",
          "cd $execdir",
          "if [-z ''] ; then",
          " if [[\"\" == http*]]; then",
          " wget '' -O playbook.yml",
          " if [$? -ne 0]; then",
          " echo \"There was a problem downloading the playbook. Make sure the URL is correct and that the playbook exists.\" >&2",
          " exit 1",
          " fi",
          " elif [[\"\" == s3*]] ; then",
          " aws --version",
          " if [$? -ne 0]; then",
          " echo \"The AWS CLI is not installed. The CLI is required to process Amazon S3 URLs. Install the AWS CLI and run the command again.\" >&2",
          " exit 1",
          " fi",
          " aws s3 cp '' playbook.yml",
          " if [$? -ne 0]; then",
          " echo \"Error while downloading the document from S3\" >&2",
          " exit 1",
          " fi",
          " else",
          " echo \"The playbook URL is not valid. Verify the URL and try again.\"",
          " fi",
          "else",
          " echo '' > playbook.yml",
          "fi",
          "if [[\"\" == True]] ; then",
          " /usr/local/bin/ansible-playbook -i \"localhost,\" --check -c local -e \"\" playbook.yml",
          "else",
          " /usr/local/bin/ansible-playbook -i \"localhost,\" -c local -e \"\" playbook.yml",
          "fi"
        ]
      }
    }
  ]
}




mac1.metal 플릿에 Ansible 플레이북 적용



새로운 SSM 문서를 사용해 봅시다! (최소한 하나의 mac1 인스턴스가 실행 중이라고 가정합니다. 맞습니까?)

AWS SSM에서 Run Command 기능으로 이동한 다음 Run Command 버튼을 클릭합니다.

새 패널에서 검색 필드에 문서 이름(이 예에서는 macos-arbitrary-ansible-playbook)을 입력하고 Enter 키를 누릅니다.

문서를 선택하면 해당 매개변수와 설정이 표시됩니다.

나머지는 자명하다. 플레이북 코드 또는 소스 파일에 대한 링크를 입력하고, 필요한 경우 추가 변수를 추가하고, 대상 호스트 또는 필터링된 묶음을 선택합니다(태그 필터링 기능이 마음에 듭니다!). 마지막으로 "실행"주황색 버튼을 클릭하여 플레이북을 적용합니다.

그게 다야! 이제 모든 앤서블 플레이북의 꿈을 실현할 수 있습니다! 😁




.ltag__user__id__51518 .follow-action-button {
배경색: #ffffff !important;
색상: #4f5d75 !중요;
테두리 색상: #4f5d75 !중요;
}



세르히 바실렌코 팔로우



I am an engineer from Ukraine. I like astronomy and everything related to DevOps. I thrive on developing great product offerings, great people, and great teams.

좋은 웹페이지 즐겨찾기