zoukankan      html  css  js  c++  java
  • ansible之运用playbook分离部署lamp(2.0)

    环境说明

    主机 ip 属性 系统
    node1 192.168.94.141 httpd rhel8
    node2 192.168.94.143 mysql rhel8
    node3 192.168.94.144 php rhel8

    lamp项目目录结构

    [root@node0 lamp]# tree .
    .
    ├── ansible.cfg
    ├── app
    │   └── php
    │       ├── gpgkeys
    │       │   └── RPM-GPG-KEY-EPEL-8
    │       ├── packages
    │       │   └── epel-release-latest-8.noarch.rpm
    │       └── php.yml
    ├── base.yml
    ├── database
    │   └── mysql
    │       ├── chpass.yml
    │       ├── host_vars
    │       │   ├── node2
    │       │   └── pass.yml
    │       ├── mysql.yml
    │       ├── packages
    │       │   └── mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
    │       └── tasks
    │           └── mysqlstart_task.yml
    ├── inventory
    ├── test.yml
    ├── web
    │   └── apache
    │       ├── host_vars
    │       │   └── node1
    │       ├── httpd.yml
    │       ├── packages
    │       │   ├── apr-1.7.0.tar.gz
    │       │   ├── apr-util-1.6.1.tar.gz
    │       │   └── httpd-2.4.46.tar.bz2
    │       ├── tasks
    │       │   └── httpdinstall_tasks.yml
    │       └── template
    │           └── httpd.conf.j2
    └── yum
        ├── CentOS-Base.repo
        ├── epel-modular.repo
        ├── epel-playground.repo
        ├── epel.repo
        ├── epel-testing-modular.repo
        ├── epel-testing.repo
        └── redhat.repo
    
    

    httpd源码安装

    1. apache目录结构
    [root@node0 apache]# tree .
    .
    ├── host_vars
    │   └── node1 
    ├── httpd.yml
    ├── packages
    │   ├── apr-1.7.0.tar.gz
    │   ├── apr-util-1.6.1.tar.gz
    │   └── httpd-2.4.46.tar.bz2
    ├── tasks
    │   └── httpdinstall_tasks.yml
    └── template
        └── httpd.conf.j2
    
    
    
    • node1定义的变量
    [root@node0 apache]# cat host_vars/node1 
    username: apache # 定义用户apache
    path: /opt/  # 定义路径变量,用户可根据需求自行更改安装包存放位置
    packages: # 定义依赖关系包
      - openssl-devel
      - pcre-devel
      - expat-devel
      - libtool
      - gcc
      - "gcc-c++"
      - "@Development tools"
    
    
    
    • 配置的任务yml文件
    #由于源码安装,则调用shell模块安装
    [root@node0 apache]# cat tasks/httpdinstall_tasks.yml 
    - name: install apr
      shell: > 
        cd {{ path }}/apr-1.7.0/ && 
        ./configure --prefix=/usr/local/apr &&
        make && 
        make install &&
        cd ..
    
    - name: install apr-util
      shell: > 
        cd {{ path }}/apr-util-1.6.1/ && 
        ./configure 
        --prefix=/usr/local/apr-util 
        --with-apr=/usr/local/apr &&
        make && 
        make install &&
        cd ..
    
    - name: install apr
      shell: > 
        cd {{ path }}/httpd-2.4.46/ &&
        ./configure --prefix=/usr/local/apache 
        --sysconfdir=/etc/httpd24
        --enable-so 
        --enable-ssl 
        --enable-cgi 
        --enable-rewrite 
        --with-zlib 
        --with-pcre 
        --with-apr=/usr/local/apr 
        --with-apr-util=/usr/local/apr-util/ 
        --enable-modules=most 
        --enable-mpms-shared=all 
        --with-mpm=prefork &&
        make && 
        make install &&
        cd ..
    
    - name: environment config
      shell: >
        echo 'export PATH=/usr/local/apache/bin:$PATH' > /etc/profile.d/httpd.sh &&
        source /etc/profile.d/httpd.sh
    
    
    • httpd配置文件模板需要更改的地方
    # If your host doesn't have a registered DNS name, enter its IP address here.
    #
    ServerName www.example.com:80 #取消注释
    
    <IfModule dir_module>
        DirectoryIndex index.php index.html #该行添加index.php
    </IfModule>
    
        AddType application/x-compress .Z
        AddType application/x-gzip .gz .tgz
        #添加下面这两行
        AddType application/x-httpd-php .php 
        AddType application/x-httpd-php-source .phps
    
    LoadModule proxy_module modules/mod_proxy.so #取消注释
    #LoadModule proxy_connect_module modules/mod_proxy_connect.so
    #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
    #LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so #取消注释
    
    
    <VirtualHost *:80> #添加虚拟主机
        DocumentRoot "/usr/local/apache/htdocs/"
        ServerName phptest.com
        ProxyRequests Off
        ProxyPassMatch ^/(.*.php)$ fcgi://192.168.94.144:9000/var/www/html/$1
        <Directory "/usr/local/apache/htdocs/">
            Options none
            AllowOverride none
            Require all granted
        </Directory>
    </VirtualHost>
    
    
    1. httpd服务安装剧本
    [root@node0 apache]# cat httpd.yml 
    ---
    - name: deploy
      gather_facts: no
      hosts: node1
      vars_files: ./host_vars/node1 #指定变量文件位置
      tasks:
        - name: apacheuser add 
          user:
            name: '{{ username }}' # 用户创建
            shell: /sbin/nologin
            create_home: false
            system: true
    
        - name: deploy environment #安装依赖包
          yum:
            name: '{{ packages }}'
            state: present
                            
        - name: copy httpd file #部署软件包
          copy: 
            src: ./packages/
            dest: '{{ path }}' #变量为opt,则复制到opt目录下
    
        - name: uzip file #调用变量path,切换该目录解压
          shell: > 
            cd {{ path }} && 
            tar xf apr-1.7.0.tar.gz && 
            tar xf apr-util-1.6.1.tar.gz && 
            tar xf httpd-2.4.46.tar.bz2
    
        - name: httpd install #安装httpd选择导入任务文件
          import_tasks: ./tasks/httpdinstall_tasks.yml
            
        - name: symbolic link create 
          file: #调用file模块创建软连接
            src: /usr/local/apache/include
            dest: /usr/local/include/httpd
            state: link
    
        - name: httpd-php config
          template: #调用配置好的httpd模板文件
            src: ./template/httpd.conf.j2
            dest: /etc/httpd24/httpd.conf
            backup: yes
    
        - name: start service 
          shell: "/usr/local/apache/bin/apachectl start"
    
    
    • 运行剧本
    [root@node0 apache]# ansible-playbook  httpd.yml
    //查看端口
    [root@node0 apache]# ansible node1 -a 'ss -antl'
    node1 | CHANGED | rc=0 >>
    State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    
    LISTEN    0         128                0.0.0.0:22               0.0.0.0:*       
    LISTEN    0         128                      *:80                     *:*       
    LISTEN    0         128                   [::]:22                  [::]:*       
    
    

    mysql安装部署

    1. mysql目录结构
    [root@node0 mysql]# tree .
    .
    ├── chpass.yml
    ├── host_vars
    │   ├── node2
    │   └── pass.yml
    ├── mysql.yml
    ├── packages
    │   └── mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
    └── tasks
        └── mysqlstart_task.yml
    
    
    • node2定义的变量
    //定义的变量
    [root@node0 mysql]# cat host_vars/node2 
    username: mysql 
    path: /opt/data #定义数据库数据存放位置
    pkgpath: /root/ #定义安装包存放位置
    packages:
      - "ncurses-devel"
      - "openssl-devel"
      - openssl
      - cmake
      - "mariadb-devel"
      - gcc
      - "gcc-c++"
      - "ncurses-compat-libs*"
    
    
    //定义的机密变量
    [root@node0 mysql]# ansible-vault view host_vars/pass.yml 
    Vault password: (123456)
    ---
    password: fxx123 #定义机密变量password为mysql新密码
    
    
    1. mysql服务安装剧本
    [root@node0 mysql]# cat mysql.yml 
    ---
    - name: deploy
      vars_files:
        - ./host_vars/pass.yml
        - ./host_vars/node2
      hosts: node2
      tasks:
        - name: mysqluser add 
          user:
            name: '{{ username }}' 
            shell: /sbin/nologin
            create_home: false
            system: true
    
        - name: deploy environment 
          yum: 
            name: '{{ packages }}'
            state: present
    
        - name: copy mysql to node2 
          copy:
            src: ./packages/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
            dest: '{{ pkgpath }}' #调用包路径变量
    
        - name: unzip mysql #解压包
          shell: 'tar xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /usr/local/'
    
        - name: create symbolic link1 #创建软连接
          file:
            src: /usr/local/mysql-5.7.31-linux-glibc2.12-x86_64
            dest: /usr/local/mysql
            owner: mysql
            group: mysql
            state: link
    
        - name: create symbolic link2 #创建软连接
          file:
            src: /usr/local/mysql-5.7.31-linux-glibc2.12-x86_64/include
            dest: /usr/local/include/mysql
            state: link
    
        - name: create data directory #创建数据存放目录
          file:
            path: '{{ path }}' 
            state: directory
            mode: '0755'
    
        - name: change ownership #更改目录属主组为mysql
          shell: 'chown -R mysql:mysql /usr/local/mysql* && chown -R mysql:mysql /opt/data/'
                                                                                                
        - name: environment variable #配置环境变量
          shell: >
            echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh &&
            source /etc/profile.d/mysql.sh
                                                                                
        - name: mysql config
          lineinfile:
            path: /etc/my.cnf
            line: |
              [mysqld]
              basedir = /usr/local/mysql
              datadir = {{ path }}
              socket = /tmp/mysql.sock
              port = 3306
              pid-file = {{ path }}/mysql.pid
              user = mysql
              skip-name-resolve
            state: present
    
        - name: man config
          lineinfile:
            path: /etc/man_db.conf
            line: 'MANDATORY_MANPATH                       /usr/local/mysql/man'
            state: present
    
        - name: start service
          import_tasks: ./tasks/mysqlstart_task.yml
    
        - name: change mysql pass
          shell: /usr/local/mysql/bin/mysql -uroot -p"$(awk '/password/{print$NF}' /root/.sql)" --connect-expired-password -e "set password = password("{{ password }}");"
    
    
    • 运行剧本
    //运行剧本(调用机密文件)
    [root@node0 mysql]# ansible-playbook --vault-id @prompt mysql.yml
    Vault password (default): 
    
    PLAY [deploy] *******************************************************************************************************
    
    TASK [Gathering Facts] **********************************************************************************************
    ok: [node2]
    
    TASK [mysqluser add] ************************************************************************************************
    ok: [node2]
    
    TASK [deploy environment] *******************************************************************************************
    ok: [node2]
    
    TASK [copy mysql to node2] ******************************************************************************************
    ok: [node2]
    
    TASK [unzip mysql] **************************************************************************************************
    [WARNING]: Consider using the unarchive module rather than running 'tar'.  If you need to use command because
    unarchive is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in
    ansible.cfg to get rid of this message.
    changed: [node2]
    
    TASK [create symbolic link1] ****************************************************************************************
    changed: [node2]
    
    TASK [create symbolic link2] ****************************************************************************************
    ok: [node2]
    
    TASK [create data directory] ****************************************************************************************
    ok: [node2]
    
    TASK [change ownership] *********************************************************************************************
    [WARNING]: Consider using the file module with owner rather than running 'chown'.  If you need to use command
    because file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in
    ansible.cfg to get rid of this message.
    changed: [node2]
    
    TASK [environment variable] *****************************************************************************************
    changed: [node2]
    
    TASK [mysql config] *************************************************************************************************
    changed: [node2]
    
    TASK [man config] ***************************************************************************************************
    ok: [node2]
    
    TASK [lib config] ***************************************************************************************************
    changed: [node2]
    
    TASK [copy mysql.server] ********************************************************************************************
    changed: [node2]
    
    TASK [mysqld config] ************************************************************************************************
    [WARNING]: Consider using the replace, lineinfile or template module rather than running 'sed'.  If you need to use
    command because replace, lineinfile or template is insufficient you can add 'warn: false' to this command task or
    set 'command_warnings=False' in ansible.cfg to get rid of this message.
    changed: [node2]
    
    TASK [initialize mysql & get pass] **********************************************************************************
    changed: [node2]
    
    TASK [change mysql pass] ********************************************************************************************
    changed: [node2]
    
    PLAY RECAP **********************************************************************************************************
    node2                      : ok=17   changed=10   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    //查看端口验证
    [root@node0 mysql]# ansible node2 -m shell -a 'ss -antl'
    node2 | CHANGED | rc=0 >>
    State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    
    LISTEN    0         128                0.0.0.0:22               0.0.0.0:*       
    
    

    php安装

    1. php目录结构
    [root@node0 php]# tree .
    .
    ├── gpgkeys
    │   └── RPM-GPG-KEY-EPEL-8
    ├── packages
    │   └── epel-release-latest-8.noarch.rpm
    └── php.yml
    
    
    1. php剧本
    [root@node0 php]# cat php.yml 
    ---
    - name: php install
      gather_facts: no
      hosts: node3
      tasks:
        - name: copy key 
          copy:
            src: ./gpgkeys/RPM-GPG-KEY-EPEL-8
            dest: /etc/pki/rpm-gpg/
    
        - name: install tools
          dnf: 
            name: '@Development Tools'
            state: present
    
        - name: install dependence packages
          dnf:
            name: '{{ item }}'
            state: present
          loop:      
            - libxml2
            - 'libxml2-devel'
            - openssl
            - 'openssl-devel'
            - bzip2
            - 'bzip2-devel'
            - libcurl
            - 'libcurl-devel'
            - 'libicu-devel'
            - libjpeg 
            - 'libjpeg-devel'
            - libpng
            - 'libpng-devel'
            - 'openldap-devel'
            - 'pcre-devel'
            - freetype
            - 'freetype-devel'
            - gmp
            - 'gmp-devel'
            - libmcrypt
            - 'libmcrypt-devel'
            - readline
            - 'readline-devel'
            - libxslt
            - 'libxslt-devel' 
            - mhash
            - 'mhash-devel' 
            - 'php-mysqlnd'
    
        - name: install php
          dnf:
            name: php-*
            state: present
    
        - name: start php
          shell: 'systemctl enable --now php-fpm'
    
        - name: add listen socket
          lineinfile:
            path: /etc/php-fpm.d/www.conf
            regexp: '^listen ='
            line: listen = 0.0.0.0:9000
    
        - name: create php testpage
          shell: 'echo -e "<?php
    	phpinfo();
    ?>" > /var/www/html/index.php'
    
        - name: change owner
          shell: 'chown -R apache:apache /var/www/html/'
    
    - name: phpconfig
      hosts: node1,node3
      tasks:
        - name: add listen client
          lineinfile:
            path: /etc/php-fpm.d/www.conf
            regexp: '^listen.allowed_clients ='
            line: listen.allowed_clients = {{ hostvars['node1']['ansible_default_ipv4']['address'] }}
          ignore_errors: yes
    
    
    - name: restart php 
      gather_facts: no
      hosts: node3
      tasks:
        - name: restart service
          service: 
            name: php-fpm
            state: restarted
    
    - name: restart httpd
      gather_facts: no
      hosts: node1
      tasks:
        - name: restart apache
          shell: "/usr/local/apache/bin/apachectl restart"
    
    
    • 测试验证
  • 相关阅读:
    中国广电工信战争
    围观一个People Search
    Popular榜单能做到小众化吗?
    校园招聘:内地大学生的视野和实践有问题吗?
    锐推榜的平衡策略
    PyQt 自定义信号带参数 emit
    Python pyinstaller
    Python 匿名函数 lambda
    PyQT5 绑定函数的传参(connect 带参数)
    Excel 一列文本变为数字
  • 原文地址:https://www.cnblogs.com/fangxinxin/p/14260341.html
Copyright © 2011-2022 走看看