Ansible安装
一、准备两台虚拟机 Ansibie 01 Ansibie02
只需在Ansibie01上操作
yum list lgrep ansible 可以看到自带源里就有2.4版本的ansible
yum install -y epel-release 安装完这个就可以安装Ansible
准备工作:
1.关闭防火墙 (第一台和第二台都需要执行):
systemctl stop firewalld
systemctl disable firewalld
修改配置文件:vi /etc/selinux/config 修改为disabled
修改临时的:setenforce 0
2.更改/etc/hosts/ 把两台主机的ip和名字加进来
3.开始安装 yum install -y ansible
4. 配置免密:在Ansible01上 ssh-keygen -t rsa 直接按回车即可
运行 ssh-copy-id 192.168.157.201
vi /etc/ansible/hosts
ssh-copy-id 127.0.0.1 对127.0.0.1执行免密
测试是否免密成功 ssh 192.168.157.201
二、Ansible远程执行命令
ansible testhost -m command -a ‘w‘·这样就可以批量执行命令了。这里的testhost为主机组名,-m后边是模块名字,-a后面是命令。当然我们也可以直接写一个ip,针对某一台机器来执行命令。
三、Ansible拷贝文件或者是目录
ansible Anisble02 -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=0755"
解释: ansible 后面是主机名 src 源地址 dest 目的地址 owner所属用户 group所属组 mode 权限
案例:在192.168.157.200 的文件test.txt 发送到192.168.157.201 上/tmp/123文件夹下
ansible 192.168.157.201 -m copy -a "src=test.txt dest=/tmp/123/test.txt"
·注意:①、源目录会放到目标目录下面去,如果目标指定的目录不存在,它会自动创建。②、如果拷贝的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命名。③但相反,如果desc是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面。
①、如果拷贝的是文件夹 ansible 192.168.157.201 -m copy -a "src=test1 dest=/tmp/test1" 在 192.168.157.201 没有创建test1文件夹 则执行后会自动创建
第一个test1是我执行命令后创建的test1 而第二个test1是传送的时候源文件的test1文件夹
②、如果拷贝的是文件 :ansible 192.168.157.201 -m copy -a "src=test1.txt dest=/tmp/test2.txt"
③、 如果目标机器上已经存在要复制文件的目录 ansible 192.168.157.201 -m copy -a "src=test1.txt dest=/tmp/test1.txt"
四、 Ansible 远程执行脚本
编写vim/test.sh
然后把脚本分发到各个机器上
ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755"
最后是批量执行该shell的脚本
ansible testhost -m shell -a "/tmp/test.sh"
shell 模块还支持远程执行命令 还带管道
ansible testhost -m shell -a "cat /etc/passwd|wc -l"
五、Ansible 管理计划
ansible testhost -m cron -a "name=‘test cron‘ job=‘/bin/touch /tmp/1212.txt‘ weekday=6"
使用crontab -e查看
删除cron 只需添加state=absent
ansible testhost -m cron -a "name=‘test cron‘ state=absent"
再使用crontab -e 查看 显示文件为空
六、Ansible安装rpm包/管理服务
1.ansible testhost -m yum -a "name=httpd" 安装httpd
在name后面还可以加上state=installed/removed
ansible testhost -m service -a "name=httpd state=started enabled=yes"
这里的name是centos系统里的服务名,可以通过chkconfig --list查到。
systemctl status httpd 检查状态
使用Ansible可以很方便的安装使用开启某一个服务 这样是很方便的
2.Ansible文档的使用
ansible-doc -l 列出所有的模块
ansible-doc cron(最常用的) 查看指定模块文档
七、Ansible playbook的使用
vi /etc/ansible/test.yml
注意格式!!
·说明:第一行需要有三个杠,hosts参数指定了对哪些主机进行参作,如果是多台机器可以用逗号作为分隔,也可以使用主机组,在/etc/ansible/hosts里定义;
. user参数指定了使用什么用户登录远程主机操作;
tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来,shell是ansible模块名字
运行 ansible-playbook /etc/ansible/test.yml playbook后面加上文件的路径
案例:创建一个用户
vi /etc/ansible/crete_user.yml
·说明: name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印name变量的值,可以省略; gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到; vars参数,指定了变量,这里指字一个user变量,其值为test,需要注意的是,变量值一定要用引号引住;user提定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。
运行 ansible-playbook /etc/ansible/crete_user.yml
八、Ansible playbook中的循环
案例:改变文件的权限
先在两台机器上创建三个文件 1.txt 2.txt 3.txt 然后查看文件的权限
vi /etc/ansible/while.yml
file: path=/tmp/{{ item }} mode=600 更改权限
with_items: 是循环的部分
九、Ansible playbook中的条件判断
vi /etc/ansible/when.yml
gather_facts: True 运行之前检查一下
when 条件判断 当ansible 中网卡的ens33 的IPv4的IP 为192.168.157.201 则执行 则在该机器上创建when.txt
运行 ansible-playbook /etc/ansible/when.yml
十、Ansible playbook中的handlers
执行task之后,服务器发生变化之后要执行的一些操作,比如我们修改了配置文件后,需要重启一下服务
vi /etc/ansible/handlers.yml
copy 拷贝 src源地址 dest 目的地址 加入的111111 是因为和passwd文件区分开来 notify 定义一个关键字
运行 ansible-playbook /etc/ansible/handlers.yml
查看运行结果
十一、 playbook实战-nginx安装(环境准备)
思路:先在一台机器上编译安装好nginx、打包,然后再用ansible去下发. cd /etc/ansible进入ansible配置文件目录
下载nginx wegt http://mirrors.sohu.com/nginx/nginx-1.9.6.tar.gz
解压 tar -zxvf nginx-1.9.6.tar.gz
cd /nginx-1.9.6.tar.gz
安装依赖 yum install gcc gcc-c+t pcre-devel zlib-devel openssl-devel -y(两台机器都要装)
执行 ./configure --prefix=/usr/local/nginx
执行make && make install
编辑文件
[root@Ansible01 nginx-1.9.6]# vi /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
#Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usx/local/nginx/logs/nginx.pid"
RETVAL=O
prog="Nginx"
start()
{
echo -n S"Starting Sprog:
"mkdir -p/dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
resturn $RETVAL
}
stop()
{
echo -n $"Stopping Sprog: "
killproc -p SNGINX_PID SNGINX_SBIN -TERM
rm -rf/dev/shm/nginx_temp
RETVAL=S?
echo
return $RETVAL
}
reload()
{
echo -n S"Reloading Sprog: "
killproc -p SNGINX_PID SNGINX_SBIN -HUP
RETVAL=S?
echo
return SRETVAL
}
restart()
{
stop
start
}
configtest()
{
SNGINX_SBIN -c $NGINX_CONF -t
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
configtest)
configtest
;;
*)
echo $"Usage: $0 {start|stop/reload|restart|configtest} "
RETVAL=1
esac
exit $RETVAL
[root@Ansible01 nginx-1.9.6]# vi /usr/local/nginx/conf/nginx.conf
添加以下内容:
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 6000;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 3526;
server_names_hash_max_size 4096;
log_format combined_realip ‘Sremote_addr $http_x_forwarded_for
[Stime_local]‘
‘&host "Srequest_uri" $status‘
‘"$http_referer" "$http_user_agent"‘;
sendfile on;
tcp_nopush on;
keepalive_timeout 30;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 8 4k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
client_max_body_size 10m;
client_body_buffer_size 256k;
client_body_temp_path /usr/local/nginx/client_body_temp;
proxy_temp_path /usr/local/nginx/proxy_temp;
fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
fastcgi_intercept_errors on;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 5;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/htm
application/xml;
server
{
listen 80;
server_name localhost;
index index.html index.htm index.php;
root /usr/local/nginx/html;
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/1ocal/nginx/htmlSfastcgi_script_name;
}
}
}
查看是否有错误/usr/local/nginx/sbin/nginx -t
先关闭httpd 要不然会出错systemctl stop httpd
启用nginx service nginx start
创建目录
对nginx 进行打包
cd/usr/local
将包放在
[root@Ansible01 local]# mv nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/
将两个配置文件复制到相应路径中
.mkdir nginx_install创建一个nginx_install的目录,方便管理. cd nginx_install
.mkdir -p roles/{common,install/{handlers,files,meta,tasks,templates,vars}
说明: roles目录下有两个角色,common为一些准备操作,install为安装nginx的操作。每个角色下面又有几个目录,handlers下面是当发生改变时要执行的操作,通常用在配置文件发生改变,重启服务。files为安装时用到的一些文件,meta为说明信息,说明角色依赖等信息,tasks里面是核心的配置文件,templates通常存一些配置文件,启动脚本等模板文件,vars下为定义的变量
十二、 playbook实战-nginx安装(文件编辑)
vim /etc/ansible/nginx_install/roles/common/tasks/main.yml
定义变量:
vim /etc/ansible/nginx_install/roles/install/vars/main.yml
首先要把所有用到的文档拷贝到目标机器
vim /etc/ansible/nginx_install/roles/install/tasks/copy.yml
十三、 playbook实战-nginx安装(执行)
1.接下来会建立用户,启动服务,删除压缩包
vim /etc/ansible/nginx_install/roles/install/tasks/install.yml
内容如下
2.再创建main.yml并且把copy和install调用
vim /etc/ansible/nginx_install/roles/install/tasks/main.yml
//内容如下
到此两个roles: common和install就定义完成了,接下来要定义一个入口配置文件
vim /etc/ansible/nginx_install/install.yml
内容如下
·执行: ansible-playbook /etc/ansible/nginx_install/install.yml
原文:https://www.cnblogs.com/lsy579/p/14809124.html