ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Ansible和HTTP

2022-05-30 02:01:19  阅读:143  来源: 互联网

标签:10.0 HTTP name websrvs ansible Ansible mysql data


一、ansible常用模块介绍

常用模块帮助文档参考:

https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html

常用模块使用说明如下:

  1. command模块

    功能:在远程主机上执行命令,此为默认模块,可忽略-m选项

    注意:此命令不支持$VARNAME<>|;&等,可用shell模块实现

    注意:此模块不具有幂等性

    范例:

    ansible websrvs -m command -a 'service vfstpd start'
    ansible websrvs -m command -a 'echo root|passwd --stdin 123456'
    ansible websrvs -m command -a 'rm -rf /data/'
    ansible websrvs -m command -a 'echo hello > /data/hello.log'
    ansible websrvs -m command -a "echo $HOSTNAME"
    
  2. shell模块

    功能:和command模块相似,用shell执行命令,支持各种符号,比如:*,$,>

    注意:此模块不具有幂等性

    范例:

    ansible websrvs -m shell -a "echo $HOSTNAME"
    ansible websrvs -m shell -a 'echo $HOSTNAME'
    ansible websrvs -m shell -a 'echo root | passwd --stdin 123456'
    ansible websrvs -m shell -a 'ls -l /etc/shadow'
    ansible websrvs -m shell -a 'echo hello > /data/hello.log'
    ansible websrvs -m shell -a 'cat /data/hello.log'
    

    注意:调佣bash执行命令,类似cat /tmp/test.cmd | awk -F'|' '{print $1,$2}' &>/tmp/example.txt这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器

    范例:将shell模块代替command,设为默认模块

    vim /etc/ansible/ansible.cfg
    #修改下面一行
    module_name=shell
    
  3. script模块

    功能:在远程主机上运行ansilbe服务器上的脚本(无需脚本具有执行权限)

    注意:此模块不具有幂等性

    范例:

    ansible websrvs -m script -a /data/test.sh
    
  4. copy模块

    功能:从ansible服务器主控端复制文件至远程主机

    注意:src=file 如果没指明路径,则为当前目录或当前目录下的files目录下的file文件

    范例:

    #如目标存在,默认覆盖,此次指定先备份
    ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes"
    #指定内容,直接生成目标文件
    ansible websrvs -m copy -a "content='test line1\ntest line2\n' dest=/tmp/test.txt"
    
    #复制/etc目标本身,注意/etc后面没有/
    ansible websrvs -m copy -a "src=/etc dest=/backup"
    #复制/etc/下的文件,不包括/etc目录自身,注意/etc/后面有/
    ansible websrvs -m copy -a "src=/etc/ dest=/backup"
    
  5. get_url模块

    功能:用于将文件从HTTP、HTTPS或FTP下载到被管理机节点上

    常用参数如下:

    url: 下载文件的URL,支持HTTP,HTTPS或FTP协议
    dest: 下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
    owner:指定属主
    group:指定属组
    mode:指定权限
    force: 如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件
    checksum: 对目标文件在下载后计算摘要,以确保其完整性
               示例: checksum="sha256:D98291AC[...]B6DC7B97",
                    checksum="sha256:http://example.com/path/sha256sum.txt"
    url_username: 用于HTTP基本认证的用户名。 对于允许空密码的站点,此参数可以不使用url_username
    url_password: 用于HTTP基本认证的密码。 如果未指定`url_username'参数,则不会使用url_password参数
    validate_certs:如果“no”,SSL证书将不会被验证。 适用于自签名证书在私有网站上使用
    timeout: URL请求的超时时间,秒为单位
    

    范例:

    ansible websrvs -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/nginx.tar.gz checksum="md5:b2d33d24d89b8b1f87ff5d251aa27eb8"'
    
  6. fetch模块

    功能:从远程主机提取文件至ansible的主控端,与copy相反,目前不支持目录

    范例:

    ansible websrvs -m fetch -a 'src=/root/test.sh dest=/data/scripts'
    
  7. file模块

    功能:设置文件属性,创建软链接等

    范例:

    #创建文件
    ansible all -m file -a 'path=/data/test1.txt state=touch'
    ansible all -m file -a 'path=/data/test2.log state=absent'
    ansible all -m file -a 'path=/data/test3.sh owner=root mode=755'
    #创建目录
    ansible all -m file -a 'path=/data/mysql state=directory owner=mysql group=mysql'
    #创建软链接
    ansible all -m file -a 'src=/data/testfile path=/data/testfile-link state=link'
    #创建目录
    ansible all -m file -a 'path=/data/testdir state=directory'
    #递归修改目录属性,但不递归至子目录
    ansible all -m file -a 'path=/data/testdir state=directory owner=test group=test'
    #递归修改目录及子目录的属性
    ansible all -m file -a 'path=/data/testdir state=directory owner=test group=test recurse=yes'
    
  8. stat模块

    功能:检查文件或文件系统的状态

    注意:对于windows目标,请使用win_stat模块

    选项:

    path:文件/对象的完整路径(必须)
    

    常用的返回值判断:

    exists:判断是否存在
    isuid:调用用户的ID与所有者ID是否匹配
    

    范例:

    [root@master ~]# ansible 127.0.0.1 -m stat -a 'path=/etc/passwd'
    127.0.0.1 | SUCCESS => {
        "changed": false, 
        "stat": {
            "atime": 1653664578.5329995, 
            "attr_flags": "", 
            "attributes": [], 
            "block_size": 4096, 
            "blocks": 8, 
            "charset": "us-ascii", 
            "checksum": "15c497413c76cac5d7aae22f6d643a1ae0fa72b2", 
            "ctime": 1650713473.118016, 
            "dev": 64769, 
            "device_type": 0, 
            "executable": false, 
            "exists": true, 
            "gid": 0, 
            "gr_name": "root", 
            "inode": 17717276, 
            "isblk": false, 
            "ischr": false, 
            "isdir": false, 
            "isfifo": false, 
            "isgid": false, 
            "islnk": false, 
            "isreg": true, 
            "issock": false, 
            "isuid": false, 
            "mimetype": "text/plain", 
            "mode": "0644", 
            "mtime": 1650713473.1170158, 
            "nlink": 1, 
            "path": "/etc/passwd", 
            "pw_name": "root", 
            "readable": true, 
            "rgrp": true, 
            "roth": true, 
            "rusr": true, 
            "size": 1116, 
            "uid": 0, 
            "version": "1248249178", 
            "wgrp": false, 
            "woth": false, 
            "writeable": true, 
            "wusr": true, 
            "xgrp": false, 
            "xoth": false, 
            "xusr": false
        }
    }
    
    
  9. unarchive模块

    功能:解包解压缩

    实现有两种用法:

    1. 将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略
    2. 将远程主机上的压缩包解压缩到指定目录下,设置copy=no

    常见参数:

    copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,若copy=no,会在远程主机寻找src源文件
    remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
    src:源路径,可以是ansible主机的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机的路径,则需要设置copy=no
    dest:远程主机上的目标路径
    mode:设置解压缩后的文件权限
    

    范例:

    ansible all -m unarchive -a 'src=/data/ansible-20210521.tar dest=/opt owner=shichu group=shichu'
    ansible all -m unarchive -a 'src=/data/ansible-20210521.tar dest=/opt copy=no mode=0777'
    ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
    ansible websrvs -m unarchive -a 'src=https://releases.ansible.com/ansible/ansible-2.1.6.0-0.1.rc1.tar.gz dest=/data/ owner=root remote_src=yes'
    ansible websrvs -m unarchive -a 'src=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/ copy=no'
    
  10. archive模块

    功能:压缩打包保存至远程主机

    范例:

    ansible websrvs -m archive -a 'path=/var/log dest=/opt/log.tar format=tar owner=shichu mode=0600'
    
  11. hostname模块

    功能:设置远程主机的主机名

    范例:

    ansible websrvs -m hostname -a "name=websrv"
    
  12. cron模块

    功能:计划任务

    支持时间:minute,hour,day,month,weekday

    范例:

    #备份数据库脚本
    cat /root/mysql_backup.sh
    #!/bin/bash
    mysqldump -A -F --single-transaction --master-data=2 -q -uroot |gzip > /data/mysql_`date +%F_%T`.sql.gz
    
    #创建任务
    ansible websrvs -m cron -a "minute=*/5 job='/usr/bin/chronyc sources -v &>/dev/null' name=Synctime"
    
    #禁用任务计划
    ansible websrvs -m cron -a "minute=*/5 job='/usr/bin/chronyc sources -v &>/dev/null' name=Synctime disabled=yes"
    
    #启用任务
    ansible websrvs -m cron -a "minute=*/5 job='/usr/bin/chronyc sources -v &>/dev/null' name=Synctime disabled=no"
    
    #删除任务
    ansible websrvs -m cron -a "name=Synctime state=absent"
    
  13. yum和apt模块

    功能:

    yum管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其他版本

    apt管理Debian相关版本的软件包

    范例:

    #安装
    ansible websrvs -m yum -a 'name=httpd state=present'
    
    #启用epel源安装
    ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel'
    
    #升级除kernel和foo开头以外的所有包
    ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*'
    
    #删除
    ansible websrvs -m yum -a 'name=httpd state=absent'
    
  14. yum_repository模块

    功能:管理远程主机上的yum仓库

    参数:

    name:相当于.repo文件定义中括号的[仓库ID]
    baseurl:相当于.repo文件中baseurl
    description:相当于.repo文件中的name
    file:相当于.repo文件的名称,不使用时默认以name加.repo命令
    enabled=yes|no:相当于.repo文件中enabled
    gpgcheck=yes|no:相当于.repo文件中gpgcheck
    gpgcakey:前提是gpgcheck=yes,相当于.repo文件中gpgkey,验证gpg公钥
    state=present|absent:默认present,absent表示删除
    

    范例:

    #创建e阿里云pel源
    ansible websrvs -m yum_repository -a 'name=aliepel baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ enabled=yes gpgcheck=yes gpgcakey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7 state=present file=AlicloudEpel'
    
    #删除阿里云epel源
    ansible websrvs -m yum_repository -a 'file=AlicloudEpel name=aliepel state=absent'
    
  15. service模块

    功能:管理服务

    范例:

    ansible websrvs -m service -a 'name=httpd state=started enabled=yes'
    ansible websrvs -m service -a 'name=httpd state=stopped'
    ansible websrvs -m service -a 'name=httpd state=reloaded'
    
  16. user模块

    功能:管理用户

    范例:

    #创建用户
    ansible websrvs -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
    ansible websrvs -m user -a 'name=nginx comment=nginx uid=88 group=nginx groups="root,daemon" shell=/sbin/nologin system=yes create_home=no home=/data/nginx non_unique=yes'
    
    #remove=yes表示删除用户及家目录等数据,默认remove=no
    ansible websrvs -m user -a 'name=nginx state=absent remove=yes'
    
  17. group模块

    功能:管理组

    范例:

    #创建组
    ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
    
    #删除组
    ansible websrvs -m group -a 'name=nginx state=absent'
    
  18. lineinfile模块

    ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法支持进程替换。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换。

    一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块

    regexp参数:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后被匹配到的那行文本才会被替换,当删除文件时,如果有多行文本都能被匹配,那么这些行都会被删除。

    如果想进行多行匹配进行替换需要使用replace模块

    功能:相当于sed,可以修改文件内容

    范例:

    ansible websrvs -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"
    
    ansible websrvs -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
    
    ansible websrvs -m lineinfile -a 'path=/etc/fstab state=absent regexp="^#"'
    
  19. replace模块

    功能:该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用

    范例:

    ansible websrvs -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"  
    ansible websrvs -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"
    
  20. selinux模块

    功能:管理SELinux策略

    范例:

    ansible websrvs -m selinux -a 'state=disabled'
    
  21. reboot模块

    功能:重启远程主机

    范例:

    ansible websrvs -m reboot
    
  22. mount模块

    功能:挂载和卸载文件系统

    范例:

    #临时挂载
    mount websrvs -m mount -a 'src="UUID=b3e48f45-f933-4c8e-a700-22a159ec9077" path=/home fstype=xfs opts=noatime state=present'
    
    #临时取消挂载
    mount websrvs -m mount -a 'path=/home fstype=xfs opts=noatime state=unmounted'
    
    #永久挂载
    ansible websrvs -m mount -a 'src=10.0.0.44:/data/wordpress path=/var/www/html/wp/content/uploads opts="_netdev" state=mounted'
    
    #永久卸载
    ansible websrvs -m mount -a 'src=10.0.0.44:/data/wordpress path=/var/www/html/wp/content/uploads state=absent'
    
  23. setup模块

    功能:setup模块来收集主机的系统信息,这些facts信息可以直接以变量的形式使用,但如果主机较多,会影响执行速度

    注意:可以使用gather_facts: no来禁止ansible收集facts信息

    范例:

    ansible all -m setup
    ansible all -m setup -a "filter=ansible_nodename"
    ansible all -m setup -a "filter=ansible_hostname"
    ansible all -m setup -a "filter=ansible_domain"
    ansible all -m setup -a "filter=ansible_memtotal_mb"
    ansible all -m setup -a "filter=ansible_memory_mb"
    ansible all -m setup -a "filter=ansible_memfree_mb"
    ansible all -m setup -a "filter=ansible_os_family"
    ansible all -m setup -a "filter=ansible_distribution_major_version"
    ansible all -m setup -a "filter=ansible_distribution_version"
    ansible all -m setup -a "filter=ansible_processor_vcpus"
    ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
    ansible all -m setup -a "filter=ansible_architecture"
    ansible all -m setup -a "filter=ansible_uptime_seconds"
    ansible all -m setup -a "filter=ansible_processor*"
    ansible all -m setup -a 'filter=ansible_env'
    
  24. debug模块

    功能:此模块可以用于输出信息,并且通过msg定制输出信息内容

    注意:msg后面的变量有时需要加""引起来

    范例:

    #debug模块默认输出Hello world
    [root@master ~]# ansible websrvs -m debug
    10.0.0.45 | SUCCESS => {
        "msg": "Hello world!"
    }
    10.0.0.44 | SUCCESS => {
        "msg": "Hello world!"
    
    # 利用debug 模块输出变量
    [root@master playbook]# cat debug.yaml 
    - hosts: websrvs
      
      tasks:
        - name: output variables
          debug:
            msg: Host "{{ ansible_nodename }}" IP "{{ ansible_default_ipv4.address}}"
    [root@master playbook]# ansible-playbook debug.yaml 
    
    PLAY [websrvs] ***********************************************************************************************
    
    TASK [Gathering Facts] ***************************************************************************************
    ok: [10.0.0.44]
    ok: [10.0.0.45]
    
    TASK [output variables] **************************************************************************************
    ok: [10.0.0.45] => {
        "msg": "Host \"client2\" IP \"10.0.0.45\""
    }
    ok: [10.0.0.44] => {
        "msg": "Host \"client1\" IP \"10.0.0.44\""
    }
    
    PLAY RECAP ***************************************************************************************************
    10.0.0.44                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    10.0.0.45                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
    
    #显示字符串特定字符
    [root@master playbook]# cat debug-2.yaml 
    - hosts: websrvs
      gather_facts: no
      vars:
        a: "12345"
      tasks:
        - debug:
            msg: "{{a[2]}}"
    
    [root@master playbook]# ansible-playbook debug-2.yaml 
    
    PLAY [websrvs] ***********************************************************************************************
    
    TASK [debug] *************************************************************************************************
    ok: [10.0.0.45] => {
        "msg": "3"
    }
    ok: [10.0.0.44] => {
        "msg": "3"
    }
    
    PLAY RECAP ***************************************************************************************************
    10.0.0.44                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    10.0.0.45                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    

二、ansible-playbook实现MySQL的二进制部署

palybook官方文档:
https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html#playbook-keywords

palybook组件说明

一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:
Hosts 执行的远程主机列表
Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
Variables 内置变量或自定义变量在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

准备条件:

开启ssh免密登录
ssh-keygen
ssh-copy-id 127.0.0.1
scp -r ~/.ssh 10.0.0.44:~/
下载mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz文件至/opt目录下
提前生成my.cnf配置文件至/opt目录下

my.cnf配置文件

[root@master opt]# cat my.cnf 
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid

[client]
port=3306
socket=/data/mysql/mysql.sock

mysql5.7安装脚本

[root@master opt]# cat install_mysql.yml 
# install mysql5.7
- hosts: 10.0.0.44
  remote_user: root
  gather_facts: no
  vars:
     version: "mysql-5.7.33-linux-glibc2.12-x86_64"
     suffix: "tar.gz"
     file: "{{version}}.{{suffix}}"

  tasks: 
    - name: 安装依赖包
      yum: name=libao,numactl-libs
    - name: 新增mysql组
      group: name=mysql
    - name: 新增mysql用户
      user: name=mysql group=mysql shell=/bin/false
    - name: 解包
      unarchive: src=/opt/{{file}} dest=/usr/local copy=yes
    - name: 创建链接
      file: src=/usr/local/{{version}} path=/usr/local/mysql state=link
    - name: 修改属组
      file: path=/usr/local/mysql state=directory owner=mysql group=mysql recurse=yes
    - name: 配置环境变量
      copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
    - name: 环境变量生效
      shell: source /etc/profile.d/mysql.sh
    - name: 创建mysql目录
      file: path=/data/mysql state=directory
    - name: 生成mysql配置文件
      copy: src=/opt/my.cnf dest=/etc/ backup=yes
    - name: 初始化数据库,生成root空密码
      shell: mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
    - name: 准备服务脚本
      shell: /usr/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    - name: 启动服务
      service: name=mysqld state=started enabled=yes

ansible-playbook执行过程

[root@master opt]# ansible-playbook install_mysql.yml 

PLAY [10.0.0.44] ********************************************************************************************************************

TASK [安装依赖包] ************************************************************************************************************************
changed: [10.0.0.44]

TASK [新增mysql组] *********************************************************************************************************************
changed: [10.0.0.44]

TASK [新增mysql用户] ********************************************************************************************************************
changed: [10.0.0.44]

TASK [解包] ***************************************************************************************************************************
changed: [10.0.0.44]

TASK [创建链接] *************************************************************************************************************************
changed: [10.0.0.44]

TASK [修改属组] *************************************************************************************************************************
changed: [10.0.0.44]

TASK [配置环境变量] ***********************************************************************************************************************
changed: [10.0.0.44]

TASK [环境变量生效] ***********************************************************************************************************************
changed: [10.0.0.44]

TASK [创建mysql目录] ********************************************************************************************************************
changed: [10.0.0.44]

TASK [生成mysql配置文件] ******************************************************************************************************************
changed: [10.0.0.44]

TASK [初始化数据库] ***********************************************************************************************************************
changed: [10.0.0.44]

TASK [准备服务脚本] ***********************************************************************************************************************
changed: [10.0.0.44]

TASK [启动服务] *************************************************************************************************************************
[WARNING]: The service (mysqld) is actually an init script but the system is managed by systemd
changed: [10.0.0.44]

PLAY RECAP **************************************************************************************************************************
10.0.0.44                  : ok=13   changed=13   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


登录远程主机查看mysql是否成功安装

[root@client1 ~]# systemctl status mysqld
● mysqld.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
   Active: active (running) since Sun 2022-05-29 22:50:50 CST; 1min 23s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2226 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mysqld.service
           ├─2236 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql.pid
           └─2388 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/p...

May 29 22:50:49 shichu systemd[1]: Starting LSB: start and stop MySQL...
May 29 22:50:50 shichu mysqld[2226]: Starting MySQL. SUCCESS!
May 29 22:50:50 shichu systemd[1]: Started LSB: start and stop MySQL.
[root@shichu ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.33 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

三、Ansible playbook实现apache批量部署,并对不同主机提供以各自IP地址为内容的index.html

注意:

template文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级,目录结构如下示例:

  1. httpd.yml脚本配置
[root@master data]# cat httpd.yml 
- hosts: websrvs
  remote_user: root

  tasks: 
    - name: install httpd
      yum: name=httpd
    - name: template config
      template: src=httpd.conf.j2 dest=/var/www/html/index.html
    - name: start service
      service: name=httpd state=started enabled=yes
  1. httpd.conf.j2模板配置

Jinja2官方中文文档:

http://docs.jinkan.org/docs/jinja2/

https://www.w3cschool.cn/yshfid/

[root@master data]# cat templates/httpd.conf.j2 
hostname {{ansible_hostname}}
  1. 执行ansible-playbook命令
[root@master data]# ansible-playbook httpd.yml 

PLAY [websrvs] **********************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
ok: [10.0.0.45]
ok: [10.0.0.44]

TASK [install httpd] ****************************************************************************************************************
ok: [10.0.0.45]
changed: [10.0.0.44]

TASK [template config] **************************************************************************************************************
changed: [10.0.0.45]
changed: [10.0.0.44]

TASK [start service] ****************************************************************************************************************
changed: [10.0.0.45]
changed: [10.0.0.44]

PLAY RECAP **************************************************************************************************************************
10.0.0.44                  : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.0.0.45                  : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master data]# curl 10.0.0.44
hostname client1
[root@master data]# curl 10.0.0.45
hostname client2
[root@master data]# 

  1. 测试

访问不同主机,显示内容不同

四、http的报文结构和状态码总结

http报文由三个部分组成,即开始行首部行实体主体

HTTP请求报文结构

在请求报文中,开始行是请求行

request报文格式

<method> <request-URL> <version>
<headers>
<entity-body>

范例:

GET / HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Cookie: 
Host: www.baidu.com
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

HTTP响应报文结构

在响应报文中,开始行是状态行

状态行包括三项内容,即HTTP版本状态码,以及解释状态码的简单短语

response报文格式

<version> <status> <reason-phrase>
<headers>
<entity-body>

范例:

HTTP/1.1 200 OK
Bdpagetype: 2
Bdqid: 0xb3280c990017df87
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Sun, 29 May 2022 17:18:33 GMT
Expires: Sun, 29 May 2022 17:18:32 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=363; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=36429_36454_31253_34812_36424_36165_36487_36055_36235_26350_36467_36314; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1653844713060698701812909582183128620935
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked

状态码总结

http协议状态码分类

1xx:100-101 信息提示
2xx:200-206 成功
3xx:300-307 重定向
4xx:400-415 错误类信息,客户端错误
5xx:500-505 错误类信息,服务器端错误

http协议常用状态码

200:成功,请求数据通过响应报文的entity-body部分发送;OK
301:请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置:Moved Permanently
302:响应报文Location指明资源临时新位置 Moved Temporarily
304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端:Not Modified
307:浏览器内部重定向
401:需要输入账户和密码认证方能访问资源:Unauthorized
403:请求被禁止:Forbidden
404:服务器无法找到客户端请求的资源:Not Found
500:服务器内部错误:Internal Server Error
502:代理服务器从后端服务器收到了一天伪响应,如无法连接到网关:Bad Gateway
503:服务不可用,临时服务器维护或过载,服务器无法处理请求
504:网关超时

标签:10.0,HTTP,name,websrvs,ansible,Ansible,mysql,data
来源: https://www.cnblogs.com/areke/p/16300573.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有