Ansible을 사용하여 수행할 수 있는 Amazon Linux 2의 중요 설정

Ansible을 사용하여 수행할 수 있는 Amazon Linux 2의 중요 설정

2022-10-19 last update

10 minutes reading ec2 ansible aws amazonlinux2
Amazon Linux 2는 AWS에서 제공하는 Linux OS입니다. 그렇다면 다른 OS와 무엇이 다른가? 우리 모두가 알고 있는 것은 이 OS를 통해 AWS 명령을 수행해야 할 때 AWS CLI를 설치할 필요가 없다는 것입니다. 다른 OS에서는 볼 수 없는 가장 "놀라운 부분"이라고 생각합니다.

Amazon Linux 2에 대해 자세히 알아보려면 here을 클릭하십시오!

그렇다면 Amazon Linux 2의 "중요 설정"을 설정해 보셨습니까? 여기서 나는 프로덕션을 위해 서버를 "실제로"사용하기 전에 수행해야 하는 기본 구성을 의미합니다. 5가지로 요약해봤습니다.
  • 업데이트 중
  • 모든 패키지를 설치합니다(업데이트 후에 수행해야 함). 이것은 선택 사항이거나 마지막 단계에서 실행할 수 있지만 간단한 웹 서버를 설치하고 업데이트 후에 실행할 것이기 때문에 2번에 배치했습니다.
  • 관리 사용자
  • 시간대를 설정합니다(Amazon에서 이미 기본적으로 시간 동기화를 제공했기 때문에 NTP 클라이언트 구성을 건너뛰겠습니다).
  • 호스트 이름 설정

  • 좋아, 제목에서 언급했듯이. 이 5가지가 모두 가능합니다. 우리 모두 알다시피, 가능은 구성 관리 도구이기도 합니다.

    전제 조건:

  • AWS CLIsetup at least one credential ;

  • Ansible ;
  • ansible-galaxy collection install community.aws 를 실행하여 AWS용 Ansible 수집 .

  • 그 전에 나중에 구성하기 위해 인스턴스를 시작하겠습니다.

    인벤토리: hosts.yml

    ---
    
    localhost:
      hosts:
        127.0.0.1:
    


    플레이북: ec2.yml

        - name: launch new instance
          amazon.aws.ec2_instance:
            name: amazonlinux2
            region: ap-southeast-3
            key_name: ec2-user
            instance_type: t3.micro
            security_group: ssh-web
            vpc_subnet_id: subnet-0276d466994fa3087
            network:
              assign_public_ip: true
              delete_on_termination: true
            image_id: ami-0de34ee5744189c60 
            volumes: 
              - device_name: /dev/xvda
                ebs: 
                  volume_size: 8
                  volume_type: gp2
                  delete_on_termination: true
          tags:
            - ec2_new
    


    플레이북을 실행!

    $ ansible-playbook -i host.yml ec2.yml -t ec2_new
    
    PLAY [ec2] **************************************************************************************************************************************************************
    
    TASK [launch new instance] **********************************************************************************************************************************************
    changed: [127.0.0.1]
    
    PLAY RECAP **************************************************************************************************************************************************************
    127.0.0.1                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    



    $ aws ec2 describe-instances --query 'Reservations[].Instances[].{ID:InstanceId, PrivateIP:PrivateIpAddress, PublicIP:PublicIpAddress, Name:Tags[?Key==`Name`].Value}'
    [
        {
            "ID": "i-0187e4bb5d2f2007c",
            "PrivateIP": "10.0.1.7",
            "PublicIP": "108.136.226.235",
            "Name": [
                "amazonlinux2a"
            ]
        },
        {
            "ID": "i-050cfb6ee36a57131",
            "PrivateIP": "10.0.1.5",
            "PublicIP": "108.136.225.50",
            "Name": [
                "amazonlinux2"
            ]
        },
        {
            "ID": "i-09c46dba004ed7bd8",
            "PrivateIP": "10.0.2.8",
            "PublicIP": "108.136.235.232",
            "Name": [
                "amazonlinux2b"
            ]
        },
        {
            "ID": "i-02c7573fff1215e65",
            "PrivateIP": "10.0.3.11",
            "PublicIP": "108.136.150.180",
            "Name": [
                "amazonlinux2c"
            ]
        }
    ]
    


    위에 나열된 인스턴스에서 IP가 108.136.225.50인 amazonlinux2 인스턴스를 사용하겠습니다.

    1. 업데이트* 를 이름으로 사용하면 yum -y update 로 바뀝니다.

    - name: al2
      hosts: new
      become: true
      gather_facts: no
      tasks:
        - name: update
          yum:
            name: "*"
            state: latest
    


    2. 패키지 설치
    여기서는 단순 웹 서버용 최신 httpd만 설치하겠습니다.

        - name: install web server
          yum:
            name: httpd
            state: latest
    
        - name: install web server
          service:
            name: httpd
            enabled: yes
    
        - name: modify home page
          shell: 'echo "Hello World!" >> /var/www/html/index.html'
    


    3. 관리 사용자
    ec2-user는 Amazon Linux 2의 기본 사용자입니다. 그러면 서버에 액세스하는 사람이 몇 명 있다면 어떻게 될까요? 그들은 어떤 변경도 할 수 있으며 누가 변경했는지 식별하기 어려울 것입니다. 왜냐하면 누구든지 ec2-user라는 동일한 사용자 이름을 사용하기 때문입니다. 따라서 이름에 따라 다른 사용자를 제공해야 합니다. 또한 ssh 키를 사용하여 EC2 인스턴스에 연결하고 그들이 sudo로 전환할 때 암호가 필요하지 않은 서버의 모든 액세스 수준을 갖는 sysadmin이라고 가정해 보겠습니다.

        - name: create user
          user:
            name: nurulramadhona
            shell: /bin/bash
    
        - name: copy pubkey
          authorized_key:
            user: nurulramadhona
            state: present
            key: "{{ lookup('file', '/home/nurulramadhona/.ssh/id_rsa.pub') }}"
    
        - name: set user as sudoers
          lineinfile: 
            path: /etc/sudoers.d/90-cloud-init-users
            line: 'nurulramadhona ALL=(ALL) NOPASSWD:ALL'
            insertafter: EOF
    


    4. 시간대 설정
    (존으로 변경해주세요)

        - name: set timezone
          community.general.timezone:
            name: Asia/Jakarta
    


    5. 호스트 이름 설정
    (여기서는 localdomain에 대해서만 호스트 이름을 설정하는 데 사용합니다. 이미 있고 사용하려는 경우 공개 도메인으로 변경할 수 있습니다.)

        - name: preserve hostname
          lineinfile: 
            path: /etc/cloud/cloud.cfg
            line: 'preserve_hostname: true'
            insertafter: EOF
    
        - name: set hostname
          command: hostnamectl set-hostname {{ hostname }}.localdomain
    
        - name: replace localhost entry
          lineinfile: 
            path: /etc/hosts
            regexp: '^127\.0\.0\.1'
            line: '127.0.0.1   {{ hostname }}.localdomain {{ hostname }} localhost4 localhost4.localdomain4'
            owner: root
            group: root 
            mode: "0644"
    


    마지막으로 모든 작업이 준비되면. 이것을 인벤토리에 추가해야 합니다.

    new:
      hosts:
        108.136.225.50:
      vars:
        hostname: amazonlinux2
    


    이제 플레이북을 실행해보자!

    $ ansible-playbook -i host.yml al2.yml -u ec2-user
    
    PLAY [al2] **************************************************************************************************************************************************************
    
    TASK [update] ***********************************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [install web server] ***********************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [install web server] ***********************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [modify home page] *************************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [create user] ******************************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [copy pubkey] ******************************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [set user as sudoers] **********************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [set timezone] *****************************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [preserve hostname] ************************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [set hostname] *****************************************************************************************************************************************************
    changed: [108.136.225.50]
    
    TASK [replace localhost entry] ******************************************************************************************************************************************
    changed: [108.136.225.50]
    
    PLAY RECAP **************************************************************************************************************************************************************
    108.136.225.50             : ok=11   changed=11   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    


    기본 사용자를 지정하지 않고 서버를 원격으로 다시 확인합시다. 이미 호스트 이름을 변경했기 때문에 재부팅도 할 것입니다.

    $ ssh 108.136.225.50
    
           __|  __|_  )
           _|  (     /   Amazon Linux 2 AMI
          ___|\___|___|
    
    https://aws.amazon.com/amazon-linux-2/
    [[email protected] ~]$ sudo reboot
    Connection to 108.136.225.50 closed by remote host.
    Connection to 108.136.225.50 closed.
    


    ansible ad-hoc을 사용하여 호스트 이름과 시간대를 확인하여 설정을 확인합시다!

    $ ansible -i host.yml new -m shell -a "hostname && date"
    108.136.225.50 | CHANGED | rc=0 >>
    amazonlinux2.localdomain
    Sun Apr 24 15:35:24 WIB 2022
    


    Amazon Linux 2용입니다! 다음 부분에서는 여기까지의 모든 게시물을 이미 팔로우했다면 우리가 만든 것을 삭제하겠습니다. 다음 포스팅으로 넘어가겠습니다!

    참조:
    https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Instances.html