1、ansible-playbook實現(xiàn)MySQL的二進制部署
1.1 安裝ansible
# yum -y install ansible
1.2 配置主機清單文件
# vi /etc/ansible/hosts
[local]
10.0.0.7? ? ansible_connection=local? ? #指定連接類型為本地捍掺,無需通過ssh連接
[mysql]
10.0.0.17
10.0.0.27
10.0.0.37
1.3 mysql配置文件
# cat /apps/mysql/my.cnf
[mysqld]
user=mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
innodb_file_per_table=on
skip_name_resolve = on #禁止主機名解析锡垄,建議使用
[client]
port=3306
socket=/data/mysql/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/data/mysql/mysql.pid
2江解、ssh免密授權(quán)
2.1 使用腳本實現(xiàn)
# bash ssh_key.sh
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:laHw87m60FI35AeBGdv5NhU8PW4Ol77WFPssLZK+LEY root@7-1
The key's randomart image is:
+---[RSA 2048]----+
|? ? ? . .+o? ... |
|? ? ? oo+ =? oo.|
|? ? ? ? = B? o.o|
|? ? ? ? * + o * |
|? ? ? ? S * = * o|
|? ? ? o .E= . +.|
|? ? ? o ...? . ++|
|? ? ? o .o.o oo=|
|? ? ? ? oo o+o.o |
+----[SHA256]-----+
sshpass-1.06-2.el7.x86_64
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Number of key(s) added: 1
Now try logging into the machine, with:? "ssh -o 'StrictHostKeyChecking=no' '10.0.0.7'"
and check to make sure that only the key(s) you wanted were added.
ssh: connect to host 10.0.0.3 port 22: Connection refused
lost connection
ssh: connect to host 10.0.0.3 port 22: Connection refused
lost connection
known_hosts? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 100% 1195? 619.5KB/s? 00:00? ?
known_hosts? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 100% 1195? ? 1.1MB/s? 00:00? ?
known_hosts? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 100% 1195? 604.3KB/s? 00:00? ?
known_hosts? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 100% 1195? ? 1.8MB/s? 00:00? ?
known_hosts? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 100% 1195? ? 1.6MB/s? 00:00? ?
known_hosts? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 100% 1195? ? 1.5MB/s? 00:00? ?
known_hosts? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2.2 ssh健康性檢查
# ansible mysql -m ping
10.0.0.7 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
10.0.0.17 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
10.0.0.37 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
10.0.0.27 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
2.創(chuàng)建mysql角色相關(guān)的文件
[root@ansible mysql]#pwd
/data/ansible/roles/mysql
[root@ansible mysql]#tree
.
├── files
│? ├── my.cnf
│? └── mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
├── tasks
│? ├── config.yml
│? ├── data.yml
│? ├── group.yml
│? ├── install.yml
│? ├── linkfile.yml
│? ├── main.yml
│? ├── path.yml
│? ├── script.yml
│? ├── secure.yml
│? ├── service.yml
│? ├── unarchive.yml
│? └── user.yml
└── vars
? ? └── main.yml
3 directories, 15 files
[root@ansible mysql]#ls files/
my.cnf? mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
[root@ansible mysql]#vim files/my.cnf
[mysqld]
explicit_defaults_for_timestamp=true
server-id=1
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
[mysqld_safe]
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
[root@ansible mysql]#vim vars/main.yml
mysql_version: 5.7.36
mysql_file: mysql-{{mysql_version}}-linux-glibc2.12-x86_64.tar.xz
mysql_root_password: 123456
#main.yml 是task的入口文件
[root@ansible mysql]#vim tasks/main.yml
- include: install.yml
- include: group.yml
- include: user.yml
- include: unarchive.yml
- include: linkfile.yml
- include: data.yml
- include: config.yml
- include: script.yml
- include: path.yml
- include: service.yml
- include: secure.yml
[root@ansible mysql]#vim tasks/install.yml
- name: install packages
? yum:
? ? name:
? ? ? - libaio
? ? ? - numactl-libs
[root@ansible mysql]#vim tasks/group.yml
- name: create mysql group
? group: name=mysql gid=306
[root@ansible mysql]#vim tasks/user.yml
- name: create mysql user
? user: name=mysql uid=306 group=mysql shell=/sbin/nologin system=yes create_home=no home=/data/mysql
[root@ansible mysql]#vim tasks/unarchive.yml
- name: copy tar to remote host and file mode
? unarchive: src=/data/ansible/roles/mysql/files/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz dest=/usr/local/owner=root group=root copy=yes
[root@ansible mysql]#vim tasks/linkfile.yml
- name: create linkfile /usr/local/mysql
? file: src=/usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 path=/usr/local/mysql state=link
[root@ansible mysql]#vim tasks/data.yml
- name: data dir
? shell: /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
? tags: data
[root@ansible mysql]#vim tasks/config.yml
- name: config my.cnf
? copy: src=/data/ansible/roles/mysql/files/my.cnf dest=/etc/my.cnf
[root@ansible mysql]#vim tasks/script.yml
- name: service script
? shell: /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@ansible mysql]#vim tasks/path.yml
- name: PATH variable
? copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
[root@ansible mysql]#vim tasks/service.yml
- name: enable service
? shell: chkconfig --add mysqld;/etc/init.d/mysqld start
? tags: service
[root@ansible mysql]#vim tasks/secure.yml
- name: change password
? shell: /usr/local/mysql/bin/mysqladmin -uroot password {{mysql_root_password}}
3.在playbook中調(diào)用角色
[root@ansible ansible]#vim role_mysql.yml
---
- hosts: webservers
? remote_user: root
? gather_facts: no
? roles:
? ? - mysql
4.運行playbook
[root@ansible ansible]#ansible-playbook -C role_mysql.yml
[root@ansible ansible]#ansible-playbook? role_mysql.yml
PLAY [webservers] ****************************************************************************************************
TASK [mysql : install packages] **************************************************************************************
ok: [10.0.0.17]
TASK [create mysql group] ********************************************************************************************
ok: [10.0.0.17]
TASK [create mysql user] *********************************************************************************************
ok: [10.0.0.17]
TASK [mysql : copy tar to remote host and file mode] *****************************************************************
changed: [10.0.0.17]
TASK [create linkfile /usr/local/mysql] ******************************************************************************
ok: [10.0.0.17]
TASK [mysql : data dir] **********************************************************************************************
changed: [10.0.0.17]
TASK [mysql : config my.cnf] *****************************************************************************************
changed: [10.0.0.17]
TASK [mysql : service script] ****************************************************************************************
changed: [10.0.0.17]
TASK [mysql : PATH variable] *****************************************************************************************
changed: [10.0.0.17]
TASK [mysql : enable service] ****************************************************************************************
changed: [10.0.0.17]
TASK [mysql : change password] ***************************************************************************************
changed: [10.0.0.17]
PLAY RECAP ***********************************************************************************************************
10.0.0.17? ? ? ? ? ? ? ? ? : ok=11? changed=7? ? unreachable=0? ? failed=0? ? skipped=0? ? rescued=0? ? ignored=0
[root@centos7 ~]#ss -ntl
State? ? ? Recv-Q Send-Q? ? ? ? ? ? ? Local Address:Port? ? ? ? ? ? ? ? ? ? ? ? ? ? Peer Address:Port
LISTEN? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? *:22? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*
LISTEN? ? 0? ? ? 100? ? ? ? ? ? ? ? ? ? 127.0.0.1:25? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*
LISTEN? ? 0? ? ? 80? ? ? ? ? ? ? ? ? ? ? ? ? [::]:3306? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [::]:*
LISTEN? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? [::]:22? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [::]:*
LISTEN? ? 0? ? ? 100? ? ? ? ? ? ? ? ? ? ? ? [::1]:25? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [::]:*
[root@centos7 ~]#mysql --version
mysql? Ver 14.14 Distrib 5.7.36, for linux-glibc2.12 (x86_64) using? EditLine wrapper
[root@centos7 ~]#mysql -uroot -p123456 -Dmysql
mysql> show databases;
+--------------------+
| Database? ? ? ? ? |
+--------------------+
| information_schema |
| mysql? ? ? ? ? ? ? |
| performance_schema |
| sys? ? ? ? ? ? ? ? |
+--------------------+
2、Ansible playbook實現(xiàn)apache批量部署,并對不同主機提供以各自IP地址為內(nèi)容的index.html
1、基于key驗證免密授權(quán)
1.1 生成kekgen
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:6XyhlugUDjs1ntsb4GCu0fPuwBCSEOhrPjU56RJ6xxE root@8-2
The key's randomart image is:
+---[RSA 3072]----+
|+.? ? ? ? ? ? ? |
|o.? ? ? ? ? ? ? |
|+ .? ? ? ? ? ? ? |
| o .E? ? .? ? ? |
|? o *.= S .? ? ? |
| + %.O O o .? ? |
|+ =.@.B B .? ? ? |
|.+.+oB + o? ? ? |
| .+. o* o.? ? ? |
+----[SHA256]-----+
1.2 復(fù)制到遠程客戶端
# ssh-copy-id root@10.0.0.8
# ssh-copy-id root@10.0.0.18
# ssh-copy-id root@10.0.0.17
# ssh-copy-id root@10.0.0.27
# ssh-copy-id root@10.0.0.37
2邪蛔、ansible服務(wù)器配置
2.1 使用yum倉庫安裝
# yum -y install ansible
2.2 配置主機清單
# vi /etc/ansible/hosts
[local]
10.0.0.7? ? ansible_connection=local? ? #指定連接類型為本地,無需通過ssh連接
[webserver]
10.0.0.17
10.0.0.27
10.0.0.37
10.0.0.8
10.0.0.18
2.3 檢查服務(wù)端到遠程主機的健康性
# ansible all -m ping? #顯示綠色表示健康
10.0.0.7 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
10.0.0.37 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
10.0.0.8 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/libexec/platform-python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
10.0.0.18 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/libexec/platform-python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
10.0.0.27 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
10.0.0.17 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
2.4 準備工作
# cd /apps/httpd
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.51.tar.bz2 --no-check-certificate
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.bz2? --no-check-certificate
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.bz2 --no-check-certificate
# vi /apps/httpd/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
[Service]
Type=forking
ExecStart=/apps/httpd/bin/apachectl start
ExecReload=/apps/httpd/bin/apachectl graceful
ExecStop=/apps/httpd/bin/apachectl stop
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now httpd.service
# ls? #最終準備好四個文件
apr-1.7.0.tar.bz2? apr-util-1.6.1.tar.bz2? httpd-2.4.51.tar.bz2? httpd.service
2.5 準備playbook
# cat install_httpd.yml
---
# install httpd
# 需要將相關(guān)文件放到如下目錄
# tree /apps/httpd/
# apps/httpd/
# ├── apr-1.7.0.tar.bz2
# ├── apr-util-1.6.1.tar.bz2
# ├── httpd-2.4.51.tar.bz2
# └── httpd.service
- hosts: webserver
? remote_user: root
? gather_facts: no
? vars:
? ? data_dir: /usr/local/src
? ? base_dir : /apps/httpd
? ? install_dir: /apps/httpd
? ? httpd_version: httpd-2.4.51
? ? apr_version: apr-1.7.0
? ? apr_util_version: apr-util-1.6.1
? ? httpd_url: https://mirrors.tuna.tsinghua.edu.cn/apache/httpd
? ? apr_url: https://mirrors.tuna.tsinghua.edu.cn/apache/apr
? tasks :
? ? - name : install packages
? ? ? yum : name=gcc,make,pcre-devel,openssl-devel,expat-devel,bzip2 state=installed
? ? - name : download httpd file
? ? ? unarchive :
? ? ? ? src: "{{ base_dir }}/{{ httpd_version }}.tar.bz2"
? ? ? ? dest: "{{ data_dir }}"
? ? ? ? owner: root
? ? ? ? copy: yes
? ? - name : download apr file
? ? ? unarchive :
? ? ? ? src: "{{ base_dir }}/{{ apr_version }}.tar.bz2"
? ? ? ? dest: "{{ data_dir }}"
? ? ? ? owner: root
? ? ? ? copy: yes
? ? - name : download apr_util file
? ? ? unarchive :
? ? ? ? src: "{{ base_dir }}/{{ apr_util_version }}.tar.bz2"
? ? ? ? dest: "{{ data_dir }}"
? ? ? ? owner: root
? ? ? ? copy: yes
? ? - name : prepare apr dir
? ? ? shell: mv {{ apr_version }} {{ httpd_version }}/srclib/apr
? ? ? args:
? ? ? ? chdir: "{{ data_dir }}"
? ? - name : prepare apr_util dir
? ? ? shell : mv {{ apr_util_version }} {{ httpd_version }}/srclib/apr-util
? ? ? args:
? ? ? ? chdir: "{{ data_dir }}"
? ? - name : build httpd
? ? ? shell : ./configure --prefix={{ install_dir }} --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-included-apr --enable-modules=most --enable-enablempms-shared=all --with-mpm=prefork && make -j && make install
? ? ? args:
? ? ? ? chdir: "{{ data_dir }}/{{ httpd_version }}"
? ? - name : create group
? ? ? group : name=apache gid=80 system=yes
? ? - name : create user
? ? ? user : name=apache uid=80 group=apache shell=/sbin/nologin system=yes create_home=no home={{ install_dir }}/conf/httpd
? ? - name : set httpd user
? ? ? lineinfile : path={{ install_dir }}/conf/httpd.conf regexp='^User' line='User apache'
? ? - name : set httpd group
? ? ? lineinfile : path={{ install_dir }}/conf/httpd.conf regexp='^Group' line='Group apache'
? ? - name : set variable PATH
? ? ? shell : echo PATH={{ install_dir }}/bin:$PATH >> /etc/profile.d/httpd.sh
? ? - name : copy service file to remote
? ? ? copy:
? ? ? ? src: "{{ base_dir }}/httpd.service"
? ? ? ? dest: /usr/lib/systemd/system/httpd.service
? ? - name : start service
? ? ? service : name=httpd state=started enabled=yes
2.6 批量安裝
# ansible-playbook install_httpd.yml
PLAY [webserver] ****************************************************************************************************************************************************************************
TASK [install packages] *********************************************************************************************************************************************************************
changed: [10.0.0.8]
changed: [10.0.0.37]
changed: [10.0.0.17]
changed: [10.0.0.27]
changed: [10.0.0.18]
TASK [download httpd file] ******************************************************************************************************************************************************************
changed: [10.0.0.17]
changed: [10.0.0.27]
changed: [10.0.0.37]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [download apr file] ********************************************************************************************************************************************************************
changed: [10.0.0.17]
changed: [10.0.0.37]
changed: [10.0.0.27]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [download apr_util file] ***************************************************************************************************************************************************************
changed: [10.0.0.37]
changed: [10.0.0.17]
changed: [10.0.0.27]
changed: [10.0.0.8]
changed: [10.0.0.18]
TASK [prepare apr dir] **********************************************************************************************************************************************************************
changed: [10.0.0.37]
changed: [10.0.0.27]
changed: [10.0.0.17]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [prepare apr_util dir] *****************************************************************************************************************************************************************
changed: [10.0.0.27]
changed: [10.0.0.37]
changed: [10.0.0.17]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [build httpd] **************************************************************************************************************************************************************************
changed: [10.0.0.17]
changed: [10.0.0.37]
changed: [10.0.0.27]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [create group] *************************************************************************************************************************************************************************
changed: [10.0.0.27]
changed: [10.0.0.37]
changed: [10.0.0.17]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [create user] **************************************************************************************************************************************************************************
changed: [10.0.0.27]
changed: [10.0.0.37]
changed: [10.0.0.17]
changed: [10.0.0.8]
changed: [10.0.0.18]
TASK [set httpd user] ***********************************************************************************************************************************************************************
changed: [10.0.0.27]
changed: [10.0.0.17]
changed: [10.0.0.37]
changed: [10.0.0.8]
changed: [10.0.0.18]
TASK [set httpd group] **********************************************************************************************************************************************************************
changed: [10.0.0.37]
changed: [10.0.0.27]
changed: [10.0.0.17]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [set variable PATH] ********************************************************************************************************************************************************************
changed: [10.0.0.17]
changed: [10.0.0.27]
changed: [10.0.0.37]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [copy service file to remote] **********************************************************************************************************************************************************
changed: [10.0.0.27]
changed: [10.0.0.37]
changed: [10.0.0.17]
changed: [10.0.0.18]
changed: [10.0.0.8]
TASK [start service] ************************************************************************************************************************************************************************
changed: [10.0.0.17]
changed: [10.0.0.8]
changed: [10.0.0.18]
changed: [10.0.0.37]
changed: [10.0.0.27]
PLAY RECAP **********************************************************************************************************************************************************************************
10.0.0.17? ? ? ? ? ? ? ? ? : ok=14? changed=14? unreachable=0? ? failed=0? ? skipped=0? ? rescued=0? ? ignored=0?
10.0.0.18? ? ? ? ? ? ? ? ? : ok=14? changed=14? unreachable=0? ? failed=0? ? skipped=0? ? rescued=0? ? ignored=0?
10.0.0.27? ? ? ? ? ? ? ? ? : ok=14? changed=14? unreachable=0? ? failed=0? ? skipped=0? ? rescued=0? ? ignored=0?
10.0.0.37? ? ? ? ? ? ? ? ? : ok=14? changed=14? unreachable=0? ? failed=0? ? skipped=0? ? rescued=0? ? ignored=0?
10.0.0.8? ? ? ? ? ? ? ? ? : ok=14? changed=14? unreachable=0? ? failed=0? ? skipped=0? ? rescued=0? ? ignored=0?
2.7 測試
# curl 10.0.0.17
<html><body><h1>It works!</h1></body></html>
# curl 10.0.0.27
<html><body><h1>It works!</h1></body></html>
# curl 10.0.0.37
<html><body><h1>It works!</h1></body></html>
# curl 10.0.0.8
<html><body><h1>It works!</h1></body></html>
# curl 10.0.0.18
<html><body><h1>It works!</h1></body></html>
# 測試完成扎狱,批量安裝成功
3侧到、http的報文結(jié)構(gòu)和狀態(tài)碼總結(jié)
HTTP的報文分為請求報文和響應(yīng)報文
HTTP請求報文:由三個部分組成,即開始行淤击、首部行和實體主體
在請求報文中匠抗,開始行就是請求行。
request報文格式:
<method> <request-URL> <version>
<headers>
<entity-body>
HTTP響應(yīng)報文:開始行是狀態(tài)行
狀態(tài)行包括三項內(nèi)容污抬,即HTTP的版本汞贸,狀態(tài)碼以及解釋狀態(tài)碼的簡單短語
response報文格式:
<version> <status> <reason-phrase>
<headers>
<entity-body>
Method方法:
請求方法,標明客戶端希望服務(wù)器對資源執(zhí)行的動作印机,包括以下:
GET: 從服務(wù)器獲取一個資源
HEAD: 只從服務(wù)器獲取文檔的響應(yīng)首部
POST: 向服務(wù)器輸入數(shù)據(jù)矢腻,通常會再由網(wǎng)關(guān)程序繼續(xù)處理
PUT: 將請求的主體部分存儲在服務(wù)器中,如上傳文件
DELETE: 請求刪除服務(wù)器上指定的文檔
TRACE: 追蹤請求到達服務(wù)器中間經(jīng)過的代理服務(wù)器
OPTIONS:請求服務(wù)器返回對指定資源支持使用的請求方法
CONNECT:建立一個到由目標資源標識的服務(wù)器的隧道
PATCH:用于對資源應(yīng)用部分修改
version版本:
HTTP/<major>.<minor>
如:HTTP/1.1
reason-phrase:原因短語耳贬,狀態(tài)碼所標記的狀態(tài)的簡要描述
headers首部字段頭:首部字段包含的信息最為豐富踏堡。首部字段同時存在于請求報文和響應(yīng)報文內(nèi),并涵蓋 HTTP 報文相關(guān)的內(nèi)容信息咒劲。使用首部字段是為了給客戶端和服務(wù)器端提供報文主體大小顷蟆、所使用的語言、認證信息等內(nèi)容腐魂。
首部字段是由首部字段名和字段值構(gòu)成的帐偎,中間用冒號":”分隔字段值對應(yīng),即key/value 鍵/值對單個HTTP首部字段可以有多個值蛔屹。
entity-body:實體削樊,請求時附加的數(shù)據(jù)或響應(yīng)時附加的數(shù)據(jù),例如:登錄網(wǎng)站時的用戶名和密碼,博客的上傳文章漫贞,論壇上的發(fā)言等甸箱。
一、首部的分類:
1迅脐、通用首部:請求報文和響應(yīng)報文兩方都會使用的首部
2芍殖、請求首部:從客戶端向服務(wù)器端發(fā)送請求報文時使用的首部。補充了請求的附加內(nèi)容谴蔑、客戶端信息豌骏、請求內(nèi)容相關(guān)優(yōu)先級等信息
3、響應(yīng)首部:從服務(wù)器端向客戶端返回響應(yīng)報文時使用的首部隐锭。補充了響應(yīng)的附加內(nèi)容窃躲,也會要求客戶端附加額外的內(nèi)容信息
4、實體首部:針對請求報文和響應(yīng)報文的實體部分使用的首部钦睡。補充了資源內(nèi)容更新時間等與實體有關(guān)的的信息
5蒂窒、協(xié)商首部:某資源有多種表示方法時使用
1.1通用首部:
Date:報文的創(chuàng)建時間
Connection:連接狀態(tài),如keep-alive, close
Via:顯示報文經(jīng)過的中間節(jié)點(代理赎婚,網(wǎng)關(guān))
Cache-Control:控制緩存刘绣,如緩存時長
MIME-Version:發(fā)送端使用的MIME版本
Warning:錯誤通知
1.2請求首部:
Accept:通知服務(wù)器自己可接受的媒體類型
Accept-Charset: 客戶端可接受的字符集
Accept-Encoding:客戶端可接受編碼格式,如gzip
Accept-Language:客戶端可接受的語言
Client-IP:請求的客戶端IP
Host:請求的服務(wù)器名稱和端口號
Referer:跳轉(zhuǎn)至當前URI的前一個URL
User-Agent:客戶端代理挣输,瀏覽器版本
條件式請求首部:
Expect:允許客戶端列出某請求所要求的服務(wù)器行為
If-Modified-Since:自從指定的時間之后纬凤,請求的資源是否發(fā)生過修改
If-Unmodified-Since:與上面相反
If-None-Match:本地緩存中存儲的文檔的ETag標簽是否與服務(wù)器文檔的Etag不匹配
If-Match:與上面相反
安全請求首部:
Authorization:向服務(wù)器發(fā)送認證信息,如賬號和密碼
Cookie:客戶端向服務(wù)器發(fā)送cookie
代理請求首部:
Proxy-Authorization:向代理服務(wù)器認證
1.3響應(yīng)首部:
信息性:
Age:從最初創(chuàng)建開始撩嚼,響應(yīng)持續(xù)時長
Server:服務(wù)器程序軟件名稱和版本
安全響應(yīng)首部:
Set-Cookie:向客戶端設(shè)置cookie
WWW-Authenticate:來自服務(wù)器對客戶端的質(zhì)詢列表
1.4實體首部:
Allow:列出對此資源實體可使用的請求方法
Location:告訴客戶端真正的實體位于何處
Content-Encoding:對主體執(zhí)行的編碼
Content-Language:理解主體時最適合的語言
Content-Length:主體的長度
Content-Location:實體真正所處位置
Content-Type:主體的對象類型停士,如text
1.5協(xié)商首部:
Accept-Ranges:服務(wù)器可接受的請求范圍類型
Vary:服務(wù)器查看的其它首部列表
緩存相關(guān):
ETag:實體的擴展標簽
Expires:實體的過期時間
Last-Modified:最后一次修改的時間
二、HTTP狀態(tài)碼
status:狀態(tài)碼完丽,HTTP狀態(tài)碼是用來表示網(wǎng)頁服務(wù)器HTTP響應(yīng)狀態(tài)的3位數(shù)字代碼恋技。
http協(xié)議狀態(tài)碼分類:
1xx:100-101 信息提示
2xx:200-206 成功
3xx:300-307 重定向
4xx:400-415 錯誤類信息,客戶端錯誤
5xx:500-505 錯誤類信息逻族,服務(wù)器端錯誤
2.1常見的HTTP狀態(tài)碼
200 (成功) 服務(wù)器已成功處理了請求蜻底。 通常,這表示服務(wù)器提供了請求的網(wǎng)頁聘鳞。
301 (永久移動) 請求的網(wǎng)頁已永久移動到新位置薄辅。 服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時,會自動將請求者轉(zhuǎn)到新位置抠璃。
302 (臨時移動) 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求站楚,但請求者應(yīng)繼續(xù)使用原有位置來進行以后的請求。
304 (未修改) 自從上次請求后搏嗡,請求的網(wǎng)頁未修改過窿春。 服務(wù)器返回此響應(yīng)時拉一,不會返回網(wǎng)頁內(nèi)容。
400 (錯誤請求) 服務(wù)器不理解請求的語法旧乞。
401 (未授權(quán)) 請求要求身份驗證肯夏。 對于需要登錄的網(wǎng)頁份帐,服務(wù)器可能返回此響應(yīng)锐想。
403 (禁止) 服務(wù)器拒絕請求然走。
404 (未找到) 服務(wù)器找不到請求的網(wǎng)頁。
500 (服務(wù)器內(nèi)部錯誤) 服務(wù)器遇到錯誤决瞳,無法完成請求。
502 (錯誤網(wǎng)關(guān)) 服務(wù)器作為網(wǎng)關(guān)或代理左权,從上游服務(wù)器收到無效響應(yīng)皮胡。
503 (服務(wù)不可用) 服務(wù)器目前無法使用(由于超載或停機維護)。 通常赏迟,這只是暫時狀態(tài)屡贺。
504 (網(wǎng)關(guān)超時) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時從上游服務(wù)器收到請求锌杀。