您的位置:首页 > 运维架构

ansible学习小记

2017-12-12 18:37 225 查看
明天游戏就要上线咯,由于之前的测试都是几台机器,纯手动部署就ok了,现在正式上线十多台机器,要是再一个个手动部署就gg了 ,所以需要一个自动化部署的工具,也就是使用ansbile. 话不多说,也就是看了几天,只能是略了解 ,重点是能把部署的工程自动化跑起来,至于方法好不好的问题,不在讨论范围了,毕竟也不是专业的运维人员

安装

首先安装,关于安装的问题提醒大家一般在网上搜的话,最好看下日期,一般选择比较接近现在的时间的文章参考比较好,我一开始就是按照某篇安装的ansible,步骤很多,现在知道那个全都是手动安装。结果是成功了,但是后来操作发现一个奇怪的错误,网上一堆也找不到解决,一番功夫发现有个人也遇到,结果他安装了2.0的版本发现就没有这个问题了!!!瞬间秒看了自己的安装的版本果然是1.7的老版本,于是怒删之,重新安装,话说有这一番折腾真是把人的耐心磨没了都,后来我是参考了公司另外一个人写的read_me才发现原来安装贼方便。。。

由于系统默认的python2.6是不行的,ansible需要python2.7以上的,所以先安装python 并且处理好yum的配置。

python2.7 下载

tar -zxvf Python-2.7.14.tgz

./configure

make all

make install

make clean

make distclean

建立软链接,使系统默认的python指向python2.7

mv /usr/bin/python /usr/bin/python2.6.6

ln -s /usr/local/bin/python2.7 /usr/bin/python

python -V – 这样就看到已经是python2.7了

因为yum是不兼容 Python 2.7的,所以yum不能正常工作,我们需要指定 yum 的Python版本

vim /usr/bin/yum

将头行指定的解释器 /usr/bin/python 修改为/usr/bin/python2.6.6

ansible安装有多种方式,在此是pip安装足够方便了(看到别人使用yum install epel-release -y

yum install ansible -y 不过我没试过哈)

安装pip 下载 可以直接右键网页另存为get-pip.py

安装
python get-pip.py


安装sshpass下载 这个是为了ssh直接不用密码确认登录的

cd sshpass-1.06/


./configure


make && make install


到这一步就可以直接使用pip安装ansible啦 (看到别人也可以使用yum install epel-release -y

yum install ansible -y)

pip install ansible

这里ansible就安装完啦,是不是so easy~

然后在建立一个/etc/ansilbe/hosts文件进行测试咯 其实这是ansible默认读取的位置,后续可以加参数指定hosts文件的。

[test_server]
192.168.0.231 ansible_ssh_user=root ansible_ssh_pass=123456


其中test_server为组,下面那些就是机器节点

组可以用多个

同一个机器节点,可以属于不同的组

根据以上配置,就可以开始测试啦

[root@localhost python]# ansible server -a ‘uptime’

192.168.0.231 | SUCCESS | rc=0 >>

18:54:26 up 2:51, 3 users, load average: 0.32, 0.26, 0.20

ansible all -m ping也有很多教程都是用这个测试的,all 就是代表所有组,在此可以换成test_server

常用模块

command
:执行某命令,不能用管道之类的东西,因为其不是用shell执行的,没有shell的那种特性

ansible all -m command -a ‘uptime’:所有的机器执行uptime命令

ansible all -m command -a ‘chdir /data/ ls’:所有机器执行ls命令,ls的目录是/data

由于其是默认的模块,是以以上命令也可以简写成
ansible all -a 'uptime'


shell
:使用机器的shell执行

ansible all -m shell -a ‘uptime’:所有的机器执行uptime命令

ansible all -m shell -a ‘ps -ef|grep nginx’:所有机器执行ps -ef|grep nginx命令

*

script
:到对象节点上执行本地脚本

ansible all -m script -a /data/set.sh

ping
:看看机器能否ping通

ansible all -m ping

setup
:获取机器的配置

ansible all -m setup:获取所有机器的配置信息

ansible all -m setup –tree /path/to/save:获取机器的配置信息,并且写入到目录
path/to/save


yum
:和机器的yum一样(不要给控制机也yum,否则会报错)

ansible all -m yum -a ‘name=nc’:为所有机器yum一个nc

ansible all -m yum -a “name=nc state=present”:立刻为所有机器yum一个nc

调用此命令时候,不要yum中安装有ansilble机器(即ansible控制机),否则会报以下错误

192.168.0.231 | FAILED! => {

“changed”: false,

“msg”: “python2 bindings for rpm are needed for this module. python2 yum module is needed for this module”

}

原因估计ansible这样执行的,/usr/bin/python /usr/bin/yum XXXXX 所以只要是其他机器安装了ansible的,或者修改了/usr/bin/python的版本就会报上面这个错误

copy
:复制命令

ansible all -m copy -a “src=/data/src.txt dest=/data/dest.txt”:将本地的
/data/src.txt
文件拷贝到所有机器的
/data/dest.txt
文件中,此处,其会对比文件是否相同,若是相同,则比较文件是否有修改,若是没有修改,则不做事,若是修改,则覆盖之

ansible all -m copy -a “src=/data/src.txt dest=/data”:将本地的
/data/src.txt
文件拷贝到所有机器的
/data/
文件夹中

ansible all -m copy -a “src=/data/ dest=/data”:将本地的
/data/
目录拷贝到所有机器的
/data/
文件夹中(文件在路径/data/data/目录里面)

调用此命令时候,不要将文件也copy到自己的机器(即ansible控制机),否则会报以下错误(尽管你已经安装了libselinux-python)

192.168.0.231 | FAILED! => {

“changed”: false,

“checksum”: “956f6c7150dcecba1103ecd14c42c5aab83bdd98”,

“msg”: “Aborting, target uses selinux but python bindings (libselinux-python) aren’t installed!”

}

playbook

实例1

#dep.yml
---
- name: dep
hosts: all
remote_user: root
tasks:
- name: install zip
yum : name=zip
tags:
- tag1
- tag2
- name: install unzip
yum : name=unzip
- name: install nc
yum : name=nc
- name: install lrzsz
yum : name=lrzsz


* 运行指令
ansible-playbook dep.yml
:在所有的机器上面,执行所有tasks

* 运行指令
ansible-playbook dep.yml -i bitch.hosts
:在所有的机器上面,执行所有tasks,其host文件不用默认的/etc/ansible/hosts,而是用bitch.hosts这个hosts文件

* 运行指令
ansible-playbook dep.yml --tags tag1,tag2
:在所有的机器上面,执行带有tags标志为tag1或者tag2的tasks

* hosts: 那些组的机器(即配置文件/etc/ansible/hosts里面的配置)

* remote_user:执行远程命令的用户

* tasks:任务,是一个列表

* name:任务名称

* yum:即模块名称,参考上面说的
常用模块


* tags:标志,是一个列表,可配置多个

实例2

#include_example.yml
---
- name: bitch
hosts: all
remote_user: root
gather_facts: true
tasks:
- name: say hi
tags: foo
shell: echo "hi..."

- include: dep.yml #此文件问实例1中的文件


运行指令
ansible-playbook include_example.yml
:在所有的机器上面,执行所有tasks(包括dep.yml里面的)

实例3

#var_example.yml
---
- name: copyfile
hosts: server
remote_user: root
vars:
- ddir: '/data/test_ansible'
tasks:
- name: depzip
yum : name=zip
- name: newdir
file: path="{{ddir}}" state=directory


运行指令
ansible-playbook var_example.yml
:在所有的机器上面,执行所有tasks

vars:定义变量
ddir
,使用方法在
{{ddir}}


实例4

文件vars_files_conf.yml

zip_src_file: 'cn.zip'
zip_dest_dir: '/data'


#scp_scheme.yml
---
- name: scp_scheme
hosts: all
remote_user: root
vars_files:
- vars_files_conf.yml

tasks:

- name: scp scheme
copy: src="{{zip_src_file}}" dest="{{dest_dir}}"


运行指令
ansible-playbook scp_scheme.yml
:在所有的机器上面,执行所有tasks

通过在一个文件中定义变量,到处使用

vars_files:里面定义了两个变量zip_src_file,zip_dest_dir

由于ansible默认的gather_facts 收集主机信息是开的,当批量运行的时候会导致很慢,所以一般把它关掉,执行速度快些。

---
- name: dep_agent
hosts: '{{host}}'
user: root
gather_facts: false
vars_files:
- var_conf.yml
tasks:
- name: tar
unarchive: src={{agent_file}} dest={{dest_agent_dir}}
- name: seq
script:
/data/ansible/set_host.sh {{host}}
- name: start agent
shell: "nohup /data/agent/bin/falcon-agent -c /data/agent/config/cfg.json > /dev/null 2>&1 &"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息