@Great-Chinese
2017-03-23T00:08:27.000000Z
字数 15136
阅读 1011
自动化运维
# 两台机器
192.168.31.127 (服务端)
192.168.31.128 (客户端)
# 设置两台hostname
vim /etc/sysconfig/network
HOSTNAME=web9.melody.com
HOSTNAME=web10.melody.com
# 编辑两台hosts
vim hosts
192.168.31.127 web9.melody.com
192.168.31.128 web10.melody.com
# 查看两台hostname
cat /etc/sysconfig/network
# 两台机器关闭selinux,清空iptables规则
vim /etc/selinux/config
setenforce 0
iptables -nvL
# 在两台机器上ping
ping web9.melody.com
ping web10.melody.com
# 两台机器上安装ntpdate,
yum install -y ntp
ntpdate time.windows.com >/dev/null 2>&1
# 两台机器上制定任务计划
crontab -e
*/10 * * * * ntpdate time.windows.com >/dev/null 2>&1
# 安装puppet源
rpm -ivh "http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm"
ls /etc/yum.repos.d/ # 查看安装源包
# 安装服务端程序
yum install -y puppet-server
ls /etc/init.d/puppetmaster # 查看puppet
# 开机启动
chkconfig puppetmaster on
# 启动服务
service puppetmaster start
ps aux |grep puppet # 查看进程
netstat -lnp # 查看监听窗口
# 安装puppet源
rpm -ivh "http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm"
ls /etc/yum.repos.d/ # 查看安装源包
# 安装客户端程序
yum install -y puppet
ls /etc/init.d/puppet # 查看puppet
# 修改配置文件
vim /etc/puppet/puppet.conf //在最后面添加
listen = true
server = web9.melody.com
runinterval = 10
# 开机启动
chkconfig puppet on
# 启动服务
service puppet start
/etc/init.d/puppet start
ps aux |grep puppet # 查看进程
netstat -lnp # 查看监听窗口
# 服务端查看客户端所有证书列表
puppet cert list --all //带一个+表示证书已签发
# 客户端上生成ssl证书
puppet agent --test --server web9.melody.com
# 服务端签发指定客户端证书
puppet cert --sign web10.melody.com
# 服务端可以删除指定客户端证书
puppet cert clean web10.melody.com
# 删除的证书可以重启或手动重新生成证书
/etc/init.d/puppet restart
rm -rf /var/lib/puppet/ssl/* //证书存放的目录
# 删除所有证书
puppet cert clean --all
# 服务端修改puppet配置文件
vim /etc/puppet/puppet.conf //在[main]最后添加
autosign = true
# 服务端创建自动签发的配置文件
vim /etc/puppet/autosign.conf //增加内容如下
*.melody.com
# 服务端删除所有客户端证书
puppet cert clean --all
# 重签之后,服务端重启
/etc/init.d/puppetmaster restart
# 客户端删除所有证书
rm -rf /var/lib/puppet/ssl/* //证书存放的目录
# 重签之后,客户端重启
service puppet restart
#
puppet cert list --all
# 修改客户端配置文件
vim /etc/puppet/puppet.conf //在最后面添加
listen = true
server = web9.melody.com
runinterval = 10
# 删除旧的证书资料
rm -rf /var/lib/puppet/ssl/*
# 重启客户端
/etc/init.d/puppet restart
puppet agent --test --server web9.melody.com //如果客户端不重启,也可以通过此命令来自动签发
# 在服务端编辑manifests文件
vim /etc/puppet/manifests/site.pp
node defalt {
file {"/tmp/333.txt":
content => "test,test";
}
}
# 服务端重启
/etc/init.d/puppetmaster restart
# 客户端查看文件是否生成
ls -l /tmp/
模块是puppet的配置单元,模块里面会包含类和资源。同步文件、远程执行命令、cron等叫做资源,都是通过模块来 实现的。
# 服务端创建目录
mkdir /etc/puppet/modules/testm
cd /etc/puppet/modules/testm
mkdir {files,manifests,templates}
cd files/
vim 1.txt
# 服务端创建配置文件
vim /etc/puppet/modules/testm/manifests/init.pp
class testm{
file {"/tmp/2.txt":
owner => "root",
group => "root",
mode => 0400,
source => "puppet://$puppetserver/modules/testm/1.txt"
}
}
# 服务端定义主配置文件
vim /etc/puppet/manifests/site.pp
$puppetserver='web9.melody.com'
node 'web10.melody.com' {
include testm
}
# 配置完成后,在客户端执行命令,如果puppet服务已启动,不用执行此命令也会自动同步的
puppet agent --test --server=web9.melody.com
# 服务端增加相关目录
cd /etc/etc/puppet/modules/testm/files
mkdir apache2
cd apache2
mkdir {bin,conf,logs}
# 服务端编辑模块配置文件
vim /etc/puppet/modules/testm/manifests/init.pp
class apache{
file {"/usr/local/apache2":
owner => "root",
group => "root",
source => "puppet://$puppetserver/modules/testm/apache2",
recurse => true,
purge => true
}
}
# 服务端定义主配置文件
vim /etc/puppet/manifests/site.pp
$puppetserver='web9.aming.com'
node 'web10.melody.com' {
include testm
include apache
}
# 客户端上查询
puppet agent --test --server=web9.melody.com //在客户端上手动执行
ls /usr/local
ls -l /usr/local/apache2
cat /usr/local/apache2/conf/httpd.conf
# 服务端编辑模块配置文件
vim /etc/puppet/modules/testm/manifests/init.pp
exec {"123":
unless => "test -f /tmp/melodylinux.txt", // 第二种情况把unless改成onlyif
path => ["/bin", "/sbin", "/usr/bin", "/usr/sbin"],
command => "touch /tmp/melodylinux.txt"
}
# unless后面的命令作为一个条件,当条件成立时,不会执行下面的命令
# onlyif 如果条件成立里要执行下面的命令就用onlyif
# 在客户端查看有没有生成文件
ls -lt /tmp
# 服务端编辑模块配置文件
vim /etc/puppet/modules/testm/manifests/init.pp
cron { "melody1":
command => "/sbin/ntpdate time.windows.com",
user => "root",
minute => "*/10",
monthday => "10-15",
# ensure => "absent"
}
}
# ensure设置为absent表示删除改任务
# 在客户端查看任务计划
crontab -l
# 主从两台机器
192.168.31.127 -服务端
192.168.31.128 -客户端
# 设置hostname与hosts
192.168.31.127 web9.melody.com
192.168.31.128 web10.melody.com
# 关闭seliunx,清空iptables规则
# 服务端---安装salt
yum install -y epel-release
yum install -y salt-master salt-minion
# 服务端/客户端统一修改配置文件
vim /etc/salt/minion
master:web9.melody.com
# 启动salt
/etc/init.d/salt-master start
/etc/init.d/salt-minion start
# 客户端---安装salt
yum install -y epel-release
yum install -y salt-minion
# 服务端/客户端统一修改配置文件
vim /etc/salt/minion
master:web9.melody.com
# 客户端启动salt
/etc/init.d/salt-minion start
salt-key // 查看已经签发的客户端信息
salt-key -a web10.melody.com // 认可一台服务器
salt-key -a web9.melody.com // 再认可一台服务器
# 此时客户端的/etc/salt/pki/minion目录下,会多出minion_master.pub这个文件。
# 远程执行命令
salt '*' test.ping
salt '*' cmd.run 'df -h'
salt '*' cmd.run 'hostname'
salt '*' cmd.run 'w'
salt 'web9.melody.com' cmd.run 'w'
salt -E 'web(9|10).melody.com' cmd.run 'w' // 正则表达式
salt '*melody.com' cmd.run 'w'
salt 'web*' cmd.run 'w'
salt -L 'web9.melody.com,web10.melody.com' cmd.run 'w' //多个机器用逗号分隔
salt 'web10.melody.com' grains.ls // 列出所有的grains项目名字
salt 'web10.melody.com' grains.items // 列出所有的grains项目名字及值
# 客户端上增加grains文件
vim /etc/salt/grains //增加内容如下
role: nginx
env: test
myname: melodylinux.com
mydomain: apelearn.com
# 客户端重启
/etc/init.d/salt-minion restart
# 服务端获取grains
salt 'web10.melody.com' grains.item env
salt 'web10.melody.com' grains.item role env myname
salt 'web10.melody.com' grains.ls
salt 'web10.melody.com' grains.item role env myname
# 借助grains的一些属性信息来执行命令
salt -G mydomain:apelearn.com cmd.run 'w'
# 在服务端打开主配置文件,
vim /etc/salt/master //把下面三行前面的#去掉,
pillar_roots:
base:
- /srv/pillar
# 创建对应的目录
mkdir /srv/pillar
cd /srv/pillar
# 进入pillar目录下,自定义test文件
vim /srv/pillar/test.sls // 内容如下
conf: /etc/123.conf
myname: melody
# 编辑总入口配置文件
vim /srv/pillar/top.sls // 格式如下
base:
'web10.melody.com':
- test
# 重启master服务
/etc/init.d/salt-master restart
salt '*' pillar.items // 列出所有的pillar项目名字及值
salt '*' pillar.item conf //查看其中conf的值
# 刷新pillar,不需要重启服务
salt '*' saltutil.refresh_pillar
# 在服务端打开主配置文件
vim /etc/salt/master //把下面三行前面的#去掉,
file_roots:
base:
- /srv/salt/
# 在服务端创建目录并进入
mkdir -p /srv/salt
cd /srv/salt
# 在服务端创建top文件
vim /srv/salt/top.sls
base:
'web10.melody.com':
- apache
# 重启master
/etc/init.d/salt-master restart
# 在服务端编辑apache文件
vim /srv/salt/apache.sls
apache-service:
pkg.installed:
- names:
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
# 在服务端执行命令
salt 'web10.melody.com' state.highstate
# 在客户端查看httpd是否已启动
ps aux |grep httpd
/etc/init.d/httpd stop
chkconfig httpd off
chkconfig --list httpd
ps aux |grep httpd
chkconfig --list httpd
# 进入/srv/salt目录,操作如下步骤
cd /srv/salt
mkdir test
mkdir test/123
vim test/123/1.txt
# 修改filetest文件
vim filetest.sls //增加内容如下
file_test:
file.managed:
- name: /tmp/melodylinux.com
- source: salt://test/123/1.txt
- user: root
- group: root
- mode: 600
# 修改top文件
vim top.sls // 增加内容如下
base:
'web10.melody.com':
- apache
- filetest
# 接着在服务端执行命令
salt 'web10.melody.com' state.highstate
# 然后在客户端查看melodylinux.com文件是否生成
ls -l /tmp
cat /tmp/melodylinux.com
# 进入/srv/salt目录,操作如下步骤
cd /srv/salt
vim dirtest.sls // 增加内容如下
file_dir:
file.recurse:
- name: /tmp/testdir
- source: salt://test/123
- user: root
- file_mode: 644
- dir_mode: 755
- mkdir: True
- clean: True //加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除
# 修改top文件
vim top.sls // 增加内容如下
base:
'web10.melody.com':
- filetest
- dirtest
# 在服务端执行命令
salt 'web10.melody.com' state.highstate
# 然后在客户端查看testdir目录是否生成
ls -l /tmp
cat /tmp/testdir
# 进入/srv/salt目录,操作如下步骤
cd /srv/salt
vim cmdtest.sls // 增加内容如下
cmd_test:
cmd.run:
- onlyif: test -f /tmp/melodylinux.txt // unless 相反 //?????????????????????用onlyif命令才会创建成功,unless则不会跟老师讲的相反
- names:
- touch /tmp/melody123.txt
- mkdir /tmp/456
- user: root
# 修改top文件
vim top.sls // 增加内容如下
base:
'web10.melody.com':
- cmdtest
# 在服务端执行命令
salt 'web10.melody.com' state.highstate
# 然后在客户端查看melody123.txt文件和456目录是否生成
ls -l /tmp
# 进入/srv/salt目录,操作如下步骤
cd /srv/salt
vim shelltest.sls // 增加内容如下
shell_test:
cmd.script:
- source: salt://test/1.sh
- user: root
# 编辑脚本内容
vim test/1.sh // 增加内容如下
#!/bin/bash
touch /tmp/111.txt
if [ -d /tmp/1233 ]
then
rm -rf /tmp/1233
else
mkdir /tmp/1233
fi
# 修改top文件
vim top.sls // 增加内容如下
base:
'web10.melody.com':
- shelltest
# 在服务端执行命令
salt 'web10.melody.com' state.highstate
# 然后在客户端查看111.txt文件和1233目录是否生成
ls -l /tmp
# 进入/srv/salt目录,操作如下步骤
cd /srv/salt
vim crontest.sls
cron_test:
cron.present: # 增加用:present 删除用:absent
- name: /bin/touch /tmp/111.txt
- user: root
- minute: '*'
- hour: 20
- daymonth: 1-10
- month: '3,5'
- dayweek: '*'
# 修改top文件
vim top.sls // 增加内容如下
base:
'web10.melody.com':
- crontest
# 在服务端执行命令
salt 'web10.melody.com' state.highstate
# 然后在客户端查看定时任务计划是否成功
crontab -l
# 拷贝服务端上的文件到客户端
salt 'web10.melody.com' cp.get_file salt://apache.sls /tmp/apelearn.com
# 拷贝目录
salt 'web10.melody.com' cp.get_dir salt://test /tmp/ #客户端会自动创建test目录,所以后面不需要加
# 在服务端上显示客户端存活的minion
salt-run manage.up
# 命令行上去执行master上的shell脚本
salt 'web10.melody.com' cmd.script salt://test/1.sh
特点:不需要安装客户端,用sshd去通信;支持命令行模块,也支持编写yaml格式
## 服务端安装ansible
yum install -y epel-release 扩展源
yum install -y ansible
# 服务端上生成密钥对
ssh-keygen -t rsa
# 查看生成的密钥文件
ls -la /root/.ssh
# 查看服务端生成的公钥
cat /root/.ssh/id_rsa.pub
# 把公钥id_rsa.pub放到客户端.ssh/authorized_keys中
vim .ssh/authorized_keys
# 客户端关闭selinux,修改权限为600
setenforce 0
chmod 600 /root/.ssh/authorized_keys
# 在服务端连接客户端,logout退出
ssh web10.melody.com
# 服务端更改配置文件
vim /etc/ansible/hosts //在最后面增加如下三行内容
[testhosts]
127.0.0.1
web10.melody.com
#把公钥放到服务端的.ssh/authorized_keys
vim .ssh/authorized_keys
# 检测127.0.0.1是否能连接
ssh 127.0.0.1
# 远程执行命令
ansible testhosts -m command -a 'w'
ansible testhosts -m command -a 'hostname'
ansible web10.melody.com -m command -a 'hostname'
#如果报错libselinux-python,则安装如下
yum install -y libselinux-python
# 远程执行命令,支持脚本运行还有管道符
ansible web10.melody.com -m shell -a 'cat /etc/passwd|grep root'
# 拷贝文件
ansible web10.melody.com -m copy -a "src=/etc/passwd dest=/tmp/1.txt owner=root group=root mode=0644"
# 拷贝目录
ansible web10.melody.com -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=0755"
#首先创建一个shell脚本
vim /tmp/test.sh //增加内容如下
#!/bin/bash
d='date'
echo $d > /tmp/an_test.txt
#然后把该脚本分发到各个机器上去
ansible web10.melody.com -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh"
ansible web10.melody.com -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755"
#最后批量执行该脚本
ansible web10.melody.com -m shell -a "/bin/sh /tmp/test.sh"
ansible web10.melody.com -m shell -a "/tmp/test.sh"
# 支持远程执行命令并且带管道符
ansible web10.melody.com -m shell -a 'cat /etc/passwd|grep root'
# 制定一个任务计划
ansible web10.melody.com -m cron -a "name=test_cron job='/bin/bash /usr/local/sbin/1.sh' weekday=6"
# 客户端查看任务计划是否生成
crontab -l
# 删除一个任务计划
ansible web10.melody.com -m cron -a "name=test_cron state=absent"
# 相关时间的表示
minute hour day month weekday
# 安装rpm包
ansible web10.melody.com -m yum -a "name=vim-enhanced"
# 管理服务
ansible web10.melody.com -m service -a "name=httpd state=started enabled=no"
ansible web10.melody.com -m service -a "name=httpd state=stopped enabled=yes"
# 列出所有的模块
ansible-doc -l
# 查看指定模块的文档
ansible-doc cron
# 进入ansible目录下,编辑test目录
cd /etc/ansible/
vim test.yml # 增加内容如下
---
- hosts: web10.melody.com
remote_user: root
tasks:
- name: test_playbook
shell: touch /tmp/gary123.txt
# 执行命令
ansible-playbook test.yml
# 用playbook创建新用户
vim user.yml # 增加内容如下
---
- name: create_user
hosts: web10.melody.com
user: root
gather_facts: false
vars:
- user: "test"
tasks:
- name: create user
user: name="{{ user }}"
# 执行命令
ansible-playbook user.yml
# 在客户端上查看是否生成
grep test /etc/passwd
# 进入ansible目录下,编辑loop目录
cd /etc/ansible/
vim loop.yml //编辑loop文件
---
- hosts: testhosts
user: root
tasks:
- name: change mode for files
file: path=/tmp/ {{ item }} mode=600
with_items:
- a.txt
- b.txt
- c.txt
# 执行命令
ansible-playbook loop.yml
# 服务端,客户端查看是否文件生成
ls -l /tmp
# 进入ansible目录下,编辑when目录
cd /etc/ansible/
vim when.yml //编辑when文件
---
- hosts: testhosts
user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: facter_ipaddress == "192.168.31.127"
# 执行命令
ansible-playbook when.yml
# 在服务台查看是否生成when.txt文件
ls -lt /tmp/when.txt
# 获取 web10 服务器的参数
ansible web10.melody.com -m setup
# 进入ansible目录下,编辑handlers目录
cd /etc/ansible/
vim handlers.yml //编辑handlers文件
---
- name: handlers test
hosts: web10.melody.com
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/abc.txt
notify: test handlers
handlers: //只有当tasks执行成功时,handlers才会执行;否则不会。
- name: test handlers
shell: echo "111111" >> /tmp/abc.txt
# 执行命令
ansible-playbook handlers.yml
# 在客户端查看是否生成abc.txt文件
cat /tmp/abc.txt
# rsync同步文件
rsync -av /etc/passwd web10.melody.com:/tmp/aaa.txt
cd /usr/local
tar -zcvf nginx.tar.gz nginx
cd /etc/ansible
mkdir nginx_install
cd nginx_install
mkdir roles
cd roles // roles目录下有两个角色,common为一些准备操作,install为安装nginx的操作
# 每个角色下面又有几个目录
# handlers 当发生改变时要执行的操作,通常用在配置文件发生改变,重启服务;
# files 安装时用到的一些文件;
# meta 为说明信息,说明角色依赖等信息
# tasks 为核心的配置文件
# templates 通常存一些配置文件,启动脚本等模板文件
# vars 为定义的变量
mkdir common install
cd common/
mkdir tasks
# 定义common的tasks,nginx是需要一些依赖包
vim roles/common/tasks/main.yml // 增加内容如下
- name: Install initializtion require software
yum: name={{ item }} state=installed
with_items:
- zlib-devel
- pcre-devel
- openssl-devel
cd install/
mkdir tasks vars files templates
# 把打包的nginx目录,启动脚本,配置文件放到另一台机器上去
cp /usr/local/nginx.tar.gz files/
cp /usr/local/nginx/conf/nginx.conf templates/
cp /etc/init.d/nginx templates/
# 定义install的vars
vim roles/install/vars/main.yml // 增加内容如下
nginx_user: www
nginx_basedir: /usr/local/nginx
# 定义install的tasks下的copy
vim roles/install/tasks/copy.yml // 首先把所有用到的文档拷贝到目标机器,内容如下
- name: Copy Nginx Software
copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompression Nginx Software
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: copy Nginx Start Script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name:
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644
# 定义install的tasks下的install
vim roles/install/tasks/install.yml // 接下来会建立用户,启动服务,删除压缩包
- name: Create Nginx User
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Start Nginx Service
service: name=nginx state=started
- name: Add Boot Start Nginx Service
shell: chkconfig --level 345 nginx on
- name: Delete Nginx Compression files
shell: rm -rf /tmp/nginx.tar.gx
# 再创建main.yml并且把copy和install调用
vim roles/install/tasks/main.yml // 增加内容如下
- include: copy.yml
- include: install.yml
# 退到nginx_install目录下,创建install.yml文件
cd nginx_install
vim install.yml // 增加内容如下
---
- hosts: web10.melody.com
remote_user: root
gather_facts: True
roles:
- common
- install
# 最后执行命令
ansible-playbook install.yml
# 到客户端查看是否安装成功
rpm -qa |egrep 'pcre|openssl|zlib'
ps aux |grep nginx
chkconfig --list nginx
# 退回到/etc/ansilbe目录下
mkdir nginx_config
cd nginx_config
mkdir roles
cd roles
mkdir old new
cd new/
mkdir vars files tasks handlers //files下面为nginx.conf和vhosts目录,handlers为重启服务的命令
# 先把nginx.conf和vhosts目录放到files目录下
cp /usr/local/nginx/conf/nginx.conf files/
cp -r /usr/local/nginx/conf/vhosts files/
cd new/
# 定义vars变量
vim vars/main.yml //增加内容如下
nginx_basedir: /usr/local/nginx
# 定义handlesr服务
vim handlers/main.yml //增加内容如下
- name: restart nginx
shell: /etc/init.d/nginx reload
# 定义tasks变量,这是核心的任务
vim tasks/main.yml //增加内容如下
- name: copy conf file
copy: src={{ item.src }} dest={{ nginx_basedir }}/{{ item.dest }} backup=yes owner=root group=root mode=0644
with_items:
- { src: nginx.conf, dest: conf/nginx.conf }
- { src: vhosts, dest: conf/ }
notify: restart nginx
# 定义总入口配置文件,退回到nginx_config目录下
cd nginx_config
vim update.yml
---
- hosts: web10.melody.com
user: root
roles:
- new
#
vim roles/new/files/vhosts/1.conf
vim roles/new/files/nginx.conf
# 执行update
ansible-playbook update.yml
# 在客户端上查看更新的1.conf文件是否生成
cat /usr/local/nginx/conf/vhosts/1.conf
#
---
- hosts: web10.melody.com
user: root
roles:
- old
ansible-playbook backup.yml