ansible批量管理软件部署及剧本
服务器版本信息:
Centos6.9
[root@db02 ~]# uname -a
Linux db02 2.6.-.el6.x86_64 # SMP Tue Mar :: UTC x86_64 x86_64 x86_64 GNU/Linux
ansible软件介绍
ansible是一个基于Python开发的自动化运维工具!
其功能实现基于SSH远程连接服务!
ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能
ansible官方资料
官网:http://www.ansible.com/home
官网文档:http://docs.ansible.com/ansible/index.html
ansible软件特点
- 不需要单独安装客户端,基于系统自带的sshd服务,sshd就相当于ansible的客户端
- 不需要服务端
- 依靠大量的模块实现批量管理
- 配置文件/etc/snsible/ansible.cfg,不用配置
ansible输出结果的颜色
- 输出内容显示绿色:表示执行成功,当没有任何改变
- 输出内容显示黄色:表示执行成功,但对被管理主机进行了改变
- 输出内容显示红色:表示执行失败
ansible参数
| 命令参数 | 参数说明 | 
| -m MODULE_NAME | --module-name=MODULE_NAME module name to execute (default=command) 相应名称的模块被执行(默认模块为 command ); -m后边是模块的名字 | 
| -a MODULE_ARGS | --args=MODULE_ARGS module arguments 模块参数信息; -a后面是要执行的命令;也可以写一个 ip ,针对一台机器来执行命令 | 
| -C,--check | don’t make any changes; instead, try to predict some of the changes that may occur 不做任何改变;反而,只是尝试预言一些可能出现的改变 | 
| --syntax-check | perform a syntax check on the playbook, but do not execute it 执行语法检查在剧本上,但是并不执行剧本 | 
ansible部署
第一步、首先部署ssh+key免密码登陆方式
ssh+key部署:
http://www.cnblogs.com/lyq863987322/p/7886344.html
第二步、被管理端安装libselinux
yum install libselinux-python -y
第三步、服务端安装ansible,配置文件编写
yum install ansible -y
ansible的重要目录
/etc/ansible/hosts --- 定义anisble软件可以管理的主机信息
/usr/bin/ansible --- ansible执行命令
/usr/bin/ansible-playboot --- ansible执行剧本命令
/etc/ansible/hosts 配置文件编写举例
在配置文件中添加被管理主机的ip模块
[name]
172.16.1.21
172.16.1.11
172.16.1.1
在/etc/ansible/host文件最后添加[]下面接想要管理的主机ip,[]中起任意名字
测试控制这三台主机
命令语法:
ansible name -m shell -a "hostname"
ansible ---- 命令
name ---- 主机模块名称
-m ---- 指定模块的参数
shell --- 模块名称(不同模块不同名称)
-a --- 指定利用模块执行的动作参数
"hostname" ---- 在被控主机上批量执行的操作
命令格式
[root@m01 scripts]# ansible name -m shell -a "hostname" 172.16.1.21 | SUCCESS | rc= >> backup 172.16.1.11 | SUCCESS | rc= >> nfs01 172.16.1.1 | SUCCESS | rc= >> web01
这样就已经可以批量控制多台主机了,主要配置中需要注意的是ssh+key的配置。
如果没有配置ssh+key密钥分发的话,可以在/etc/ansible/host文件配置管理主机的时候 在ip后面空格接:ansible_ssh_user=用户 ansible_ssh_pass=密码,这样也可以管理
ansible几个常用模块
ansible帮助:
ansible-doc -l ---列出所有模块信息
ansible-doc -s 模块名 ---看执行模块信息
| 常用模块 | 模块说明 | 
| command (重要模块) | 执行命令模块,ansible命令执行默认模块 | 
| shell (重要模块) | 执行shell脚本模块 | 
| script (重要模块) | 把脚本发到客户端,然后执行;执行脚本命令在远端服务器上 | 
| copy (重要模块) | 把本地文件发送到远端 | 
| file | 设定文件属性模块 | 
| service | 系统服务管理模块 | 
| cron | 计划任务管理模块 | 
| yum | yum软件包安装管理模块 | 
| mount | 挂载模块 | 
| synchronize | 使用rsync同步文件模块 | 
command模块
ansible中的远程执行命令模块
- 命令模块中的多个参数设置用空格进行分隔
- 命令模块中不能出现"<" ">" "|" ";" "&"
| 参数 | 说明 | 
| chdir | 在执行命令之前,通过cd命令进入到指定目录中 | 
| creates | 定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤 | 
| executable | 改变shell使用command进行执行,并且执行时要使用绝对路径 | 
| free_form | free_form 命令模块采用自由形式命令运行;即可以输入任意linux命令 | 
| removes | 定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤 | 
| warn | 如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令 | 
实例:
chdir参数:在执行命令之前,通过cd命令进入到指定目录
[root@m01 scripts]# ansible oldboy -m command -a "chdir=/tmp pwd" 172.16.1.21 | SUCCESS | rc= >> /tmp 172.16.1.11 | SUCCESS | rc= >> /tmp 172.16.1.1 | SUCCESS | rc= >> /tmp
chdir参数
creates参数:定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤
[root@m01 scripts]# ansible name -m command -a "pwd creates=/tmp/oldboy.txt" 172.16.1.21 | SUCCESS | rc= >> /root 172.16.1.11 | SUCCESS | rc= >> /root 172.16.1.1 | SUCCESS | rc= >> /root
command模块creates参数
shell模块
| 参数 | 说明 | 
| chdir | 在执行命令之前,通过cd命令进入到指定目录中 | 
| creates | 定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤 | 
| executable | 改变shell使用command进行执行,并且执行时要使用绝对路径 | 
| free_form | free_form 命令模块采用自由形式命令运行;即可以输入任意linux命令 | 
| removes | 定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤 | 
| warn | 如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令 | 
shell模块类似于command模块,最大区别是shell模块可以执行脚本
[root@m01 scripts]# ansible name -m shell -a "sh /server/scripts/name.sh"
172.16.1.21 | SUCCESS | rc= >>
nfs01 172.16.1.11 | SUCCESS | rc= >>
backup
说明:shell模块在远程执行脚本时,远程主机上一定要有相应脚本
shell脚本执行
script模块
在本地执行脚本时,将脚本中的内容传输到远程节点上运行
| creates | 定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤 command: | 
| free_form | 命令模块采用自由形式命令运行;即可以输入任意linux命令 | 
| removes | 定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤 | 
实例:
[root@m01 scripts]# ansible name -m script -a "/tmp/name.sh"
172.16.1.21 | SUCCESS => {
"changed": true,
"rc": ,
"stderr": "Shared connection to 172.16.1.21 closed.\r\n",
"stdout": "nfs01\r\n",
"stdout_lines": [
"nfs01"
]
}
172.16.1.11 | SUCCESS => {
"changed": true,
"rc": ,
"stderr": "Shared connection to 172.16.1.11 closed.\r\n",
"stdout": "backup\r\n",
"stdout_lines": [
"backup"
]
}
说明:不需要将脚本传输到远程节点上,脚本本身不用进行授权,即可利用script模块批量执行脚本
copy模块
将本地数据传输到远端,或者将远程节点上的数据进行移动
| 选项参数 | 选项说明 | 
| backup (重要参数) | 创建备份文件包含时间戳信息,以便能够还原回原文件,在某种情况原文件被覆盖错误时。 | 
| content | 当使用代替src参数时,将文件的内容直接设置为指定值。远端创建有指定内容文这是只是简单值,对于任何复杂或者有格式化的内容,请切换到template模块 | 
| dest | 文件应该被拷贝到的远程绝对路径信息。如果src是一个目录,dest也必须是目录 | 
| directory_mode | 当递归复制设置目录权限时,如果没有设置权限,将使用系统默认这个权限值设置在目录上只对于最近创建的,并且对于已经存在的没有效果 | 
| force | 默认为yes,当远程文件内容和源文件内容不同时,将覆盖目标文件如果为no,文件将只被传输,在目标主机不存在此文件时 别名:thirsty | 
| group | 定义所拥有文件/目录的所属组名称,类似交由chown命令进行处理 | 
| mode | 定义文件或目录的权限信息;就像使用/usr/bin/chmod 设定八进制数(如0644)取消掉前导零可能会有意想不到的结果。作为1,8版本,可以指定为符号模式(如 u+rwx or u=rw,g=r,o=r) | 
| owner | 定义所拥有文件/目录的所属用户名称,类似交由chown命令进行处理 | 
| src | 本地路径文件复制到远程服务器;可以是绝对路径也可以是相对路径如果路径是一个目录,将会递归复制。在这种情况下,如果路径以“/”结束,只将在该目录的内容复制到目的地否则,如果它不以“/”结束,目录和目录下所有内容都会被复制以上这种复制方式类似于rsync | 
| remote_src | 如果这个值设置为True,将到远程目标主机的机器上搜索 | 
| validate | 在文件复制到相应目录位置之前,运行验证命令要验证的文件的路径通过%s传递,并且要在下面的例子中显示 | 
实例:
[root@m01 scripts]# ansible name -m copy -a "src=/etc/hosts dest=/tmp/ mode=0777"
172.16.1.21 | SUCCESS => {
"changed": true,
"checksum": "da5234fc498b2c3bf8b98f6b08fe1d6d96e653c2",
"dest": "/tmp/hosts",
"gid": ,
"group": "root",
"md5sum": "2253445a36ed3910d50887a6eb1e4b79",
"mode": "",
"owner": "root",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1508394462.54-228657061248374/source",
"state": "file",
"uid":
}
172.16.1.11 | SUCCESS => {
"changed": true,
"checksum": "da5234fc498b2c3bf8b98f6b08fe1d6d96e653c2",
"dest": "/tmp/hosts",
"gid": ,
"group": "root",
"md5sum": "2253445a36ed3910d50887a6eb1e4b79",
"mode": "",
"owner": "root",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1508394462.62-205181338927486/source",
"state": "file",
"uid":
}
说明:
1. 如果指定的目标目录不存在,系统会自动创建,否则源目录会放到目标目录下面去
2. 如果copy的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于copy过去后在重命名;
3. 如果dest是目标机器上已经存在的目录,则会直接把文件copy到该目录下面。
4. 设定的用户和组oldboy在所有客户端必须存在
给文件加内容:
[root@m01 scripts]# ansible name -m copy -a "content=lyq.com\n dest=/tmp/1"
172.16.1.11 | SUCCESS => {
"changed": true,
"checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"dest": "/tmp/1",
"gid": ,
"group": "root",
"md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916",
"mode": "",
"owner": "root",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1508465641.79-151255543511039/source",
"state": "file",
"uid":
}
172.16.1.21 | SUCCESS => {
"changed": true,
"checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"dest": "/tmp/1",
"gid": ,
"group": "root",
"md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916",
"mode": "",
"owner": "root",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1508465641.82-210493742853029/source",
"state": "file",
"uid":
}
file模块
设置文件属性
| 参数 | 说明 | 
| force | 强行创建符号链接的两种情况: 源文件不存在(但是日后会出现) 目标存在并且是一个文件(因此,我们需要将“路径”文件取消,并创建“src”文件的符号链接) | 
| group | 定义所拥有文件/目录的所属组名称,类似交由chown命令进行处理 | 
| mode | 定义文件或目录的权限信息;就像使用/usr/bin/chmod 设定八进制数(如0644)取消掉前导零可能会有意想不到的结果。作为1,8版本,可以指定为符号模式(如 u+rwx or u=rw,g=r,o=r) | 
| owner | 定义所拥有文件/目录的所属用户名称,类似交由chown命令进行处理 | 
| path | 文件路径管理: 别名方式:dest,name | 
| recurse | 递归设置指定文件属性(这个参数值应用对于state=directory) | 
| src | 要链接的文件路径(只能应用 state=link),接受绝对 相对以及不存在的路径相对路径不能扩展 | 
| state (重要参数) | 如果指定参数为directory | 
实例:
创建目录/删除目录
[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_dir state=directory"
172.16.1.11 | SUCCESS => {
"changed": true,
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/tmp/oldboy_dir",
"size": ,
"state": "directory",
"uid":
}
172.16.1.21 | SUCCESS => {
"changed": true,
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/tmp/oldboy_dir",
"size": ,
"state": "directory",
"uid":
}
[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_dir state=absent"
172.16.1.11 | SUCCESS => {
"changed": true,
"path": "/tmp/oldboy_dir",
"state": "absent"
}
172.16.1.21 | SUCCESS => {
"changed": true,
"path": "/tmp/oldboy_dir",
"state": "absent"
}
创建文件/删除文件
[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file state=touch"
172.16.1.11 | SUCCESS => {
"changed": true,
"dest": "/tmp/oldboy_file",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"size": ,
"state": "file",
"uid":
}
172.16.1.21 | SUCCESS => {
"changed": true,
"dest": "/tmp/oldboy_file",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"size": ,
"state": "file",
"uid":
}
[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file state=absent"
172.16.1.11 | SUCCESS => {
"changed": true,
"path": "/tmp/oldboy_file",
"state": "absent"
}
172.16.1.21 | SUCCESS => {
"changed": true,
"path": "/tmp/oldboy_file",
"state": "absent"
}
创建软连接/删除软连接
[root@m01 scripts]# ansible name -m file -a "src=/tmp/lyq_file dest=/tmp/lyq_file_link state=link"
172.16.1.11 | SUCCESS => {
"changed": true,
"dest": "/tmp/oldboy_file_link",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"size": ,
"src": "/tmp/oldboy_file",
"state": "link",
"uid":
}
172.16.1.21 | SUCCESS => {
"changed": true,
"dest": "/tmp/oldboy_file_link",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"size": ,
"src": "/tmp/oldboy_file",
"state": "link",
"uid":
}
[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file_link state=absent"
172.16.1.21 | SUCCESS => {
"changed": true,
"path": "/tmp/oldboy_file_link",
"state": "absent"
}
172.16.1.11 | SUCCESS => {
"changed": true,
"path": "/tmp/oldboy_file_link",
"state": "absent"
}
fetch模块
将远程主机上的文件,拉取到本地
| 参数 | 说明 | 
| dest | 定义一个保存文件的目录(将远程主机拉去过来的文件保存在本地的路径信息) | 
| src | 指定从远程主机要拉取的文件信息 | 
| flat | 默认设置为no,如果设置为yes,将不显示路径信息 | 
实例:
从远程主机拉取文件
[root@m01 scripts]# ansible name -m fetch -a "dest=/tmp src=/tmp/1"
172.16.1.11 | SUCCESS => {
"changed": true,
"checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"dest": "/tmp/172.16.1.11/tmp/1",
"md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916",
"remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"remote_md5sum": null
}
172.16.1.21 | SUCCESS => {
"changed": true,
"checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"dest": "/tmp/172.16.1.21/tmp/1",
"md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916",
"remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"remote_md5sum": null
}
flat 默认设置为no,如果设置为yes,将不显示路径信息
[root@m01 scripts]# ansible name -m fetch -a "dest=/tmp/ src=/tmp/1 flat=yes"
172.16.1.21 | SUCCESS => {
"changed": true,
"checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"dest": "/tmp/1",
"md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916",
"remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"remote_md5sum": null
}
172.16.1.11 | SUCCESS => {
"changed": true,
"checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"dest": "/tmp/1",
"md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916",
"remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75",
"remote_md5sum": null
}
mount模块
控制激活和配置挂载点模块
| 参数 | 说明 | 
| fstype | 指定挂载文件类型 | 
| path | 指定挂载点 | 
| opts | 设定挂载的参数选项信息 | 
| src | 要被挂载的目录设备信息(共享目录) | 
| boot | 确定是否在启动时文件系统被挂载 | 
| dump | Dump(参见 fstab5)。注意如果设置为null或状态设置为present,它将停止工作,并将在随后的运行中复制条目 | 
| state | 如果为mounted在fstab文件中的设备将被激活挂载和适当配置 # 如果为unmounted设备将被卸载并不会改变fstab文件信息bsent和present只处理fstab,但不影响目前的挂载 | 
cron模块
定时任务模块
| 参数 | 说明 | 
| minute | 分 | 
| hour | 时 | 
| day | 日 | 
| month | 月 | 
| weekday | 周 | 
| job | 定时任务中要执行的操作 | 
| name | 定义定时任务的描述信息 | 
| state=absent | 删除定时任务 | 
| disabled | 注释定时任务 | 
实例:
创建定时任务
[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null'"
172.16.1.21 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"None"
]
}
172.16.1.11 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"None"
]
}
删除定时任务
[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null' state=absent"
注释定时任务
[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null' state=disabled"
user模块
管理用户账户
| 参数 | 说明 | 
| append | 如果为yes,将只添加组,而不是将它们设置为组中的列表 | 
| name | 要操作的用户名称 | 
| shell | 指定用户的使用命令路径(如:/bin/bash) | 
| comment | 可选设置用户账号描述信息(又称为 GECOS) | 
| createhome | 除非设置为no,否则当创建账户或不存在主目录时,将为用户创建一个主目录 | 
| user | 创建,移除或修改的用户名称信息 | 
| uid | 可选设置用户UID信息 | 
实例:
[root@m01 ansible-playbook]# ansible 172.16.1.1 -m user -a "user=lyq uid=2222"
172.16.1.1 | SUCCESS => {
"append": false,
"changed": true,
"comment": "",
"group": ,
"home": "/home/lyq",
"move_home": false,
"name": "lyq",
"shell": "/bin/bash",
"state": "present",
"uid":
}
ansible剧本
检查剧本:
ansible-playbook --syntax-check 剧本名 ----进行剧本配置信息语法检查
ansible-playbook -C 剧本名 ----模拟剧本执行
ansible核心功能
- pyYAML -----用于ansible编写剧本所使用的语言格式
- paramiko ---远程连接与数据传输
- Jinja2 -----用于编写ansible的模块信息
ansible剧本编写规则
pyYAML语法规则
一:缩进
yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级别由两个空格组成。一定不能使用tab键(tab在vim编辑中是8个空格)
二:冒号
每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的模版可以不需要空格)
三:短横线
- 想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分。
- 核心规则:有效的利用空格进行剧本的编写,剧本编写是不支持tab的。
ansible-playbook编写格式
剧本开头,可以不写
这两项必须要写:
- hosts:(空格)all 处理所有服务器,找到所有服务器
tasks: 剧本要干的事
检查剧本命令
ansible-playbook --syntax-check 剧本 ----进行剧本配置信息语法检查
ansible-playbook -C 剧本 ----模拟剧本执行
剧本实例
rsync一键部署剧本
- name: 后面是可以加入提示信息的
[root@m01 ansible-playbook]# vim rsync.yml
- hosts: 172.16.1.21
tasks:
- name:
yum: name=rsync state=installed
- name:
copy: src=/tmp/rsyncd.conf dest=/etc/
- name:
shell: userdel -r rsync && useradd rsync -M -s /sbin/nologin
- name:
shell: mkdir -p /backup/ && chown rsync.rsync /backup
- name:
copy: src=/tmp/rsync.password dest=/etc/
- name:
shell: rsync --daemon creates=/var/run/rsyncd.pid
- hosts: 172.16.1.11
tasks:
- name:
copy: content=lyq123 dest=/etc/rsync.password
写的不好的地方,请大家多多包涵
ansible批量管理软件部署及剧本的更多相关文章
- Linux中ansible批量管理软件部署及剧本编写
		服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ... 
- 六.ansible批量管理服务
		期中集群架构-第六章-ansible批量管理服务介绍====================================================================== 01. ... 
- Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务
		SSH远程管理服务 1. 远程管理服务知识介绍 # 1.1 SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Worki ... 
- ansible批量管理服务 上
		1 ansible简介 1.1 ansible批量管理服务概述 (1)是基于python语言开发的自动化软件工具(2)是基于SSH远程管理服务实现远程主机批量管理(3)并行管理,部署简单,应用也简单方 ... 
- 使用ansible批量管理远程服务器
		使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ... 
- Ansible 批量管理Windows Server服务器
		Ansible批量管理Windows Server Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppe ... 
- ansible批量管理常见的配置方法
		第7章 ansible的管理 7.1 ansible概念的介绍 ansible-playbook –syntax 检查语法 ansible-playbook -C ... 
- linux运维、架构之路-ansible批量管理
		一.ansible软件 1.介绍 ①ansible是一个基于Python开发的自动化运维工具 ②其功能实现基于SSH远程连接服务 ③ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量 ... 
- ansible批量管理
		编写批量安装脚本 [root@m01 scripts]# vim install.sh for ip in $* do echo "=======start install to $ip = ... 
随机推荐
- CodeForces - 556A  Case of the Zeros and Ones
			//////////////////////////////////////////////////////////////////////////////////////////////////// ... 
- Count the Colors
			Count the Colors Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Subm ... 
- java读写锁ReadWriteLock
			package com.java.concurrent; import java.util.concurrent.locks.ReadWriteLock; import java.util.concu ... 
- html网页中加载js脚本 下载下来是乱码(文件编码格式)
			问题描述: 在一个index.html网页中,引入了jquery脚本,但是却出现错误,提示$ is not defined <!DOCTYPE html> <html lang=&q ... 
- Python把给定的列表转化成二叉树
			在LeetCode上做题时,有很多二叉树相关题目的测试数据是用列表给出的,提交的时候有时会出现一些数据通不过,这就需要在本地调试,因此需要使用列表来构建二叉树,方便自己调试.LeetCode上二叉树结 ... 
- Asp.Net MVC 使用 Ajax
			Asp.Net MVC 使用 Ajax Ajax 简单来说Ajax是一个无需重新加载整个网页的情况下,可以更新局部页面或数据的技术(异步的发送接收数据,不会干扰当前页面). Ajax工作原理 Ajax ... 
- 图片验证码的JAVA工具类
			我们平时开发时经常会遇到需要图片验证码,基础的验证码包括了数字.字母.甚至可能有汉字.下面我给出一个简单的工具类. package com..ankang.tony.util; import java ... 
- WPF 简易的喷泉效果
			这两天领导让我做个喷泉的效果,要把一个个UserControl从一个位置喷出,然后,最后落在最终需要在的位置. 喷泉效果说白了,就是两个步骤:1.放大,从0放大到需要的倍数:2.缩小,平移,从放大的倍 ... 
- CSS和文档
			1. 块级元素: p,div,ul,ol,h1,h2 . . . h6等.块级元素独占一行,旁边不能有其他元素. 2. 行内元素:span,a,strong,em等. display属性可以使块级元素 ... 
- Velocity(4)——引入指令和#Parse 指令
			#Include和#Parse都是用于将本地文件引入当前文件的指令,而且被引入的文件必须位于TEMPLATE_ROOT.这两者之间有一些区别. #Include 被#Include引入的文件,其内容不 ... 
