ansible搭建基本使用
一、安装ansible
配置yum源
RHEL/CentOS 6:
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
RHEL/CentOS 7:
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum -y install ansible
(1/13): PyYAML-3.10-3.1.el6.x86_64.rpm
(2/13): ansible-2.5.0-2.el6.noarch.rpm
(3/13): libyaml-0.1.3-4.el6_6.x86_64.rpm
(4/13): python-babel-0.9.4-5.1.el6.noarch.rpm
(5/13): python-crypto2.6-2.6.1-2.el6.x86_64.rpm
(6/13): python-httplib2-0.7.7-1.el6.noarch.rpm
(7/13): python-jinja2-26-2.6-3.el6.noarch.rpm
(8/13): python-keyczar-0.71c-1.el6.noarch.rpm
(9/13): python-markupsafe-0.9.2-4.el6.x86_64.rpm
(10/13): python-pyasn1-0.0.12a-1.el6.noarch.rpm
(11/13): python-simplejson-2.0.9-3.1.el6.x86_64.rpm
(12/13): python-six-1.9.0-2.el6.noarch.rpm
(13/13): sshpass-1.06-1.el6.x86_64.rpm
用户可以修改一下配置文件来修改设置,他们的被读取的顺序如下:
* ANSIBLE_CONFIG (一个环境变量)
* ansible.cfg (位于当前目录中)
* .ansible.cfg (位于家目录中)
* /etc/ansible/ansible.cfg
二、配置远程
配置Ansible管理节点和主机的连接
其实就是配置从管理节点到远程主机之间基于key(无密码的方式)的SSH连接:
$ # 生成ssh key
$ ssh-keygen
$ # 拷贝ssh key到远程主机,ssh的时候就不需要输入密码了
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.64.5
$ ssh-copy-id remoteuser@remoteserver
$ # ssh的时候不会提示是否保存key
$ ssh-keyscan remote_servers >> ~/.ssh/known_hosts
# 批量添加密钥
sed -i '/StrictHostKeyChecking/c StrictHostKeyChecking no' /etc/ssh/ssh_config
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
cat IP.txt |while read line
do
echo $line
sshpass -p "Seblong@@Data" ssh-copy-id -p 8848 ops@${line}
done
验证SSH配置: 在管理节点执行下面的ssh命令,既不需要输入密码,也不会提醒你存储key,那就成功啦。
$ ssh remoteuser@remoteserver
# 指定python解释器
ansible_python_interpreter=/usr/bin/python2
先决条件:安装 pip
如果pip您的系统上尚不可用,请运行以下命令进行安装:
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py --user
ansible命令功能有哪些
先不用深纠命令的语法,讲完module那节,就可以理解语法。通过下面的命令感性地体会下ansible命令行的功能。
检查ansible安装环境
检查所有的远程主机,是否以bruce用户创建了ansible主机可以访问的环境。
# -f 指定并发
$ansible all -m ping -u bruce -f 10
执行命令
在所有的远程主机上,以当前bash的同名用户,在远程主机执行“echo bash”
$ansible all -a "/bin/echo hello"
拷贝文件
拷贝文件/etc/host到远程主机(组)web,位置为/tmp/hosts
$ ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"
安装包
远程主机(组)web安装yum包acme
$ ansible web -m yum -a "name=acme state=present"
添加用户
$ ansible all -m user -a "name=foo password=<crypted password here>"
下载git包
$ ansible web -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"
启动服务
$ ansible web -m service -a "name=httpd state=started"
并行执行
启动10个并行进行执行重起
$ansible lb -a "/sbin/reboot" -f 10
查看远程主机的全部系统信息!!!
$ ansible all -m setup
Ansible用脚本管理主机
为了避免重复输入命令,Ansible提供脚本功能。Ansible脚本的名字叫Playbook,使用的是YAML的格式,文件以yml结尾。
注解:YAML和JSON类似,是一种表示数据的格式.
执行脚本playbook的方法
$ ansible-playbook deploy.yml
配置与管理
1>主机与组
/etc/ansible/hosts 文件的格式:
方括号[]中是组名,用于对系统进行分类,便于对不同系统进行个别的管理.
[webservers]
foo.example.com
bar.example.com
[newsystem]
10.20.252.243
10.20.252.244
[testsystem]
10.10.36.103
10.10.36.104
# 如果主机ssh端口非22,可以按如下方式写
badwolf.example.com:5309
# 为静态IP地址设置别名
jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50
# 一组相似的 hostname
10.20.252.[1:252]
# 每一个 host,你还可以选择连接类型和连接用户名:
[targets]
localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_ssh_user=mpdehaan
other2.example.com ansible_connection=ssh ansible_ssh_user=mdehaan
问题描述:
一个系统可以属于不同的组,比如一台服务器可以同时属于 webserver组 和 dbserver组。这时属于两个组的变量都可以为这台主机所用优先级关系?
2>主机变量
分配变量给主机很容易做到,这些变量定义后可在 playbooks 中使用:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
3>组的变量
也可以定义属于整个组的变量:
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
4>把一个组作为另一个组的子成员
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2
Playbook基本语法
1>执行Playbook语法
$ ansible-playbook deploy.yml
ansible-playbook playbook.yml --verbose # 查看输出的细节
ansible-playbook playbook.yml --list-hosts # 查看该脚本影响哪些hosts
ansible-playbook playbook.yml -f 10 # 并行执行脚本
2>完整的playbook脚本示例
1、在什么机器上以什么身份执行
hosts
users
…
2、执行的任务是都有什么
tasks
3、善后的任务都有什么
handlers
实用举例
# 同步时间
ansible all -m command -a "ntpdate -u 195.13.1.153"
# 删除系统用户
ansible all -u root -m user -a 'name=magang state=absent remove=yes'
#!/bin/bash
for i in `seq 80 119`; do
ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub 10.20.10.$i
done
#!/usr/bin/expect
set timeout 10
set username [lindex $argv 0]
set password [lindex $argv 1]
set hostname [lindex $argv 2]
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $username@$hostname
expect {
#first connect, no public key in ~/.ssh/known_hosts
"Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
expect "password:"
send "$password\r"
}
#already has public key in ~/.ssh/known_hosts
"password:" {
send "$password\r"
}
"Now try logging into the machine" {
#it has authorized, do nothing!
}
}
expect eof
mkdir /data/files/nfsroot02
mount -t nfs -o noexec,nosuid,nodev,noatime 10.10.64.200:/nfsroot02 /data/files/nfsroot02
自动创建挂载点并挂载之 10.20.7.103:/var/www/html /var/www/html01
ansible refactor -m mount -a 'fstype=nfs name=/data/files/nfsroot02 src=10.10.64.200:/nfsroot02 opts=noexec,nosuid,nodev,noatime state=mounted'
自动创建挂载点并挂载之 10.20.7.115:/var/www/html /var/www/html
ansible dev -m mount -a 'fstype=nfs name=/var/www/html src=10.20.7.115:/var/www/html opts=noexec,nosuid,nodev,noatime state=mounted'
自动创建挂载点并挂载之 10.20.7.103:/var/www/html /var/www/html01
ansible dev -m mount -a 'fstype=nfs name=/var/www/html01 src=10.20.7.103:/var/www/html opts=noexec,nosuid,nodev,noatime state=mounted'
删除挂载点 10.20.7.103:/var/www/html /var/www/html01
ansible dev -m mount -a 'fstype=nfs name=/var/www/html01 src=10.20.7.103:/var/www/html opts=noexec,nosuid,nodev,noatime state=absent'
删除挂载点 10.20.7.115:/var/www/html /var/www/html
ansible dev -m mount -a 'fstype=nfs name=/var/www/html src=10.20.7.115:/var/www/html opts=noexec,nosuid,nodev,noatime state=absent'
for i in `seq 1 100`
do
ping -c 1 10.20.8.$i > /dev/null
if [ $? == 0 ];then
echo 10.20.8.$i
fi
done
for i in `seq 1 45`
do
ping -c 1 10.20.8.$i > /dev/null
if [ $? == 0 ];then
echo 10.20.8.$i
fi
done
# 批量添加密钥
cat ip_list.txt
192.168.0.211 pwd
192.168.0.210 pwd
cat ip_list.txt |while read IP passwd;do
sshpass -p $passwd ssh-copy-id root@$IP;
done
#!/usr/bin/expect
set timeout 30
spawn ssh -l root 10.20.250.100
expect {
"yes/no" { send "yes\r";exp_continue}
"*assword:" {send "centos6.8"}
}
expect "*>" {send "echo’HelloWorld!’\r"}
expect "*>" {send"exit\r"}
expect eof
for i in `seq 95 99`
do
ssh-copy-id root@10.20.8.$i
if [ $? == 0 ];then
echo 10.20.8.$i
fi
done
echo "centos6.8"| ssh-copy-id root@10.20.8.2
centos6.8
#!/bin/bash
# password="centos6.8"
/usr/bin/expect <<EOF
set time 30
spawn ssh-copy-id root@10.20.8.3
expect {
"*yes/no" {send "yes\r"; exp_continue}
"*password:" {send "centos6.8\r"}
}
expect "*#"
send "exit\r"
interact
expect eof
EOF
ansible使用实例copy文件到远程
ansible redis -m copy -a "src=/data/software/redis-cluster dest=/data/software/ owner=croot group=croot mode=0755"
#src 主控端文件位置
#dest 被控端目标位置
#owner 文件复制过去后的所有者
#group 文件复制过去后的所属组
#mode 文件的权限设定,执行a+x这种方式
问题描述:
ssh -v 10.10.64.3
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure. Minor code may provide more information
Cannot determine realm for numeric host address
ssh连接特别慢
解决方案:
ansible all -m shell -a "sed -i.bak -e 's/GSSAPIAuthentication yes/#GSSAPIAuthentication yes/' -e 's/#GSSAPIAuthentication no/GSSAPIAuthentication no/' /etc/ssh/sshd_config"
ansible all -m shell -a "service sshd restart"
#获取当前时间
now()
# 第一次连接不需要输入yes/no
host_key_checking = False
ansible-playbook
# 触发执行任务
handlers # 执行器
notify # 触发器
setup 模块
ansible 192.168.0.251 -m setup |less