Category: Open Source Software & Freeware

  • เตาะแตะไปกับ Docker ตอนที่ 11 Docker Compose (LDAP services)

    เราจะมาเรียนรู้ การใช้ docker compose รัน service 2 services คือ OpenLDAP และ phpLDAPadmin ซึ่ง docker จะมองว่าการใช้ docker compose คือ เรากำลังรัน project ที่ประกอบด้วย service หลาย ๆ service

    ให้แน่ใจว่าอยู่ที่ home directory ให้ใช้คำสั่งนี้

    $ cd

    สร้างไดเรกทอรีของ project สมมติตั้งชื่อว่า ex1

    $ mkdir ex1
    $ cd ex1

    สร้างไดเรกทอรี openldap ภายในมี dockerfile และไดเรกทอรีที่เกี่ยวข้อง ทำตามบล็อกเรื่อง “เตาะแตะไปกับ Docker ตอนที่ 9 Dockerfile (OpenLDAP)

    สร้างไดเรกทอรี phpldapadmin ภายในมี dockerfile และไดเรกทอรีที่เกี่ยวข้อง ทำตามบล็อกเรื่อง “เตาะแตะไปกับ Docker ตอนที่ 10 Dockerfile (phpLDAPadmin)

    สร้างไฟล์ docker-compose.yml ด้วยเอดิเตอร์ที่ถนัด เช่น vi หรือ nano ก็ได้

    $ vi docker-compose.yml
    
    version: '2'
    services:
     openldap:
      build: ./openldap
      container_name: openldap
      volumes:
       - ldapdatavol:/var/lib/ldap
       - ldapconfigvol:/etc/ldap/slapd.d
      ports:
       - "389:389"
       - "636:636"
      restart: always
    
     phpldapadmin:
      build: ./phpldapadmin
      container_name: phpldapadmin
      environment:
       HNAME: "openldap"
      ports:
       - "8080:80"
      depends_on:
       - openldap
      restart: always
    
    volumes:
     ldapdatavol:
      external: false
     ldapconfigvol:
      external: false

    อธิบายได้ดังนี้
    ไฟล์ docker-compose.yml นี้ จะมี service แรกคือ openldap จะ build image จากไดเรกทอรี ./openldap เมื่อรันเป็น container จะตั้งชื่อว่า openldap โดยมีที่เก็บข้อมูลถาวรคือ ldapdatavol จะ mapped ไปยัง /var/lib/ldap ใน container และที่เก็บคอนฟิก ldapconfigvol จะ mapped ไปยัง /etc/ldap/slapd.d ใน container เช่นเดียวกัน
    โดย Host และ container เปิด port ตรงกัน คือ เปิด port TCP 636(LDAPS) และ 389(LDAP) และ container นี้จะทำงานทุกครั้งเมื่อเปิดเครื่อง

    ต่อมา service ที่สองคือ phpldapadmin จะ build image จากไดเรกทอรี ./phpldapadmin เมื่อรันเป็น container จะตั้งชื่อว่า phpldapadmin มีการตั้งค่าตัวแปร HNAME เป็นชื่อ container อันแรก คือ openldap โดยที่ Host จะเปิด port TCP 8080 ไปยัง port TCP 80 ของ container นี้ ถัดมาคือ depends_on คือ จะรัน container นี้ได้ก็ต่อเมื่อมี container ชื่อ openldap และ container นี้จะทำงานทุกครั้งเมื่อเปิดเครื่อง

    ท่อนล่างสุด คือ การกำหนดว่า จะมีการใช้ named volume ชื่อ ldapdatavol และ ldapconfigvol ทั้งสอง volume นี้ จะถูกสร้างโดยคำสั่ง docker-compose ไม่ได้ไปใช้ volume จากที่ได้สร้างไว้ก่อนแล้ว (external: false) หากจะย้อนกลับไปอ่านเรื่อง “เตาะแตะไปกับ Docker ตอนที่ 7 Manage data” จะเข้าใจเรื่อง named volume ครับ

    ผลลัพธ์หลังจากเตรียมครบ ภายในไดเรกทอรี ex1 จะมี 1 ไฟล์ และ 2 ไดเรกทอรี ดังนี้

    $ ls 
    docker-compose.yml openldap phpldapadmin

    ตอนนี้เราก็เตรียมการต่าง ๆ เสร็จแล้ว

    ต่อไปก็ใช้คำสั่ง docker-compose เพื่อสร้าง service คือ openldap และ phpldapadmin ดังนี้

    $ docker-compose up -d

    ตรวจสอบรายการ image

    $ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    phpldapadmin latest d314c021fd1a 6 hours ago 282MB
    ex1_phpldapadmin latest f2feaa90c59b 9 days ago 282MB
    ex1_openldap latest e98f6bad71a7 9 days ago 259MB
    openldap latest cb8b1c0057cc 11 days ago 259MB
    ubuntu 16.04 ccc7a11d65b1 5 weeks ago 120MB

    จะพบว่ามี image ของ project ex1 คือ ex1_openldap และ ex1_phpldapadmin ส่วน image ชื่อ openldap และ phpldapadmin สองอันนั้นที่เห็นเป็น image ที่สร้างด้วยคำสั่ง docker build ตอนที่เราเรียนรู้เรื่อง “เตาะแตะไปกับ Docker ตอนที่ 9 Dockerfile (OpenLDAP)” และ “เตาะแตะไปกับ Docker ตอนที่ 10 Dockerfile (phpLDAPadmin)” ครับ

    ตรวจสอบรายการ container ที่รันอยู่

    $ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    b61e8f24802c ex1_phpldapadmin "/bin/bash /run.sh..." 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp phpldapadmin
    489bb2db70d3 ex1_openldap "/bin/sh -c '/usr/..." 3 minutes ago Up 3 minutes 0.0.0.0:389->389/tcp, 0.0.0.0:636->636/tcp openldap

    จะพบว่ามี container ชื่อว่า openldap และ phpldapadmin เกิดขึ้นหลังคำสั่ง docker-compose up -d

    ทดสอบการเข้าใช้งานทาง web ไปที่ http://ldap.example.com:8080/phpldapadmin/ (เนื่องจาก VM ที่ใช้ทดสอบ คือ ubuntu ที่ได้ติดตั้ง XFCE desktop environment ไว้ด้วยทำให้สามารถใช้งาน web browser ได้ด้วย)

    หลังจาก login แล้วจะเห็นข้อมูล LDAP และจัดการ LDAP database ได้

    จากความรู้ที่ได้เรียนมาหลาย ๆ ตอนจนถึงตอนนี้ เราก็น่าจะได้แนวทางในการสร้าง service ความเข้าใจอย่างง่าย ๆ คือ หากเป็น image ที่เราจะทำขึ้นเอง ไม่ได้ไป pull จาก docker hub เราก็ทำด้วย dockerfile และหากมี service ที่ใช้ร่วมกันระหว่าง service ก็เปลี่ยนไปทำต่อด้วย docker-compose จะสะดวกกว่า

    อนึ่งหาก pull หรือมี image อยู่แล้ว ก็เปลี่ยนจาก build: ./openldap เป็น image: openldap และปรับแก้ไขนิดหน่อยตามที่ผู้พัฒนา image นั้นได้แจ้งวิธีการไว้ครับ

    จากที่ได้เขียนบล็อกในชุด “เตาะแตะไปกับ Docker” ตั้งแต่ ตอนที่ 1 ถึง ตอนที่ 11 นี้ ผมคิดว่าก็น่าจะเพียงพอให้เข้าใจว่า docker ใช้งานอย่างไร หวังเป็นอย่างยิ่งว่าผู้อ่านคงได้รับความรู้กันครับ และสามารถลองทำตามได้โดยไม่ติดขัดอะไร

     

  • เตาะแตะไปกับ Docker ตอนที่ 10 Dockerfile (phpLDAPadmin)

    ในตอนที่แล้วเราใช้งาน openldap ด้วยคำสั่ง เช่น ldapsearch หรือ ldapadd ได้แล้ว วันนี้เราจะเรียนรู้การใช้ dockerfile สร้าง image ชื่อ phpldapadmin เพื่อใช้เป็น web interface ในการเข้าไปจัดการ LDAP database ของ container ชื่อ openldap โดยที่ phpLDAPadmin นี้คือการรัน php บน apache2 แล้วเราจะติดต่อระหว่าง container กันได้อย่างไร มาดูกันครับ

    เช่นเดียวกับครั้งที่แล้ว ผมจะแยกเป็น 3 ขั้นตอน คือ 1.ขั้นตอนเตรียมไฟล์ที่เกี่ยวข้อง 2.ขั้นตอนสร้างไฟล์ dockerfile และ 3.ขั้นตอนการรัน container

     

    1.ขั้นตอนเตรียมไฟล์ที่เกี่ยวข้อง

    ให้แน่ใจว่าอยู่ที่ home directory ให้ใช้คำสั่งนี้

    $ cd

    สร้างไดเรกทอรีของ image ที่เราจะสร้าง

    $ mkdir phpldapadmin
    $ cd phpldapadmin
    $ mkdir src

    เราจะเตรียมไฟล์ชื่อ apache2-foreground ให้เปิดไฟล์จากที่นี่ https://github.com/docker-library/php/blob/master/5.6/jessie/apache/apache2-foreground แล้วคัดลอกทุกบรรทัด นำมาสร้างไฟล์ ด้วยเอติเตอร์ที่ถนัด เช่น vi หรือ nano ก็ได้

    $ vi ./src/apache2-foreground

     

    2.ขั้นตอนสร้างไฟล์ dockerfile

    ตอนนี้ก็มาถึงขั้นตอนการเขียน dockerfile ด้วยเอดิเตอร์ที่ถนัดเช่น vi หรือ nano ก็ได้

    $ vi dockerfile
    
    # Composer: Wiboon Warasittichai
    
    FROM ubuntu:16.04
    
    # Change apt source
    RUN sed -i 's/\/us.archive/\/th.archive/g' /etc/apt/sources.list && \
     sed -i 's/\/archive/\/th.archive/g' /etc/apt/sources.list
    
    # Update ubuntu, then install packages
    RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt install -y php-ldap phpldapadmin ldap-utils
    
    # Timezone Asia/Bangkok
    RUN apt-get install -y tzdata && \
     ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime && \
     dpkg-reconfigure -f noninteractive tzdata
    
    # Cleaning
    RUN apt-get autoremove -y && apt-get clean -y
    
    EXPOSE 80
    
    CMD RUN ulimit -n 1024
    
    ENV HNAME ${HNAME}
    ADD ./src/startup.sh /startup.sh
    
    COPY ./src/apache2-foreground /usr/local/bin/
    RUN chmod +x /usr/local/bin/apache2-foreground
    
    ENTRYPOINT ["/bin/bash","/startup.sh"]

     

    ภายในไฟล์ dockerfile เราได้อ้างถึงการนำไฟล์ชื่อ startup.sh ก็ให้สร้างไฟล์นี้ด้วย

    $ vi ./src/startup.sh 
    
    #!/bin/bash
    
    sed -i "s/127.0.0.1/$HNAME/g" /etc/phpldapadmin/config.php
    /usr/local/bin/apache2-foreground

    จุดน่าสนใจในไฟล์ dockerfile ในตัวอย่างนี้ คือ เราจะเขียนอย่างไรเพื่อให้เราเปลี่ยนค่า 127.0.0.1 ในไฟล์ /etc/phpldapadmin/config.php ใน container ที่รันขึ้นมาได้อัตโนมัติ เราจึงต้องใช้ ENV ในการระบุว่า container openldap ที่รันอยู่นั้นใช้ IP อะไร แล้วเราก็นำ IP ใส่ลงไปในตัวแปร HNAME เพื่อจะติดต่อไปยัง container openldap ได้ถูกต้อง ผมจึงเพิ่มบรรทัดนี้

    ENV HNAME ${HNAME}

     

    3.ขั้นตอนการรัน container

    สร้าง image ด้วยคำสั่งนี้

    $ docker build -t phpldapadmin .

    ก่อนจะรัน container phpldapadmin ต้องไม่ลืมว่า เราจะต้องรัน container openldap ด้วยคำสั่งนี้แล้ว

    $ docker run -d -p 636:636 -p 389:389 --name openldap --volume oldata:/var/lib/ldap --volume olconfig:/etc/ldap/slapd.d openldap

    รัน container และ ตรวจสอบ ด้วยคำสั่งนี้

    $ LDAPSERVER=$(docker exec -it openldap cat /etc/hosts | tail -1 | cut -f1) && docker run -d -p 8080:80 --env HNAME=${LDAPSERVER} --name phpldapadmin phpldapadmin
    
    $ docker ps

    อธิบายได้ดังนี้ container จะรันแบบ detach (-d) เปิด port 8080 ที่ Host เข้าไปยัง port 80 ที่ container ตั้งชื่อ(–name) ว่า phpldapadmin โดยกำหนดค่า ENV สำหรับตัวแปรที่ชื่อ HNAME ให้ใช้ IP จากไฟล์ /etc/hosts ใน container openldap และรันจาก image ชื่อ phpldapadmin

    ทดสอบการเข้าใช้งานทาง web ไปที่ http://ldap.example.com:8080/phpldapadmin/ (เนื่องจาก VM ที่ใช้ทดสอบ คือ ubuntu ที่ได้ติดตั้ง XFCE desktop environment ไว้ด้วยทำให้สามารถใช้งาน web browser ได้ด้วย)

    หลังจาก login แล้วจะเห็นข้อมูล LDAP และจัดการ LDAP database ได้

    โปรดสังเกตว่าคำสั่ง docker run นั้น หากต้องการให้รันทำงานทุกครั้งที่เปิดเครื่อง เราจะสามารถใส่ option นี้เข้าไปได้ด้วย คือ –restart always ใส่หลังจากคำว่า docker run ก็ได้ครับ (ในตัวอย่างข้างต้น ผมไม่ได้ใส่ไว้ เพราะกำลังทดสอบ) หากเรา reboot เครื่อง container ทั้ง 2 ก็หายไปครับ

    แต่เราก็สามารถลบ container ได้ทันที ดังนี้

    $ docker stop phpldapadmin
    $ docker rm phpldapadmin
    $ docker stop openldap
    $ docker rm openldap

    สรุปว่า ในตอนนี้ เรารู้วิธีการใช้ dockerfile สร้าง container 2 อัน อันแรกคือ LDAP database และอีกอันคือ php web program ที่จะติดต่อกับ LDAP database ด้วยการใช้ตัวแปร ENV ร่วมด้วย

    ในตอนต่อไป เราจะมาเรียนรู้ การใช้ docker compose รันทั้ง 2 services นี้แทนการแยกสร้าง dockerfile และ run แยกกัน

     

  • เตาะแตะไปกับ Docker ตอนที่ 9 Dockerfile (OpenLDAP)

    วันนี้เราจะเรียนรู้การใช้ dockerfile สร้าง image ชื่อ openldap เพื่อใช้เป็น LDAP database
    ผมทดสอบด้วย Oracle VM VirtualBox เป็น VM ที่ตั้งค่า Network adapter เป็นแบบ NAT network ที่ติดตั้ง Ubuntu 16.04 และ docker เรียบร้อยแล้ว ในตัวอย่างนี้ผมตั้งชื่อ host ว่า ldap.example.com โดยแก้ไขที่ไฟล์ /etc/hosts และ /etc/hostname ให้เรียบร้อย แล้วรีบูตเครื่องด้วย

    ผมจะขอแยกขั้นตอนออกเป็น 3 ขั้นตอนหลัก คือ 1.ขั้นตอนเตรียมไฟล์ที่เกี่ยวข้องซึ่งรวมไฟล์ ldif ด้วย 2.ขั้นตอนสร้างไฟล์ dockerfile และ 3.ขั้นตอนการรัน container

     

    1.ขั้นตอนเตรียมไฟล์ที่เกี่ยวข้อง
    สร้างไดเรกทอรีของ image ที่เราจะสร้าง

    $ mkdir openldap

    สร้างไดเรกทอรีที่เก็บไฟล์ ldif (โครงสร้าง และ ตัวอย่างข้อมูล)

    $ cd openldap
    $ mkdir src

    สร้างไฟล์ ./src/create-schema.ldif ด้วยเอติเตอร์ที่ถนัด เช่น vi หรือ nano ก็ได้

    $ vi ./src/create-schema.ldif 
    # Starter kit for create user in domain dc=example,dc=com
    # Create 1st tree OU=groups
    dn: ou=groups,dc=example,dc=com
    objectClass: organizationalUnit
    ou: groups
    
    # Create sub tree OU=execs,OU=groups
    dn: ou=execs,ou=groups,dc=example,dc=com
    objectClass: organizationalUnit
    ou: execs
    
    # Create sub tree OU=staffs,OU=groups
    dn: ou=staffs,ou=groups,dc=example,dc=com
    objectClass: organizationalUnit
    ou: staffs
    
    # Create sub tree OU=students,OU=groups
    dn: ou=students,ou=groups,dc=example,dc=com
    objectClass: organizationalUnit
    ou: students
    
    # Create 2nd tree OU=people
    dn: ou=people,dc=example,dc=com
    objectClass: organizationalUnit
    ou: people

    สร้างไฟล์ ssl.ldif

    $ vi src/ssl.ldif
    dn: cn=config
    changetype: modify
    add: olcTLSCipherSuite
    olcTLSCipherSuite: NORMAL
    -
    add: olcTLSCRLCheck
    olcTLSCRLCheck: none
    -
    add: olcTLSVerifyClient
    olcTLSVerifyClient: never
    -
    add: olcTLSCertificateFile
    olcTLSCertificateFile: /etc/ssl/certs/ldap-ca-cert.pem
    -
    add: olcTLSCertificateKeyFile
    olcTLSCertificateKeyFile: /etc/ssl/private/ldap-ca-key.pem

    สร้างไฟล์ ./src/create-users.ldif

    $ vi ./src/create-users.ldif 
    # Create 1 user in tree OU=execs,OU=groups
    dn: cn=nana,ou=execs,ou=groups,dc=example,dc=com
    objectClass: inetOrgPerson
    uid: nana
    sn: Na
    givenName: Na
    cn: nana
    displayName: Na Na
    userPassword: 123456
    mail: nana@example.com
    
    # Create 2 users in tree OU=staffs,OU=groups
    dn: cn=koko,ou=staffs,ou=groups,dc=example,dc=com
    objectClass: inetOrgPerson
    uid: koko
    sn: Ko
    givenName: Ko
    cn: koko
    displayName: Ko Ko
    userPassword: 123456
    mail: koko@example.com
    
    dn: cn=momo,ou=staffs,ou=groups,dc=example,dc=com
    objectClass: inetOrgPerson
    uid: momo
    sn: Mo
    givenName: Mo
    cn: momo
    displayName: Mo Mo
    userPassword: 123456
    mail: momo@example.com
    
    # Create 2 users in tree OU=people
    dn: cn=lala,ou=people,dc=example,dc=com
    objectClass: inetOrgPerson
    uid: lala
    sn: La
    givenName: La
    cn: lala
    displayName: La La
    userPassword: 123456
    mail: lala@example.com
    
    dn: cn=lulu,ou=people,dc=example,dc=com
    objectClass: inetOrgPerson
    uid: lulu
    sn: Lu
    givenName: Lu
    cn: lulu
    displayName: Lu Lu
    userPassword: 123456
    mail: lulu@example.com

    สร้างไฟล์ ./src/create-students.ldif

    $ vi ./src/create-students.ldif 
    # Create 2 students in tree OU=students,OU=groups
    dn: cn=5310110293,ou=students,ou=groups,dc=example,dc=com
    objectClass: inetOrgPerson
    uid: 5310110293
    sn: 5310110293
    givenName: somsak
    cn: 5310110293
    displayName: somsak somsaknaja
    userPassword: 123456
    mail: 5310110293@example.com
    
    dn: cn=5410110308,ou=students,ou=groups,dc=example,dc=com
    objectClass: inetOrgPerson
    uid: 5410110308
    sn: 5410110308
    givenName: somsri
    cn: 5410110308
    displayName: somsri somsrisiya
    userPassword: 123456
    mail: 5410110308@example.com

    ต่อไปเป็นการเตรียม self-signed certificate เพื่อให้ใช้งาน LDAPS ได้

    $ sudo apt install ssl-cert
    $ mkdir cert
    $ cp /etc/ssl/certs/ssl-cert-snakeoil.pem cert/ldap-ca-cert.pem
    $ sudo cp /etc/ssl/private/ssl-cert-snakeoil.key cert/ldap-ca-key.pem
    $ sudo chmod +r cert/ldap-ca-key.pem

     

    2.ขั้นตอนสร้างไฟล์ dockerfile
    ตอนนี้ก็มาถึงขั้นตอนการเขียน dockerfile ด้วยเอดิเตอร์ที่ถนัดเช่น vi หรือ nano ก็ได้

    $ vi dockerfile
    # Composer: Comments
    
    FROM ubuntu:16.04
    
    # Change apt source
    RUN sed -i 's/\/us.archive/\/th.archive/g' /etc/apt/sources.list && \
     sed -i 's/\/archive/\/th.archive/g' /etc/apt/sources.list
    
    # Update ubuntu, then install packages
    RUN apt-get update && \
    echo 'slapd slapd/root_password password 123456' | debconf-set-selections && \
    echo 'slapd slapd/root_password_again password 123456' | debconf-set-selections && \
    echo "slapd slapd/internal/adminpw password 123456" |debconf-set-selections && \
    echo "slapd slapd/internal/generated_adminpw password 123456" |debconf-set-selections && \
    echo "slapd slapd/password2 password 123456" |debconf-set-selections && \
    echo "slapd slapd/password1 password 123456" |debconf-set-selections && \
    echo "slapd slapd/domain string example.com" |debconf-set-selections && \
    echo "slapd shared/organization string example" |debconf-set-selections && \
    echo "slapd slapd/backend string HDB" |debconf-set-selections && \
    echo "slapd slapd/purge_database boolean true" |debconf-set-selections && \
    echo "slapd slapd/move_old_database boolean true" |debconf-set-selections && \
    echo "slapd slapd/allow_ldap_v2 boolean false" |debconf-set-selections && \
    echo "slapd slapd/no_configuration boolean false" |debconf-set-selections && \
    DEBIAN_FRONTEND=noninteractive apt install -y slapd
    
    # LDAP utils, self-signed certificates
    RUN apt-get install -y ldap-utils ssl-cert
    
    # Timezone Asia/Bangkok
    RUN apt-get install -y tzdata && \
     ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime && \
     dpkg-reconfigure -f noninteractive tzdata
    
    # Cleaning
    RUN apt-get autoremove -y && apt-get clean -y
    
    # LDAP
    COPY ./src/*.ldif /tmp/
    ## Schema only, no user. 
    RUN service slapd start && \
     ldapadd -H ldapi:/// -f /tmp/create-schema.ldif -x -D "cn=admin,dc=example,dc=com" -w 123456
    ## Schema and add users.
    ## RUN service slapd start && \ 
    ## ldapadd -H ldapi:/// -f /tmp/create-schema.ldif -x -D "cn=admin,dc=example,dc=com" -w 123456 && \
    ## ldapadd -H ldapi:/// -f /tmp/create-users.ldif -x -D "cn=admin,dc=example,dc=com" -w 123456 && \
    ## ldapadd -H ldapi:/// -f /tmp/create-students.ldif -x -D "cn=admin,dc=example,dc=com" -w 123456
    
    EXPOSE 389 
    #CMD slapd -h 'ldap:///' -g openldap -u openldap -d 0
    
    #
    # LDAPS
    COPY ./cert/ldap-ca-cert.pem /etc/ssl/certs/
    COPY ./cert/ldap-ca-key.pem /etc/ssl/private/
    
    RUN chgrp ssl-cert /etc/ssl/private/ldap-ca-key.pem && \
     chmod g+r /etc/ssl/private/ldap-ca-key.pem && \
     adduser openldap ssl-cert
    
    RUN echo 'SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"' >> /etc/default/slapd && \
     echo 'TLS_REQCERT never' >> /etc/ldap/ldap.conf
    
    RUN service slapd start && \
     ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/ssl.ldif -v
    
    EXPOSE 636
    ##CMD slapd -h 'ldaps:///' -g openldap -u openldap -d 0
    
    CMD RUN ulimit -n 1024
    CMD /usr/sbin/slapd -h 'ldap:/// ldaps:/// ldapi:///' -g openldap -u openldap -d 0

     

    3.ขั้นตอนการรัน container
    สร้าง image ด้วยคำสั่งนี้

    $ docker build -t openldap .

    รัน container และ ตรวจสอบ ด้วยคำสั่งนี้

    $ docker run -d -p 636:636 -p 389:389 --name openldap openldap
    $ docker ps

    อธิบายได้ดังนี้ container จะรันแบบ detach (-d) เปิด port 636 และ 389 ตั้งชื่อ(–name) ว่า openldap และรันจาก image ชื่อ openldap

    ทดสอบการนำเข้าข้อมูล ซึ่งเราจะใช้เครื่องที่กำลังทำอยู่นี้เป็น ldap client ไม่ต้องไปหาอีกเครื่องก็ได้ โดยเพิ่มแพ็กเกจ ldap-utils

    $ sudo apt install ldap-utils

    ทดสอบการเพิ่มตัวอย่างข้อมูล โดยเลือกใช้ port 389 (LDAP)

    $ ldapadd -H ldap://ldap.example.com -f ./src/create-users.ldif -x -D "cn=admin,dc=example,dc=com" -w 123456

    ทดสอบการเพิ่มตัวอย่างข้อมูล โดยเลือกใช้ port 636 (LDAPS)

    $ ldapadd -H ldaps://ldap.example.com -f ./src/create-students.ldif -x -D "cn=admin,dc=example,dc=com" -w 123456

    จะพบข้อความว่า

    ldap_sasl_bind(SIMPLE): Can’t contact LDAP server (-1)

    ให้ทำคำสั่ง 2 บรรทัดข้างล่างนี้ เพื่อเพิ่ม certificate จาก LDAP server แล้วลองคำสั่งนั้นอีกครั้งจะทำได้

    $ openssl s_client -connect ldap.example.com:636 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM | sudo tee /usr/local/share/ca-certificates/ldap.example.com.crt
    $ sudo update-ca-certificates

    ทดสอบค้นหาข้อมูล

    $ ldapsearch -xLLL -b "dc=example,dc=com" uid=lulu
    $ ldapsearch -xLLL -b "dc=example,dc=com" uid=5310110293

    ลบ container

    $ docker stop openldap
    $ docker rm openldap

     

    เรื่องสุดท้ายของบล็อกในวันนี้คือ ต้องการเก็บตัวอย่างข้อมูลที่เพิ่มไว้จะทำอย่างไร ทำได้โดยการสร้างที่เก็บ persistent data แบบ named volume โดยที่ oldata สำหรับข้อมูล และ olconfig สำหรับไฟล์คอนฟิกกูเรชัน

    $ docker volume create oldata
    oldata
    $ docker volume create olconfig
    olconfig

    เช็คดูรายการ volume

    $ docker volume ls
    DRIVER VOLUME NAME
    local olconfig
    local oldata

    รัน container (เขียนคำสั่งให้อยู่ในบรรทัดเดียว)

    $ docker run -d -p 636:636 -p 389:389 --name openldap --volume oldata:/var/lib/ldap --volume olconfig:/etc/ldap/slapd.d openldap

    อธิบายได้ดังนี้ container จะรันแบบ detach (-d) เปิด port 636 และ 389 ตั้งชื่อ(–name) ว่า openldap เก็บข้อมูลไว้นอก container เอาไว้ที่ volume ชื่อ oldata ที่ mapped ไปยัง /var/lib/ldap ใน container กับ olconfig ที่ mapped ไปยัง /etc/ldap/slapd.d ใน container และรันจาก image ชื่อ openldap

    เพิ่มข้อมูลตัวอย่าง

    $ ldapadd -H ldaps://ldap.example.com -f ./src/create-students.ldif -x -D "cn=admin,dc=example,dc=com" -w 123456

    ค้นหาข้อมูล

    $ ldapsearch -xLLL -b "dc=example,dc=com" uid=5310110293

    ลบ container เมื่อจะไม่ใช้งานแล้ว

    $ docker stop openldap
    $ docker rm openldap

    หลังจากลบ container ข้อมูลของเราจะยังคงอยู่ในที่เก็บข้อมูลแบบ volume อยู่ที่ path /var/lib/docker/volumes

    ในตอนต่อไปจะเป็นการสร้าง dockerfile เพื่อรัน phpldapadmin ใช้ในการเข้า admin ผ่านหน้าเว็บเพจ

  • เตาะแตะไปกับ Docker ตอนที่ 8 Cleanup Disk Space

    การเรียนรู้ docker เราก็จะมีการทดสอบ pull image มา แล้ว run เป็น container รวมทั้งอาจมีการสร้างพื้นที่เก็บข้อมูลที่เรียกว่า volumes (ทั้งแบบ named volume และ anonymous volume) บ่อยครั้งเมื่อเราใช้คำสั่งตรวจสอบ เราจะพบว่ามีอะไรไม่รู้หลงเหลืออยู่กินเนื้อที่ไปเยอะ

    ตรวจสอบรายการ container

    $ docker ps -a

    ลบ containers ที่ไม่ใช้งานแล้ว

    $ docker ps --filter status=dead --filter status=exited --filter status=created -aq | xargs -r docker rm -v

    หมายเหตุ คำสั่งด้านบนนี้จะลบ data containers ด้วย ถ้ามีการสร้าง container ชนิดเก็บ data โปรดตรวจสอบให้ดีนะ ปัจจุบัน data container นั้น deprecated (ไม่แนะนำให้ใช้งาน)

    ตรวจสอบรายการ images

    $ docker images

    ลบ images ที่ไม่ใช้งานแล้ว

    $ docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi

    ตรวจสอบรายการ volumes

    $ docker volumes ls

    ลบ volume ที่ไม่ถูกใช้งานโดย container ใด ๆ เลย

    $ docker volume ls -q -f dangling=true | xargs -r docker volume rm

    หรือจะใช้อีกแบบ แต่ต้องติดตั้ง jq เพิ่มด้วย

    $ sudo apt install jq
    $ docker ps -aq | xargs docker inspect | jq -r '.[] | .Mounts | .[] | .Name | select(.)'

     

    References:

  • เตาะแตะไปกับ Docker ตอนที่ 7 Manage data

    Docker ให้เราสามารถเลือกใช้วิธีการ mount data เข้าไปให้กับ container อยู่ 3 อย่างคือ
    1. Volumes
    2. Bind mounts
    3. tmpfs mounts

    Volumes จะถูกเก็บอยู่ในส่วนของ Host filesystem ที่จัดการโดย Docker เอง (อยู่ที่ /var/lib/docker/volumes)
    และนี่เป็นวิธีที่ดีที่สุดในการจัดเก็บข้อมูลที่เป็น persistent data (ตามคำบอกในเว็บเพจ docs.docker.com)

    Bind mounts จะถูกเก็บอยู่ในที่ไหนก็ได้ของ Host filesystem เป็นวิธีการที่มีมาตั้งแต่ Docker รุ่นแรก ๆ จึงมีข้อจำกัดเมื่อเทียบกับ Volumes

    tmpfs mounts จะถูกเก็บอยู่ในหน่วยความจำของ Host เท่านั้น

    อ่านรายละเอียดเพิ่มเติมได้จากที่นี่ https://docs.docker.com/engine/admin/volumes/ และ
    https://docs.docker.com/engine/admin/volumes/#more-details-about-mount-types

    ผมขอเล่าถึงตัวอย่างการใช้งาน Volumes ใน docker-compose.yml (version 2) ที่ผมได้ทำเสร็จแล้ว

    $ cat docker-compose.yml 
    version: '2'
    services:
     openldap:
     image: openldap
     container_name: openldap
     volumes:
      - ldapdatavol:/var/lib/ldap
      - ldapconfigvol:/etc/ldap/slapd.d
     ports:
      - "389:389"
      - "636:636"
    
    volumes:
     ldapdatavol:
      external: false
     ldapconfigvol:
      external: false

    อธิบายได้ดังนี้ ในไฟล์ docker-compose.yml นี้ เราจะรัน services ชื่อ openldap จาก image ที่สร้างไว้แล้วชื่อว่า openldap โดยรันเป็น container ที่ผมตั้งชื่อว่า openldap โดยจะเก็บข้อมูลไว้ถาวรที่ volume ชื่อ ldapdatavol ซึ่งจะ mapped กับ /var/lib/ldap ใน container และอีกบรรทัดคือ ldapconfigvol จะ mapped กับ /etc/ldap/slapd.d ใน container

    ถัดมาด้านล่างของไฟล์ เราจะต้องประกาศ volumes ไว้ด้วยว่า ldapdatavol ไม่ได้เป็น volume ที่สร้างไว้อยู่แล้วก่อนการัน docker-compose ด้วยการประกาศค่าว่า external: false เช่นเดียวกับ volume ชื่อ ldapconfigvol

    แต่ถ้าใช้ external: true จะหมายถึง docker-compose จะไม่สร้าง volume ให้ นั่นคือ เราได้สร้างไว้ก่อนแล้วด้วยคำสั่ง

    $ docker volume create --name ldapdatavol
    $ docker volume create --name ldapconfigvol

    เราสามารถดูรายการ volume ด้วยคำสั่งนี้

    $ docker volume ls

    และที่เก็บจริง ๆ จะอยู่ที่นี่ /var/lib/docker/volumes ใช้คำสั่งเปลี่ยนสิทธิเป็น root เข้าไปที่เก็บ volume แล้วเราจะสามารถสำรองข้อมูลนี้ได้โดยใช้คำสั่ง cp หรือ tar ได้เลย ดังนี้

    $ sudo su -
    # cd /var/lib/docker/volumes

    การใช้งาน volume แบบที่แนะนำนี้เรียกว่า named volume คือ เราตั้งเป็นชื่อตามที่เราคิดเอง ส่วนอีกแบบจะเรียกว่า anonymous นั่นคือ docker ตั้งชื่อให้เอง อันนี้ผมไม่ลงรายละเอียดครับ

    จบตอนนี้เราก็จะพอเข้าใจได้แล้วว่า หากจะเก็บข้อมูลของ app เช่นในตัวอย่างนี้คือ openldap ผมจะเลือกใช้ named volume ครับ ข้อมูลจะอยู่ถาวร เรียกว่าการทำ persistent data ในขณะที่ถ้าเราไม่เพิ่มการใช้ volume เข้ามากำหนดที่เก็บข้อมูล หากเราลบ container ก็จะเป็นการลบข้อมูลซึ่งอยู่ใน container ไปด้วย นอกจากว่าเราต้องการให้เป็นอย่างนั้นอาจเพราะว่าข้อมูลเป็นแค่ตัวอย่างไม่สำคัญอะไร ก็ไม่ต้องใช้ volume ครับ

  • ELK #5 การประยุกต์ใช้ ELK ในงานด้าน GIS

    คราวนี้ มาดูการประยุกต์ใช้ ELK ในงานด้าน GIS

    ต่อจาก ELK #01 > ELK #02 > ELK #03 > ELK #04 ซึ่งเป็นการติดตั้งทั้งหมด คราวนี้มาดูการประยุกต์ใช้งานกันบ้าง

    โจทย์มีอยู่ว่า มีการไปเก็บข้อมูลในภาคสนาม แล้วมีการบันทึก พิกัดด้วย GPS เป็น Latitude กับ Longitude พร้อมกับค่าบางอย่าง ทั้งหมดถูกเก็บไว้ในฐานข้อมูล MySQL

    การนำข้อมูลเข้า ELK ก็เลย Export ข้อมูลจาก MySQL มาเป็น CSV File ประกอบด้วย

    id,LATITUDE,LONGITUDE,something

    ตัวอย่างข้อมูล มีดังนี้

    id,LATITUDE,LONGITUDE,something
    1,6.97585,100.448963,100
    2,6.975627,100.450841,19
    3,6.973472,100.449196,65
    4,6.973468,100.449104,53
    5,6.973455,100.449135,33
    6,6.973252,100.44888,13
    7,6.985862,100.45292,85
    8,6.993386,100.416214,90
    9,7.005465,100.447984,1

    นำข้อมูลเข้า ELK ผ่านทาง Logstash

    ใน  ELK #2 ได้อธิบายขั้นตอนการติดตั้ง Logstash ไว้แล้วนั้น ต่อไปเป็นการนำข้อมูลชนิด CSV เข้าไปใส่ใน Elasticsearch

    Logstash จะอ่าน “กระบวนการทำงาน” หรือเรียกว่า Pipeline จากไฟล์ Configuration ซึ่งประกอบด้วย 3 ส่วนหลักๆ คือ Input, Filter และ Output

    input {
       stdin { }
    }

    ในส่วน input นี้ จะเป็นการอ่าน STDIN หรือ ทาง Terminal

    filter {
     csv {
       separator => ","
       columns => [
         "id","latitude","longitude","something"
       ]
     }
     if [id] == "id" {
       drop { }
     } else {
       # continue processing data
       mutate {
         remove_field => [ "message" ]
       }
       mutate {
         convert => { "something" => "integer" }
         convert => { "longitude" => "float" }
         convert => { "latitude" => "float" }
       }
       mutate {
         rename => {
           "longitude" => "[geoip][location][lon]"
           "latitude" => "[geoip][location][lat]"
         }
       }
     }
    }

    ในส่วนของ filter นี้ เริ่มจาก เลือกใช้ Filter Plugin ชื่อ “csv” เพื่อจัดการไฟล์ CSV โดยกำหนด “separator” เป็น “,” แล้วกำหนดว่ามีชื่อ Column เป็น “id”,”latitude”,”longitude”,”something”

    จากนั้น ก็ตรวจสอบว่า ถ้าข้อมูลที่อ่านเข้ามา ใน Column “id” มีค่าเป็น “id” (ซึ่งก็คือบรรทัดหัวตารางของไฟล์ csv นั่นเอง) ก้ให้ “drop” ไป

    แต่หากไม่ใช่ ก็ให้ทำดังนี้ (mutate คือการแก้ไข)

    • remove field ชื่อ message (ซึ่งจะปรากฏเป็น Default อยู่ ก็เลยเอาออกเพราะไม่จำเป็น)
    • convert หรือ เปลี่ยน “ชนิด”  ของแต่ละ field เป็นไปตามที่ต้องการ ได้แก่ ให้ something เป็น Integer, latitude และ longitude เป็น float
    • rename จาก latitude เป็น [geoip][location][lat] และ longitude เป็น [geoip][location][lon] ซึ่งตรงนี้สำคัญ เพราะ geoip.location Field ข้อมูลชนิก “geo_point” ซึ่งจำเป็นต่อการนำไปใช้งานเกำหนดตำแหน่งพิกัดบนแผนที่ (เป็น Field ที่สร้างจาก Template พื้นฐานของ Logstash ซึ่งจะไม่กล่าวถึงในบทความนี้)
    output {
     stdout { codec => rubydebug }
     elasticsearch {
       hosts => ["http://your.elastic.host:9200"]
     }
    }

    ในส่วนของ Output จะกำหนดว่า ข้อมูลที่อ่านจาก csv และผ่าน filter ตามที่กล่าวมาข้างต้น จะส่งไปที่ใน จากการกำหนดนี้ บอกว่า จะส่งออกไป

    • stdout คือ การแสดงผลออกมาทาง terminal โดยมีรูปแบบเป็น rubydebug (รูปแบบหนึ่ง)
    • Elasticsearch ซึ่งอยู่ที่ http://your.elastic.host:9200

    จากนั้น Save ไฟล์นี้ แล้วตั้งชื่อว่า gis.conf

    แล้วใช้คำสั่ง

    cat sample1.csv | /usr/share/logstash/bin/logstash -f gis.conf

    การแสดงผลข้อมูลใน Elasticsearch ผ่าน Kibana

    จากบทความก่อนหน้า ได้แสดงวิธีการติดตั้ง Kibana และเชื่อมต่อกับ Elasticsearch แล้ว โดยจะเข้าถึง Kibana ได้ทางเว็บไซต์ http://your.kibana.host:5601

    ในกระบวนการของ Logstash ข้างต้น จะไปสร้าง Elasticsearch Index ชื่อ “logstash-YYYY-MM-DD”, ใน Kibana ก็จะต้องไป คลิกที่ Setting (รูปเฟือง) จากนั้นคลิกที่ Index Pattern โดยให้ไปอ่าน index ซึ่งมีชื่อเป็น Pattern คือ “logstash-*” จากนั้น คลิกปุ่ม Create

    จะได้ผลประมาณนี้

    ต่อไป คลิกที่ Discover ก็จะเห็นข้อมูลเข้ามา

    แสดงข้อมูลในรูปแบบของ Tile Map

    คลิกที่ Visualization > Create a visualization

    เลือก Tile Map

    เลือก Index ที่ต้องการ ในที่นี้คือ logstash-*

    คลิก Geo Coordinates

    จากนั้น คลิก Apply แล้วคลิก Fit Data Bound

    ก็จะได้เฉพาะ พื้นที่ทีมีข้อมุล

    วิธีใส่ Map Server อื่น

    ปัญหาของ Defaul Map Service ที่มากับ Kibana คือ Elastic Map Service นั้น จะจำกัดระดับในการ Zoom จึงต้องหา WMS (Web Map Service) อื่นมาใช้แทน ต้องขอบคุณ คุณนพัส กังวานตระกูล สถานวิจัยสารสนเทศภูมิศาสตร์ทรัพยากรธรรมชาติและสิ่งแวดล้อม ศูนย์ภูมิภาคเทคโนโลยีอวกาศและภูมิสารสนเทศ (ภาคใต้)  สำหรับคำแนะนำในการใช้งาน WMS และระบบ GIS ตลอดมาครับ 🙂

    โดย เราจะใช้ WMS ของ Longdo Map API : http://api.longdo.com/map/doc/
    ข้อมูลการใช้งาน เอามาจาก http://api.longdo.com/map/doc/demo/advance/02-layer.php

    วิธีการตั้งค่าใน Kibana

    คลิกที่ Option > WMS compliant map server
    แล้วกรอกข้อมูล

    URL : https://ms.longdo.com/mapproxy/service
    Layer: bluemarble_terrain
    Version: 1.3.0
    Format: image/png
    Attribute: Longdo API

    จากนั้นคลิก Apply

    จากนั้นให้ Save พร้อมตั้งชื่อ

    ซึ่ง Longdo Map API สามารถ Zoom ได้ละเอียดพอสมควร

    สามารถนำเสนอระบบ GIS ได้บน Website ทันที

    หวังว่าจะเป็นประโยชน์ครับ

  • Ambari #02 ติดตั้ง Ambari Agent

    ต่อจาก Ambari #01: ติดตั้ง Ambari Server

    ในบทความนี้ จะขอนำเสนอการติดตั้ง Ambari version 2.5.1 จาก HortonWorks ซึ่งจะทำงานกับ Hortonworks Data Platform (HDP)  2.6 โดยติดตั้งบน Ubuntu 16.04 ในส่วนของ “Ambari Agent” [2]

    1. ติดตั้ง Ubuntu 16.04 Server 64bit
    2. สิ่งที่สำคัญมากคือ FQDN หรือการอ้างชื่อเต็มของ host ดังนั้น ในไฟล์ /etc/hosts บรรทัดแรกต้องเป็น Fully Qualified Domain Name เช่น (ห้ามเป็น localhost เด็ดขาด) และถ้าจะให้ดี ควรมี DNS Record บน Name Server ด้วย
      127.0.0.1       ambari02.example.com ambari02
      192.168.1.122   ambari02.example.com ambari02

      ต้องทดสอบใช้คำสั่ง

      hostname -f

      แล้วได้ชื่อ FQDN ถึงจะใช้งานได้

    3. ตั้งค่า Ambari Public Repository
      sudo su
      wget -O /etc/apt/sources.list.d/ambari.list http://public-repo-1.hortonworks.com/ambari/ubuntu16/2.x/updates/2.5.1.0/ambari.list
      apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD
      apt-get update -y
      sudo dpkg --configure -a
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
      apt-cache showpkg ambari-server
    4. ติดตั้ง Ambari Agent
      apt-get install -y ambari-agent
    5. แก้ไขไฟล์
      /etc/ambari-agent/conf/ambari-agent.ini

      ให้ระบบ hostname ไปยัง ambari server ในที่นี้คือ ambari01.example.com

      hostname=ambari01.example.com
      ...
      run_as_user=ambari
    6. เนื่องจากเป็นการติดตั้งแบบ non-root จึงต้องทำการแก้ไข visudo ด้วย
      โดยเพิ่มบรรทัดต่อไปนี้เข้าไป

      # Ambari Customizable Users
      ambari ALL=(ALL) NOPASSWD:SETENV: /bin/su hdfs *,/bin/su ambari-qa *,/bin/su ranger *,/bin/su zookeeper *,/bin/su knox *,/bin/su falcon *,/bin/su ams *, /bin/su flume *,/bin/su hbase *,/bin/su spark *,/bin/su accumulo *,/bin/su hive *,/bin/su hcat *,/bin/su kafka *,/bin/su mapred *,/bin/su oozie *,/bin/su sqoop *,/bin/su storm *,/bin/su tez *,/bin/su atlas *,/bin/su yarn *,/bin/su kms *,/bin/su activity_analyzer *,/bin/su livy *,/bin/su zeppelin *,/bin/su infra-solr *,/bin/su logsearch *
    7. Start Ambari Agent
      ambari-agent start
  • Ambari #01: ติดตั้ง Ambari Server

    Apache Ambari เป็นเครื่องมือที่ทำให้การจัดการ Hadoop ง่ายขึ้น [1] แต่การติดตั้ง Apache Ambari เองนั้น (จาก Apache Project) ก็มีความยุ่งยากเล็กน้อย เพราะต้อง Build Source เอง จึงมีบริษัท HortonWorks เค้าไปทำตัว Binary มาให้ download และติดตั้งได้ง่ายกว่า

    Ambari ประกอบด้วย Ambari Server และ Ambari Agent ซึ่ง Server จะเป็นตัวสั่งการให้ติดตั้ง Hadoop Component ต่างๆลงไปบน Agent

    ในบทความนี้ จะขอนำเสนอการติดตั้ง Ambari version 2.5.1 จาก HortonWorks ซึ่งจะทำงานกับ Hortonworks Data Platform (HDP)  2.6 โดยติดตั้งบน Ubuntu 16.04 ในส่วนของ “Ambari Server” [2]

    1. ติดตั้ง Ubuntu 16.04 Server 64bit
    2. สิ่งที่สำคัญมากคือ FQDN หรือการอ้างชื่อเต็มของ host ดังนั้น ในไฟล์ /etc/hosts บรรทัดแรกต้องเป็น Fully Qualified Domain Name เช่น (ห้ามเป็น localhost เด็ดขาด) และถ้าจะให้ดี ควรมี DNS Record บน Name Server ด้วย
      192.168.1.121   ambari01.example.com ambari01

      ต้องทดสอบใช้คำสั่ง

      hostname -f

      แล้วได้ชื่อ FQDN ถึงจะใช้งานได้
      UPDATE: ในการระบบทดสอบ ซึ่งประกอบด้วยเครื่องไม่เกิน 5 เครื่อง อาจจะใช้ /etc/hosts บันทึก IP Address และ FQDN ของทุกเครื่องใน Cluster และต้องสร้าง /etc/hosts ให้เหมือนกันทุกเครื่องด้วยเช่นกัน แต่หากต้องทำระบบขนาดใหญ่ แนะนำให้ใช้ DNS ซึ่งต้องทำ Reverse DNS ด้วย กล่าวคือ ต้อง nslookup 192.168.1.2 แล้วกลับมาเป็น ambari01.example.com ได้
      แต่หากไม่สามารถจัดการ DNS หลักขององค์กรได้ ก็พอจะใช้งาน dnsmasq ช่วยได้ โดยวิธีการติดตั้งและใช้งานมีดังนี้

       apt install dnsmasq

      แก้ไขไฟล์ /etc/dnsmasq.conf
      เพิ่มบรรทัดต่อไปนี้

      interface=eth0
      address=/ambari01.example.com/192.168.1.121
      ptr-record=121.1.168.192.in-addr.arpa,ambari01.example.com
      address=/ambari02.example.com/192.168.1.122
      ptr-record=122.1.168.192.in-addr.arpa,ambari02.example.com
      ....
      address=/ambari99.example.com/192.168.1.219
      ptr-record=219.1.168.192.in-addr.arpa,ambari99.example.com
      

      จากนั้น ให้แก้ไขไฟล์ /etc/network/interfaces ของทุกเครื่อง ให้ชี้มาที่ IP ของ Ambari Server ในที่นี้คือ 192.168.1.121
      ก็จะใช้งานได้อย่างราบรื่น

    3. ตั้งค่า Ambari Public Repository
      sudo su
      wget -O /etc/apt/sources.list.d/ambari.list http://public-repo-1.hortonworks.com/ambari/ubuntu16/2.x/updates/2.5.1.0/ambari.list
      apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD
      apt-get update -y
      sudo dpkg --configure -a
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
      apt install -y ntp
      apt-cache showpkg ambari-server
    4. ติดตั้ง Ambari Server
      apt-get install -y ambari-server
    5. จากนั้นเป็นการ Setup
      ambari-server setup
      
      Customize user account for ambari-server daemon [y/n] (n)? n
      
      Checking JDK...
      [1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8
      [2] Oracle JDK 1.7 + Java Cryptography Extension (JCE) Policy Files 7
      [3] Custom JDK
      ==============================================================================
      Enter choice (1): 1
      
      Do you accept the Oracle Binary Code License Agreement [y/n] (y)? y
      
      Enter advanced database configuration [y/n] (n)? n
      # Default PostgreSQL Database: ambari
      # Default Username/Password:   ambari/bigdata
    6. Start Ambari
      ambari-server start

    ต่อไป สามารถเปิดการทำงานของ Ambari Server จาก

    http://ambari01.example.com:8080
    Default Username/Password = admin/admin

     

    Reference:

    [1] http://ambari.apache.org/

    [2] https://docs.hortonworks.com/HDPDocuments/Ambari/Ambari-2.5.1.0/index.html

     

  • ติดตั้ง Microsoft Office 2010 บน Linux Mint 18.2

         สวัสดีวันค่ะ… บล็อคนี้เราก็ยังคงอยู่กับ Linux Mint “Sonya” ที่มาพร้อมกับ Applicationพื้นฐานติดตั้งมาด้วย สำหรับคนที่ยังไม่คุ้นเคยกับ Linux ก็จะมีคำถามว่าแล้วโปรแกรมนี้ที่เคยใช้ในฝั่ง Windows มันมีให้ใช้ใน Linux มั้ย อย่างเช่น Microsoft Office อันนี้ Linux ก็มี LibreOffice ให้ใช้แทน และ LibreOffice Writer สามารถ Save เป็น นามสกุล .doc, .docx มาเปิดบน Windows ได้ แต่ Fonts อาจจะเพี้ยนๆหน่อยตอนเอามาเปิดบน Windows ก็มีทางเลือกให้เราติดตั้ง Fonts ที่ต้องการลงไป ดังภาพที่ 1

     

     

    ภาพที่1 ติดตั้ง Font บน Linux

    หรือไม่แน่ใจว่า Office ตัวอื่นจะประสบปัญหาอะไรไหมตอนเอาไปเปิดกับ Windows อยากได้โปรแกรมของ Microsoft Office ทั้งหมดเอาไปใช้เลย!! ก็ทำได้ ก่อนอื่นก็ต้องลง PlayOnLinux ซึ่งเป็นโปรแกรมที่ช่วยให้สามารถใช้โปรแกรม Windows บน Linuxได้ โดยทำตามขั้นตอนดังนี้ค่ะ

    Step1: ไปที่ Software Manager > Search Palyon… > Install > รอวนไปค่ะ ช้าเร็วขึ้นกับเน็ตด้วย ตามภาพที่ 2

    ภาพที่2 Install PlayOnLinux

    Step2: เปิดโปรแกรม PlayOnLinux ดังภาพที่ 3

    ภาพที่3 Open PlayOnLinux

    เมื่อรัน PlayOnLinux ขึ้นมา ให้กด Install ดังภาพที่ 4

    ภาพที่4 หน้าจอ PlayOnLinux 

    เลือกเมนู Office และเลือก Microsoft Office Version ที่ต้องการติดตั้ง ตามภาพที่ 5

    ภาพที่5 List Program in Office Category

    จากนั้นก็ Next Step ไปค่ะ ตามภาพที่ 6

    ภาพที่6 Installation Wizard

    ระหว่างทางนั้น ในเมื่อชีวิตเราไม่ได้โรยด้วยกลีบกุหลาบ Error ตามภาพที่ 7 ก็มา  ตั้งสติแล้วก็ไปลง winbind ซะ!!!

    ภาพที่7 Fatal Error

    กลับมาลง Office กันอีกที Again & Again(ไปฟังเพลงปลอบใจพลางนะ) ถ้าคุณได้ไปต่อมันก็จะขึ้นให้ Browse ไปยังที่เก็บไฟล์ .exe ตามภาพที่ 8 กด Open ไปอีกหน้าจอ แล้วกด Next รอจนติดตั้งเสร็จ

    ภาพที่8 Setup File

    ในที่สุดก็ติดตั้งเสร็จ จะแสดงผลลัพธ์ดังภาพที่ 9  ซึ่ง Shortcut ถูกสร้างไว้บน Desktop สามารถเรียกใช้ได้เลย ตามภาพที่ 10

    ภาพที่9 Installed Program

    ภาพที่10 Office Shortcut on Desktop