ansible笔记

以下为markdown格式:

# 客户端
# 1.准备工作
## 1.1安装openssh-server和python
`apt install openssh-server pytnon`

## 1.2允许root登录
修改 /etc/ssh/sshd_config 中 PermitRootLogin 的值为yes
默认值为 prohibit-password

## 1.3重启openssh服务
`systemctl restart ssh.service`

# 管理端
# 1安装及配置ansible
## 1.1生成密钥对
使用root登录后执行 ssh-keygen 生成密钥对

## 1.2对客户端加入公钥
`ssh-copy-id -i .ssh/id_rsa.pub root@192.168.13.71`

## 1.3安装ansible
`apt install ansible`

## 1.4配置ansible
编辑 /etc/ansible/ansible.cfg

# 2使用ansible命令
## 2.1配置inventory文件
编辑inventory文件hosts

/etc/ansible/hosts

[mysrv]

192.168.13.71

## 2.2执行命令
ping hosts文件中全部的主机,-o为输出结果为1行

`ansible all -m ping -o`

复制test.txt文件到客户端
文件模式600,所属用户为user1,所属组为user1group
可以用file模块替代copy模块

`ansible mysrv -m copy -a 'src=test.txt dest=~/test.txt mode=600 owner=user1 group=user1group' -o`

利用username的用户去对mysrv组中的电脑进行重启
参数-f 10为fork出10个子进程(每次执行10台电脑)

`ansible mysrv -a "/sbin/reboot" -u username --sudo --ask-sudo-pass -f 10`

使用user模块可以方便的创建账户,删除账户,或是管理现有的账户:

`ansible all -m user -a "name=foo password=<crypted password here>"`

`ansible all -m user -a "name=foo state=absent"`

利用apt安装nginx,需输入密码

`ansible one -m apt -a "name=nginx state=present" --sudo --ask-sudo-pass`

利用apt卸载nginx,需输入密码

`ansible one -m apt -a "name=nginx state=absent" --sudo --ask-sudo-pass`

# 3使用playbook
## 3.1检测语法
`ansible-playbook --syntax-check the.yml`

## 3.2测试运行
`ansible-playbook -C the.yml`

## 3.3创建用户的例子
createuser.yml

```
---
- hosts: one
vars:
username: "testuser"
user: root
tasks:
- name: create user
user: name="{{ username }}"
```
执行playbook
`ansible-playbook createuser.yml`

## 3.3安装nginx的例子
nginx.yml

```
---
- hosts: one
remote_user: root
tasks:
- name: ensure nginx is at the latest version
apt: name=nginx state=latest
- name: ensure nginx is running
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
```

## 3.4状态类型
安装软件:state={present|latest}

卸载软件:state={absent}

服务状态:state={started|stoped|restarted}

atom常用快捷键

英文 中文 快捷键 功能
New Window 新建界面窗口 Ctrl + Shift + N 如中文意思
New File 新建文件 Ctrl + N 如中文意思
Open File 打开文件 Ctrl + O 如中文意思
Open Folder 打开文件夹 Ctrl + Shift + O 如中文意思
Add Project Folder 加载项目目录 Ctrl + Alt + O 如中文意思
Reopen Last Item 重新加载上次项目 Ctrl + Shift + T 如中文意思
Save 保存文件 Ctrl + S 如中文意思
Save As 另存为 Ctrl + Shift +S 如中文意思
Close Tab 关闭当前编辑文档 Ctrl + W 如中文意思
Close Window 关闭编辑器 Ctrl + Shift + W 如中文意思
Undo 撤销 Ctrl + Z 如中文意思
Redo 重做 Ctrl + Y 如中文意思
Cut 剪切 Shift + Delete 如中文意思
Copy 复制 Ctrl + Insert 如中文意思
Copy Path 复制文档路径 Ctrl + Shift + C 如中文意思
Paste 粘贴 Shift + Insert 如中文意思
Select All 全选 Ctrl + A 如中文意思
Select Encoding 选择编码 Ctrl + Shift +U 就是设置文件的编码
Go to Line 跳转到某行 Ctrl + G 支持行列搜索,Row:Column
Slect Grammar 语法选择 Ctrl + Shift + L 和Sublime的Syntax设置功能一样
Reload 重载 Ctrl+ Alt +R 重新载入当前编辑的文档
Toggle Full Screen F11 全屏 如中文意思
Increase Font Size 增大字体 Ctrl + Shift + “+” Sublime的Ctrl + 也能生效
Decrease Font Size 减小字体 Ctrl + Shift + “-“ Sublime的Ctrl - 也能生效
Toggle Tree View 展示隐藏目录树 Ctrl + |Sublime的Ctrl+K,+B这里也可以生效
Toggle Commadn palette 全局搜索面板 Ctrl + Shift + P 和Sublime的大同小异
Select Line 选定一行 Ctrl + L 如中文意思
Select First Character of Line 选定光标至行首 Shift + Home 如中文意思
Slect End of Line 选定光标至行尾 Shift + End 如中文意思
Select to Top 选定光标处至文档首行 Ctrl + Shift + Home 就是光标处作为分割线,取文档上部分
Select to Bottom 选定光标处至文档尾行 Ctrl + Shfit + End 就是光标处作为分割线,取文档下部分
Find in Buffer 从缓存器搜索 Ctrl + F 与Sublime一致
Replace in Buffer 高级替换 Ctrl + Shift + F 与Sublime一致
Select Next 匹配选定下一个 Ctrl + D 和Sublime一模一样有木有
Select All 匹配选定所有 Alt + F3 和Sublime一模一样有木有
Find File 查询文件,选定打开 Ctrl + P 与Sublime不一样
Delte End of Word 删除光标处至词尾 Ctrl + Del 如中文意思
Duplicate Line Ctrl + Shift + D 复制当前行追加到后面 如中文意思
Delete Line 删除一行 Ctrl + Shift + K 如中文意思
Toggle Comment 启用注释 Ctrl + / 与Sublime一致
Toggle developer tools 打开Chrome调试器 Ctrl + Alt + I 神奇啊
Indent 增加缩进 Ctrl + [ 向右缩进
Outdent 减少缩进 Ctrl + ] 向左缩进
Move Line Up 行向上移动 Ctrl + up 如字面意思
Move Line Down 行向下移动 Ctrl + Down 如字面意思
Join Lines 行链接 Ctrl + J 追加
newline-below 光标之下增加一行 Ctrl + Enter 与sublime 一致
editor:newline-above 光标之上增加一行 Ctrl + Shift + Enter 与sublime 一致
pane:show-next-item 切换编辑的标签页 Ctrl + Tab 如中文意思
Fuzzy Finder 文件跳转面板 Ctrl + T 如字面意思
Select Line Move above 选中行上移 Ctrl + up 如中文意思
Select Line Move below 选中行下移 Ctrl + down 如中文意思
Symbol-view 进入变量、函数跳转面板。 Ctrl + R 如中文意思

来自:http://blog.csdn.net/crper/article/details/45674649

清除锐捷s2126交换机密码

一台锐捷RG-S2126G交换机密码遗忘了,要清除密码。
一、 连接交换机的控制口
打开pc上的超级终端或xshell,进行如下设置57600、数据位:8、奇偶校验:无、停止位:1、数据流控制:无,

交换机上电后,在3秒内完成:点击上图的“确定”,然后不停地按“ESC” 键,进入交换机ctrl层。

--- Ctrl Loader Dialog---
TOOLS MENU
*****************************************************
******* 1 -- Download ******
******* 2 -- Upload ******
******* 3 -- File Info ******
******* 4 -- Delete File ******
******* 5 -- Rename File ******
******* 6 -- Run Main File ******
******* 7 -- Format Flash ******
******* 8 -- Defrag Flash ******
******* 9 -- download all files(DHCP + TFTP)******
*****************************************************
Input command:

二、删除config.text文件

选4,输入config.text 。

三、重启交换机

html5获取经纬度

本程序需要支持html5的浏览器,如果需要利用经纬度获取地理名称,那么还需要注册成为百度开发者,要申请key,用在ak参数中。

 

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>HTML5获取地理位置定位信息</title>
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
</head>

<body>

<div id="main">

<div class="demo">
<p>地理坐标:<span id="latlon"></span></p>
<div class="geo">
<p id="baidu_geo"></p>
</div>

</div>

</div>

<script>
function getLocation(){
if (navigator.geolocation){
navigator.geolocation.getCurrentPosition(showPosition,showError);
}else{
alert("浏览器不支持地理定位。");
}
}

function showPosition(position){
$("#latlon").html("纬度:"+position.coords.latitude +',经度:'+ position.coords.longitude);
var latlon = position.coords.latitude+','+position.coords.longitude;

//baidu
var url = "http://api.map.baidu.com/geocoder/v2/?ak=百度开发者key&callback=renderReverse&location="+latlon+"&output=json&pois=0";
$.ajax({
type: "GET",
dataType: "jsonp",
url: url,
beforeSend: function(){
$("#baidu_geo").html('正在定位...');
},
success: function (json) {
if(json.status==0){
$("#baidu_geo").html(json.result.formatted_address);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#baidu_geo").html(latlon+"地址位置获取失败");
}
});

}

function showError(error){
switch(error.code) {
case error.PERMISSION_DENIED:
alert("定位失败,用户拒绝请求地理定位");
break;
case error.POSITION_UNAVAILABLE:
alert("定位失败,位置信息是不可用");
break;
case error.TIMEOUT:
alert("定位失败,请求获取用户位置超时");
break;
case error.UNKNOWN_ERROR:
alert("定位失败,定位系统失效");
break;
}
}

getLocation();
</script>

</body>
</html>

mariadb允许远程访问

ubuntu 安装的 mariadb 默认是不允许远程访问的,这里启用远程访问。

1​.修改数据库配置文件:sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
修改内容:将配置文件中的bind-address=127.0.0.1前面加上#号注释掉。

2.修改root的远程访问权限
sudo mysql -u root -p mysql
use mysql;

update user set host='%' where user='root';
update user set password=PASSWORD("12345678") where user="root";

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '12345678' WITH GRANT OPTION;
flush privileges;

3退出后重启一下Mariadb:
sudo service mysql restart​

修改完就可以远程访问数据库了.

利用公式提取全部工作表名称

在插入/名称/定义中定义一个名称——工作表,公式为:=REPLACE(GET.WORKBOOK(1),1,FIND("]",GET.WORKBOOK(1)),)&T(NOW()),这时就可以利用“=工作表”来提取当前工作表的名称。

在插入/名称/定义中再定义一个名称——工作表名称,公式为:=LOOKUP(ROW(INDIRECT("1:"&COLUMNS(工作表))),MATCH(工作表,工作表,),工作表),这时就可以利用数组公式“=工作表名称”来提取整个工作簿中工作表的名称集合。

具体可以看一下附件:

公式提取全部工作表名称

树莓派控制温湿度传感器dht11

来自 http://guojianxiang.com/posts/2015-11-26-RP_Controle_Dht11.html

基于python

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
channel = 4
data = []
j = 0
GPIO.setmode(GPIO.BCM)
time.sleep(1)
GPIO.setup(channel, GPIO.OUT)
GPIO.output(channel, GPIO.LOW)
time.sleep(0.02)
GPIO.output(channel, GPIO.HIGH)
GPIO.setup(channel, GPIO.IN)
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
continue
while j < 40:
k = 0
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
k += 1
if k > 100:
break
if k < 8:
data.append(0)
else:
data.append(1)
j += 1
print "sensor is working."
print data
humidity_bit = data[0:8]
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data[32:40]
humidity = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
for i in range(8):
humidity += humidity_bit[i] * 2 ** (7-i)
humidity_point += humidity_point_bit[i] * 2 ** (7-i)
temperature += temperature_bit[i] * 2 ** (7-i)
temperature_point += temperature_point_bit[i] * 2 ** (7-i)
check += check_bit[i] * 2 ** (7-i)
tmp = humidity + humidity_point + temperature + temperature_point
if check == tmp:
print "temperature :", temperature, "*C, humidity :", humidity, "%"
else:
print "wrong"
print "temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp
GPIO.cleanup()