【Ansible】AWS SSM の Run Command で Ansible の Playbook を AWS CLI で(コマンドで)実行する手順

AWS SSM の Run Command で Ansible の Playbook を AWS CLI で(コマンドで)実行する手順について解説します。

 

AWS 管理コンソールから(GUI から)SSM Run Command を実行する手順については以下を参考にしてください。

 

【Ansible】AWS SSM の Run Command で Ansible の Playbook を実行する手順

 

AWS CLI を利用してコマンドラインから AWS SSM の Run Command で Ansible の Playbook を実行することが出来ます。

 

 

Ansible Playboot を作成する

環境の詳細は以下のページと一緒です。

 

【Ansible】AWS SSM の Run Command で Ansible の Playbook を実行する手順

 

Terraform でテスト用の環境ができたら Ansible Playbook を作成します。

 

 

■ディレクトリ&ファイル構成

tree 

└── test_yum_update 
    ├── roles 
    │   └── common 
    │       └── tasks 
    │           └── main.yml 
    └── server.yml 
 
4 directories, 2 files

 

トップディレクトリを「test_yum_update」にしました。

Playbook の内容は単純に yum update を実行するだけです。

テスト段階なのでシンプルな構成にしました。

 

■server.ymlファイル

cat server.yml  
– name: yum update 
  hosts: all 
  become: true 
  become_method: sudo 
  roles: 
    – common

 

 

■main.ymlファイル

cat main.yml  
– name: gather ec2 facts 
  ec2_metadata_facts: 
  
– name: upgrade all packages (Red Hat) 
  yum: 
    name: ‘*’ 
    state: latest 
  # Amazon Linux2でもos_familyは「RedHat」になる。 
  when: ansible_os_family == “RedHat”

 

「when: ansible_os_family == “RedHat”」で RedHat の場合 yum update コマンドを実行します。

ちなみに今回の管理対象の OS は Amazon Linux2 ですが、ansible_os_family は「RedHat」になります。

 

 

Playbook を ZIP で圧縮して S3 バケットに保存する

Playbook ファイルを作成したら zip コマンドで圧縮して S3 バケットに保存します。

まずは再帰的にディレクトリ配下のファイルを全部圧縮します。

ただし .git ディレクトリ配下は Ansible と関係がないので zip コマンドで除外します。

 

■zip コマンドで圧縮する(.git ディレクトリ配下は除外する)

zip -r test_yum_update.zip test_yum_update -x ‘*.git*’ 
  adding: test_yum_update/ (stored 0%) 
  adding: test_yum_update/server.yml (deflated 23%) 
  adding: test_yum_update/roles/ (stored 0%) 
  adding: test_yum_update/roles/common/ (stored 0%) 
  adding: test_yum_update/roles/common/tasks/ (stored 0%) 
  adding: test_yum_update/roles/common/tasks/main.yml (deflated 20%)

 

-x オプションで指定のディレクトリやファイルを除外できます。

 

 

■zipファイルを確認する

$ ls -l test_yum_update.zip
-rw-rw-r– 1 ec2-user ec2-user 1389 Dec 3 18:12 test_yum_update.zip

S3バケットにアップロードします。

 

 

■S3バケットにアップロードする

 $ aws s3 cp test_yum_update.zip s3://ansible-dev-zip-bucket-xxxxxxxxxxx/
upload: ./test_yum_update.zip to s3://ansible-dev-zip-bucket-xxxxxxxxxxx/test_yum_update.zip

 

 

■S3バケットにアップロードしたオブジェクトを確認する

$ aws s3 ls s3://ansible-dev-zip-bucket-xxxxxxxx/
2022-12-03 18:19:06 1389 test_yum_update.zip

 

 

 

コマンドラインで AWS SSM の Run Command を利用して Ansible の Playbook を実行する

事前準備が出来たので、いよいよコマンドラインで AWS SSM の Run Command を利用して Ansible の Playbook を実行します。

 

■コマンドラインで AWS SSM の Run Command を実行

aws ssm send-command –document-name “AWS-ApplyAnsiblePlaybooks” \ 
>     –document-version “1” –targets ‘[{“Key”:”InstanceIds”,”Values”:[“i-0xxxxxxxxxxxxxxx”]}]’ \ 
>     –parameters ‘{“SourceType”:[“S3″],”SourceInfo”:[“{\n \”path\”: \”https://ansible-dev-xxxxxxxxx.s3.ap-northeast-1.amazonaws.com/test_yum_update.zip\”\n}”],”InstallDependencies”:[“True”],”PlaybookFile”:[“test_yum_update/server.yml”],”ExtraVariables”:[“SSM=True”],”Check”:[“False”],”Verbose”:[“-vvvv”]}’ \ 
>     –comment “20221204 Ansible Test yum update” \ 
>     –region ap-northeast-1 

    “Command”: { 
        “MaxErrors”: “0”,  
        “Parameters”: { 
            “SourceType”: [ 
                “S3” 
            ],  
            “SourceInfo”: [ 
                “{\n \”path\”: \”https://ansible-dev-zip-xxxxxxxxxx.s3.ap-northeast-1.amazonaws.com/test_yum_update.zip\”\n}” 
            ],  
            “PlaybookFile”: [ 
                “test_yum_update/server.yml” 
            ],  
            “InstallDependencies”: [ 
                “True” 
            ],  
            “ExtraVariables”: [ 
                “SSM=True” 
            ],  
            “Check”: [ 
                “False” 
            ],  
            “Verbose”: [ 
                “-vvvv” 
            ] 
        },  
        “DocumentName”: “AWS-ApplyAnsiblePlaybooks”,  
        “OutputS3BucketName”: “”,  
        “OutputS3KeyPrefix”: “”,  
        “StatusDetails”: “Pending”,  
        “RequestedDateTime”: 1670142992.865,  
        “Status”: “Pending”,  
        “TimeoutSeconds”: 3600,  
        “TargetCount”: 0,  
        “NotificationConfig”: { 
            “NotificationArn”: “”,  
            “NotificationEvents”: [],  
            “NotificationType”: “” 
        },  
        “InstanceIds”: [],  
        “ErrorCount”: 0,  
        “MaxConcurrency”: “50”,  
        “ServiceRole”: “”,  
        “CloudWatchOutputConfig”: { 
            “CloudWatchLogGroupName”: “”,  
            “CloudWatchOutputEnabled”: false 
        },  
        “DocumentVersion”: “1”,  
        “OutputS3Region”: “ap-northeast-1”,  
        “CompletedCount”: 0,  
        “Comment”: “20221204 Ansible Test yum update”,  
        “ExpiresAfter”: 1670153792.865,  
        “DeliveryTimedOutCount”: 0,  
        “CommandId”: “xxxxxxxxxxxxxxxxxxxx”,  
        “Targets”: [ 
            { 
                “Values”: [ 
                    “i-0xxxxxxxxxx” 
                ],  
                “Key”: “InstanceIds” 
            } 
        ] 
    } 

 

コマンドを実行するとコマンド内容が表示されます。

 

 

 

コマンド実行結果を確認する

コマンド実行結果を確認します。

 

AWS CLI で(コマンドで)確認する場合

コマンドで実行結果を確認できます。

 

■コマンドで実行結果を確認

$ aws ssm list-command-invocations –command-id xxxxx-xxxxx-xxxxxx –details 

    “CommandInvocations”: [ 
        { 
            “Comment”: “20221204 Ansible Test yum update”,  
            “Status”: “Success“,   ← 成功かどうか確認できます。
            “CommandPlugins”: [ 
                { 
                    “Status”: “Success”,  
                    “ResponseStartDateTime”: 1670142993.204,  
                    “StandardErrorUrl”: “”,  
                    “OutputS3BucketName”: “”,  
                    “OutputS3Region”: “ap-northeast-1”,  
                    “OutputS3KeyPrefix”: “”,  
                    “ResponseCode”: 0,  
                    “Output”: “Content downloaded to /var/lib/amazon/ssm/i-0xxxxxx/document/orchestration/xxxxxxxxxxxx/downloads/”,  
                    “ResponseFinishDateTime”: 1670142993.364,  
                    “StatusDetails”: “Success”,  
                    “StandardOutputUrl”: “”,  
                    “Name”: “downloadContent” 
                },  
                { 
                    “Status”: “Success”,  
                    “ResponseStartDateTime”: 1670142993.364,  
                    “StandardErrorUrl”: “”,  
                    “OutputS3BucketName”: “”,  
                    “OutputS3Region”: “ap-northeast-1”,  
                    “OutputS3KeyPrefix”: “”,  
                    “ResponseCode”: 0,  
                    “Output”: “Amazon Linux release 2 (Karoo)\nLoaded plugins: extras_suggestions, langpacks, priorities, update-motd\nExamining /var/tmp/yum-root-HVmtT2/epel-release-latest-7.noarch.rpm: epel-release-7-14.noarch\n/var/tmp/yum-root-HVmtT2/epel-release-latest-7.noarch.rpm: does not update installed package.\nLoaded plugins: extras_suggestions, langpacks, priorities, update-motd\n227 packages excluded due to repository priority protections\nPackage ansible-2.9.27-1.el7.noarch already installed and latest version\nNothing to do\nLoaded plugins: extras_suggestions, langpacks, priorities, update-motd\n227 packages excluded due to repository priority protections\nPackage unzip-6.0-43.amzn2.x86_64 already installed and latest version\nNothing to do\nRunning Ansible in /var/lib/amazon/ssm/i-0xxxxxxxxxxx/document/orchestration/xxxxxxxxxxxxxxx/downloads\nArchive:  ./test_yum_update.zip\n   creating: test_yum_update/\n  inflating: test_yum_update/server.yml  \n   creating: test_yum_update/roles/\n   creating: test_yum_update/roles/common/\n   creating: test_yum_update/roles/common/tasks/\n  inflating: test_yum_update/roles/common/tasks/main.yml  \nansible-playbook 2.9.27\n  config file = /etc/ansible/ansible.cfg\n  configured module search path = [u’/root/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’]\n  ansible python module location = /usr/lib/python2.7/site-packages/ansible\n  executable location = /usr/bin/ansible-playbook\n  python version = 2.7.18 (default, May 25 2022, 14:30:51) [GCC 7.3.1 20180712 (Red Hat 7.3.1-15)]\nUsing /etc/ansible/ansible.cfg as config file\nsetting up inventory plugins\nSet default localhost to localhost\nParsed localhost, inventory source with host_list plugin\nLoading callback plugin default of type stdout, v2.0 from /usr/lib/python2.7/site-packages/ansible/plugins/callback/default.pyc\nSkipping callback ‘actionable’, as we already have a stdout callback.\nSkipping callback ‘counter_enabled’, as we already have a stdout callback.\nSkipping callback ‘debug’, as we already have a stdout callback.\nSkipping callback ‘den\n—Output truncated—\n———-ERROR——-\nInstalling and or updating required tools: Ansible, wget unzip ….\nError: Nothing to do\n[WARNING]: Platform linux on host localhost is using the discovered Python\ninterpreter at /usr/bin/python, but future installation of another Python\ninterpreter could change this. See https://docs.ansible.com/ansible/2.9/referen\nce_appendices/interpreter_discovery.html for more information.\n”,  
                    “ResponseFinishDateTime”: 1670143010.507,  
                    “StatusDetails”: “Success”,  
                    “StandardOutputUrl”: “”,  
                    “Name”: “runShellScript” 
                } 
            ],  
            “ServiceRole”: “”,  
            “CloudWatchOutputConfig”: { 
                “CloudWatchLogGroupName”: “”,  
                “CloudWatchOutputEnabled”: false 
            },  
            “InstanceId”: “i-0xxxxxxxxx”,  
            “DocumentName”: “AWS-ApplyAnsiblePlaybooks”,  
            “NotificationConfig”: { 
                “NotificationArn”: “”,  
                “NotificationEvents”: [],  
                “NotificationType”: “” 
            },  
            “DocumentVersion”: “1”,  
            “StatusDetails”: “Success”,  
            “StandardOutputUrl”: “”,  
            “StandardErrorUrl”: “”,  
            “InstanceName”: “ip-172-xxxxxxx.ap-northeast-1.compute.internal”,  
            “CommandId”: “xxxxxxxxxxxxxxxx”,  
            “RequestedDateTime”: 1670142992.963 
        } 
    ] 
}

 

 

 

 

GUIより確認する場合

コマンド実行結果は GUI でも確認できます。

【Ansible】AWS SSM の Run Command で Ansible の Playbook を AWS CLI で(コマンドで)実行する手順

 

 

 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

AlphaOmega Captcha Medica  –  What Do You See?
     
 

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください