Ansibleを使用したJavaアプリケーション環境のデプロイ

読者は私をフォローしています。そして、RHELファミリーのLinuxを実行しているサーバー上の環境のデプロイメントを自動化する魅惑的な世界にあなたを導きます。







Javaプロジェクトの1つが成長し、かなり大人になり、現在4つのサーキットを占有しています。







Devは開発チームの概要であり、

Qaはテストチームのサーキットです。

ステージ-新しい機能を顧客に示すための回路、

生産-戦闘サーキット。







各回路には、アプリケーションの環境コンポーネントの同一セットを持つ2つの同一サーバーが含まれます。







Linux Oracle-オペレーティングシステム、

jdk-Javaアプリケーションのセット、

haproxy-プロキシサーバー、

nginx-静的を返すためのWebサーバー、

mysql-サブ。







運用チームは、8台のサーバーで環境管理を設定し、生活に対する楽観的な態度を維持する方法という合理的な質問に直面しました。







構成管理システムを簡単に比較した結果、Ansibleが選ばれました。 シンプルさ、柔軟性、および管理対象サーバー上のエージェントの不在は、彼に有利に働きました。













ここで、プロジェクトのAnsibleロールアーキテクチャについて少し説明しましょう。







各環境コンポーネントのインストールおよび初期構成のために、別個の役割が作成されます。 環境の各コンポーネントの設定の後続のカスタマイズも、追加の役割で強調表示されます。 これにより、他のプロジェクトの共通標準ロールの重複を回避できました。







新しいノードを回路に接続するための一連の役割を持つPlaybookは次のようになります。







- hosts: - project_group user: username become: yes gather_facts: true roles: - rhel_install_new_server - rhel_install_java - rhel_install_haproxy - rhel_install_nginx - rhel_install_mysql
      
      





次に、各役割について詳しく説明します。







rhel_install_new_serverの役割



オペレーティングシステムの一般的な構成とシステムユーティリティのインストールを実行します。







ファイルの役割/ rhel_install_new_server / tasks / main.yml







 --- # tasks file for rhel_install_new_server #     : - name: yum update yum: name: "*" state: latest update_cache: yes #  EPEL repository: - name: install EPEL repository yum: name: https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm state: present update_cache: yes #   .      tools_packages: - name: install tools yum: name: '{{ item.name }}' state: present update_cache: yes with_items: '{{ tools_packages }}' #       : - name: set autoload for default interface lineinfile: path: "/etc/sysconfig/network-scripts/ifcfg-{{ansible_default_ipv4.interface}}" regexp: '^ONBOOT=' line: 'ONBOOT="yes"' #  IPv6    : - name: disable IPv6 for eth0 replace: path: "/etc/sysconfig/network-scripts/ifcfg-{{ansible_default_ipv4.interface}}" regexp: '^(IPV6.*=).*$' replace: '\1"no"' #  IPv6: - name: disable IPv6 blockinfile: path: /etc/sysctl.d/disableipv6.conf create: yes marker: no block: | net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 #  SELinux: - name: disable SELinux selinux: state: disabled #   firewall: - name: disable firewall systemd: name: firewalld enabled: no state: stopped ignore_errors: yes #   .      timezone: - name: set timezone to UTC timezone: name: '{{ timezone }}' #     : - name: set synchronize time in cron cron: name: "set synchronize time by ansible" minute: 1 job: "/usr/sbin/ntpdate -u pool.ntp.org >/dev/null 2>&1" #   : - name: Remove old kernels shell: "rpm -q kernel | grep -v `uname -r` | grep -v `/sbin/grubby --default-kernel | sed -r 's#^/boot/vmlinuz-##'` | xargs rpm -e || true"
      
      





変数ファイルの役割/ rhel_install_new_server / vars / main.yml
 --- # vars file for rhel_install_new_server tools_packages: - name: vim - name: mc - name: less - name: sysstat - name: iotop - name: strace - name: traceroute - name: screen - name: rsync - name: curl - name: python - name: wget - name: zlib - name: unzip - name: bind-utils - name: ntp - name: ntpdate - name: telnet - name: nmap - name: tcpdump - name: logrotate - name: net-tools - name: bash-completion - name: yum-utils - name: mtr timezone: UTC
      
      





rhel_install_javaの役割-Javaインストール



このプロジェクトでは、jdkパッケージバージョン8u60を使用します。 さらに、JCEファイルUS_export_policy.jarおよびlocal_policy.jarをダウンロードして、roles / rhel_install_java / files /フォルダーに配置しました。







変数ファイルの役割/ rhel_install_java / vars / main.yml
 --- # vars file for roles/rhel_install_java java_dst_path: "/opt/dst/java" download_url: "http://download.oracle.com/otn/java/jdk/8u60-b27/jdk-8u60-linux-x64.rpm" java_cookie: "Cookie:' gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie'"
      
      





ファイルの役割/ rhel_install_java / tasks / main.yml







 --- # tasks file for roles/rhel_install_java #    : - name: java | create java dst directory file: path: "{{ java_dst_path }}" state: directory recurse: yes owner: root group: root mode: 0755 #   jdk: - name: java | download java get_url: url: "{{ download_url }}" dest: "{{ java_dst_path }}" tmp_dest: "{{ java_dst_path }}" headers: "{{ java_cookie }}" validate_certs: no owner: root group: root mode: 0744 force: yes ignore_errors: True #   jdk         : - name: java | register java rpm find: paths: "{{ java_dst_path }}" patterns: "*.rpm" register: java_rpm #   : - debug: msg={{ java_rpm.files.0.path }} #   : - name: java | install java rpm yum: name: "{{ java_rpm.files.0.path }}" state: present #  Java Cryptography Extension: - name: java | copy JCE copy: src: files/{{ item }} dest: /usr/java/default/jre/lib/security/ owner: root group: root mode: 0644 backup: yes with_items: - US_export_policy.jar - local_policy.jar
      
      





Rhel_install_haproxyロール-haproxyのインストール



ファイルの役割/ rhel_install_haproxy / tasks / main.yml







 --- # tasks file for install_haproxy #    haproxy: - name: install the latest version of haproxy yum: name: haproxy state: latest #   rsyslog.conf: - name: backup rsyslog.conf copy: src: /etc/rsyslog.conf dest: /etc/rsyslog.conf_orig force: no remote_src: true #  udp  rsyslog: - name: format rsyslog | set UDP options blockinfile: path: /etc/rsyslog.conf block: | $ModLoad imudp $UDPServerAddress 127.0.0.1 $UDPServerRun 514 state: present insertafter: '^#\$UDPServerRun.*$' notify: - restart rsyslog #    haproxy  rsyslog: - name: create rsyslog for haproxy blockinfile: path: /etc/rsyslog.d/haproxy.conf content: | if $programname == 'haproxy' and $syslogseverity <= '4' then /var/log/haproxy/haproxy.out if $programname == 'haproxy' and $syslogseverity > '4' then /var/log/haproxy/haproxy.log & stop state: present create: yes notify: - restart rsyslog #     logrotate: - name: backup logrotate file haproxy copy: src: /etc/logrotate.d/haproxy dest: /etc/logrotate.d/haproxy_orig force: no remote_src: true #     logrotate  haproxy: - name: copy logrotate file for haproxy copy: src: files/logrotate_haproxy dest: /etc/logrotate.d/haproxy force: yes #      : - name: enable and start haproxy systemd: name: haproxy daemon_reload: yes enabled: yes state: started
      
      





Rhel_install_haproxy / handlers / main.ymlファイル







 --- # handlers file for install_haproxy - name: restart rsyslog systemd: name: rsyslog state: restarted - name: reload haproxy systemd: haproxy: name state: reloaded
      
      





rhel_install_nginxの役割-nginxのインストール



Rhel_install_nginx / tasks / main.ymlファイル







 --- # tasks file for roles/rhel_install_nginx #    nginx: - name: add nginx repo yum_repository: name: nginx description: nginx official repo state: present baseurl: "http://nginx.org/packages/rhel/{{ansible_distribution_major_version}}/{{ansible_userspace_architecture}}/" gpgkey: http://nginx.org/keys/nginx_signing.key gpgcheck: yes enabled: yes #  nginx: - name: install nginx yum: name: nginx state: present update_cache: yes #   : - name: create folders file: path: '/etc/nginx/{{ item }}' state: directory mode: 0755 with_items: - conf-available - sites-available - sites-enabled #  sites-enabled   nginx: - name: enable sites-enabled dir lineinfile: dest: /etc/nginx/nginx.conf state: present insertafter: "(.*)include /etc/nginx/(.*)" line: " include /etc/nginx/sites-enabled/*.conf;" #    default.conf: - name: stat /etc/nginx/conf.d/default.conf stat: path=/etc/nginx/conf.d/default.conf register: defaultconf_stat #  ,  : - name: Move default.conf command: mv /etc/nginx/conf.d/default.conf /etc/nginx/sites-available/default.conf when: defaultconf_stat.stat.exists #      : - name: enable and started nginx systemd: name: nginx.service enabled: yes state: started
      
      





Rhel_install_mysqlロール-mysqlインストール



ここでは、mysqlの主要な承認で苦しめなければなりませんでした。







ファイルの役割/ rhel_install_mysql / vars / main.yml







 --- # vars file for roles/rhel_install_mysql mysql_repo_rpm: https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm mysql_packets: - mysql-community-server - mysql-community-common - MySQL-python mysql_log: /var/log/mysqld.log
      
      





ファイルロール/ rhel_install_mysql / handlers / main.yml







 --- # handlers file for roles/rhel_install_percona_mysql - name: restarted mysql systemd: name: mysqld state: restarted
      
      





ファイルロール/ rhel_install_mysql / templates / root.cnf.j2







 [client] user=root password={{ mysql_root_password }}
      
      





ファイルロール/ rhel_install_mysql / tasks / main.yml







 -- - # tasks file for roles/rhel_install_mysql #   yum: - name: install mysql repo yum: name: "{{ mysql_repo_rpm }}" state: installed #   mysql: - name: install mysql yum: name: "{{ mysql_packets }}" state: installed #  mysql     : - name: enable mysql systemd: daemon_reload: yes name: mysqld.service enabled: yes state: started #    mysql      ,        .        mysql_root_temp_password. - name: take default root password from mysql log file shell: > awk -F': ' '$0 ~ "temporary password"{print $2}' {{ mysql_log }} | tail -1 register: mysql_root_temp_password # ,      : - name: check mysql_root_temp_password debug: msg={{ mysql_root_temp_password.stdout }} when: mysql_root_temp_password is defined #        : - name: Set temp root pass as root password set_fact: mysql_root_password: "{{ mysql_root_temp_password.stdout }}" when: mysql_root_temp_password is defined #      : - name: Copy the root credentials as .my.cnf file template: src: root.cnf.j2 dest: "~/.my.cnf" mode: 0600 # ,     : - name: register password expire shell: mysql --defaults-file=~/.my.cnf -e "SELECT NOW();" register: password_expired ignore_errors: True - name: check password_expired debug: msg={{ password_expired.stdout }} when: password_expired is defined # -       localhost: - name: ALTER USER root@localhost shell: mysql --defaults-file=~/.my.cnf --connect-expired-password -e "ALTER USER root@localhost IDENTIFIED BY '{{ mysql_root_password }}';" when: password_expired.stdout.find("expired") != -1 #        : - name: Update MySQL root password for all root accounts mysql_user: name: root host: "{{ item }}" password: "{{ mysql_root_password }}" state: present priv: "*.*:ALL,GRANT" with_items: - "{{ ansible_hostname }}" - 127.0.0.1 - ::1 - localhost when: mysql_root_temp_password is defined #   : - name: Ensure Anonymous user(s) are not in the database mysql_user: name: '' host: "{{ item }}" state: absent with_items: - localhost - "{{ ansible_hostname }}" #    : - name: Remove the test database mysql_db: name: test state: absent
      
      





この段階で、「クリーン」な環境が得られました。環境を設定するには、プロジェクト用にカスタマイズする必要があります。 追加のproject_configurationロールを使用してこれを行います。







project_configurationの役割-環境のカスタマイズ



役割を実行する前に、必要なすべてのコンポーネントがシステムにインストールされていることを確認してください。







ファイルの役割/ project_configuration / tasks / main.yml







 ######### check java - name: register installed java shell: java -version args: warn: no register: java_present failed_when: java_present.rc > 1 changed_when: no tags: check_installed - debug: msg: "{{ java_present.rc }}" tags: check_installed - fail: msg="Please install java first" when: java_present.rc == 1 tags: check_installed ######### check haproxy - name: register installed haproxy shell: rpm -q haproxy args: warn: no register: haproxy_present failed_when: haproxy_present.rc > 1 changed_when: no tags: check_installed - debug: msg: "{{ haproxy_present.rc }}" tags: check_installed - fail: msg="Please install haproxy first" when: haproxy_present.rc == 1 tags: check_installed - include: tasks/project_haproxy.yml when: haproxy_present.rc == 0 tags: check_installed ######### check nginx - name: register installed nginx shell: rpm -q nginx args: warn: no register: nginx_present failed_when: nginx_present.rc > 1 changed_when: no tags: check_installed - debug: msg: "{{ nginx_present.rc }}" tags: check_installed - fail: msg="Please install nginx first" when: nginx_present.rc == 1 tags: check_installed - include: tasks/project_nginx.yml when: nginx_present.rc == 0 tags: check_installed ######### check mysql - name: register installed mysql shell: rpm -q mysql57-community-release args: warn: no register: mysql_present failed_when: mysql_present.rc > 1 changed_when: no tags: check_installed - debug: msg: "{{ mysql_present.rc }}" tags: check_installed - fail: msg="Please install mysql first" when: mysql_present.rc == 1 tags: check_installed - include: tasks/project_mysql.yml when: mysql_present.rc == 0 tags: check_installed
      
      





チェックが正常に完了すると、ファイルが接続されます。

タスク/ project_haproxy.yml

タスク/ project_nginx.yml

タスク/ project_mysql.yml







それらでは、テンプレートを使用した構成ファイルのインストール、ssl証明書のインストール、必要なシステムユーザーの確立、データベースの作成などを規定しています。







その結果、すべての操作の後、アプリケーションの作業環境が得られました。 これでアプリケーションのデプロイ手順を進めることができますが、これはまったく異なる話であり、次の記事で共有します。








All Articles