Ansible自动化运维工具使用
本文描述自动化运维工具 Ansible 的安装及基础使用方法,包含:
主机配置
Ad-Hoc command(命令行执行)
Playbook (任务剧本)
Ansible 和 Saltstack 是目前主流的两个自动化运维工具,都可以用于同时对大量主机进行系统配置,应用部署等工作,利用这种集成化的自动运维工具最大的优势在于运维体系结构的持续可维护性。本文先着眼于 Ansible 的基础使用,不会进行太多扩展,通过本文可以快速上手使用 Ansible。
Ansible 的一大特点是 agentless,可以通过 SSH 来对服务器进行管理,意味着只需要将 Ansible 部署到一台服务器。
1
安装 Ansible
1
通常情况下,Ansible 可以部署到登录服务器上,登录服务器存放 ssh 私钥,这样在对操作主机群时就无需每次输入密码。
Ansible 默认主机配置文件在 /etc/ansible/hosts,你也可以创建新的配置文件来管理主机,如果使用其他主机配置,在执行命令行时就需要通过 -i <path> 参数指定主机配置。
foo.example.com
bar.example.com
1
2
3
Ad-Hoc Command
Ad-Hoc Command 指那些希望立即执行对一组服务器进行操作,而这个操作过程不需要进行保存的方式。例如临时需要对 webservers 这组主机下的 /opt/testfile 文件进行删除,而这种操作是没有必要保存成 Playbook (剧本模式,稍后会说到)的。
1
参数 -m 指定使用的功能模块是 command,-a 设置模块所需参数队列,对于 command 模块来讲,这个参数就是你需要执行的命令。
ansible webservers -a "rm -f /opt/testfile"
1
上述命令将本地 /etc/hosts 分发到 webservers 的 /tmp/hosts。
Playbook 可以称之为任务剧本,它允许你按照剧本的方式编排需要完成的任务,使用 YAML 的语法格式。
- hosts: webservers
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这个简单的例子完成的任务是部署或更新 webservers 这一组主机的 apache。
2 通过 template 模块来设置配置文件,如果配置有更新则通知 handler 重启 apache;
3 通过 service 模块来判断 apache 是否在运行,如果没有则启动 apache。
handlers:事件处理,处理任务中的 notify
1.absible定义
ansible是一个轻量级的运维管理工具,基于Python研发。可实现对系统的批量管理配置、程序的批量部署、批量的运行命令等功能。仅需在任意管理主机安装ansible程序即可实现批量管理被管控主机且被管控的主机无需客户端。
2.ansible特性
1、no agents:不需要在被管控主机上安装任何客户端;
2、no server:无服务器端,使用时直接运行命令即可;
Core Modules 核心模块
Customed Modules 自定义模块
Host Iventory 主机库清单,定义要管理的主机
Files 可以通过配置文件来实现
CMDB 也可以通过外部存储来实现
PlayBooks 剧本,定义每个主机所扮演的角色
Connection Plugins:连接插件,主要连接各管控主机
5.工作机制
1.ansible需python2.6以上版本
[root@test1 ~]# python -V
Python2.7.5
# 安装python驱动(不然下面会报错)
yum install python-devel -y
2.安装ansible
#setuptools安装
cd
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
tar xvzf setuptools-7.0.tar.gz
cd setuptools-7.0
python setup.py install
#pycrypto模块安装
wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
tar -xzf pycrypto-2.6.1.tar.gz
cd pycrypto-2.6.1
python setup.py install
#PyYAML模块安装
cd
wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar -xzf yaml-0.1.5.tar.gz
cd yaml-0.1.5
./configure --prefix=/usr/local
make -j `grep processor /proc/cpuinfo| wc -l` && make install
cd
wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
tar -xzf PyYAML-3.11.tar.gz
cd PyYAML-3.11
python setup.py install
#Jinja2模块安装
cd
wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
tar -xzf MarkupSafe-0.9.3.tar.gz
cd MarkupSafe-0.9.3
python setup.py install
cd
wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
tar xvzf Jinja2-2.7.3.tar.gz
cd Jinja2-2.7.3
python setup.py install
#paramiko模块安装
cd
wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
tar xvzf ecdsa-0.11.tar.gz
cd ecdsa-0.11
python setup.py install
cd
wget https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
tar xvzf paramiko-1.15.1.tar.gz
cd paramiko-1.15.1
python setup.py install
#ansible 2.2.2安装
cd
wget http://releases.ansible.com/ansible/ansible-2.2.2.0.tar.gz
tar -xzf ansible-2.2.2.0.tar.gz
cd ansible-2.2.2.0
python setup.py install
mkdir /etc/ansible
cp -rp examples/* /etc/ansible/
3.yum安装
yum install epel-release -y
yum install ansible -y
三 Ansible相关配置
1.ansible相关文件及命令
主程序目录:/etc/ansible/
主配置文件:/etc/ansible/ansible.cfg
默认主机清单:/etc/ansible/hosts
插件目录:/usr/share/ansible_plugins
主要命令:/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
#常用格式
ansible <host-pattern>[-f forks][-m module][-a args]
host-pattern # 可以是all,或者配置文件中的主机组名
-v,–verbose 详细模式,如果命令执行成功,输出详细的结果(-vv –vvv -vvvv)
-i PATH,–inventory=PATH 指定host文件的路径,默认是在/etc/ansible/hosts
-f NUM,–forks=NU NUM是指定一个整数,默认是5,指定fork开启同步进程的个数。
-m NAME,–module-name=NAME 指定使用的module名称,默认是command
-m DIRECTORY,–module-path=DIRECTORY 指定module的目录来加载module,默认是/usr/share/ansible,
-a,MODULE_ARGS 指定module模块的参数
-k,-ask-pass 提示输入ssh的密码,而不是使用基于ssh的密钥认证
-sudo 指定使用sudo获得root权限
-K,-ask-sudo-pass 提示输入sudo密码,与–sudo一起使用
-u USERNAME,-user=USERNAME 指定移动端的执行用户
-C,-check 测试此命令执行会改变什么内容,不会真正的去执行
#查看各模块
ansible-doc [options][modules]
# 主要选项有:
-l或--list # 列出可用的模块
-s或--snippet #显示指定模块的简略使用方法
2.配置文件介绍
配置文件:/etc/ansible/ansible.cfg
hostfile=/etc/ansible/hosts #指定默认hosts配置的位置
host_key_checking =False#不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤
ask_pass=True# 每次执行ansible命令是否询问ssh密码
ask_sudo_pass=True# 每次执行ansible命令时是否询问sudo密码
配置文件:/etc/ansible/hosts
# Ex 1: Ungrouped hosts, specify before any group headers.
直接给出主机,IP主机名都可以
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group
把几个主机分组,用中括号定义组名
## [webservers]
## alpha.example.org ...
## 192.168.1.100 ...
# If you have multiple hosts following a pattern you can specify
对主机进行通配001:006表示到一个范围
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
定义一组数据库服务器
## [dbservers]
## db02.intranet.mydomain.net ...
## 10.25.1.56 ...
#参数解释
1, ansible_ssh_host :
指定主机别名对应的真实 IP,如:100 ansible_ssh_host=192.168.1.100,随后连接该主机无须指定完整 IP,只需指定251就行
2, ansible_ssh_port :
指定连接到这个主机的 ssh 端口,默认22
3, ansible_ssh_user:
连接到该主机的 ssh 用户
4, ansible_ssh_pass:
连接到该主机的ssh密码(连-k 选项都省了),安全考虑还是建议使用私钥或在命令行指定-k 选项输入
5, ansible_sudo_pass: sudo 密码
6, ansible_sudo_exe: sudo 命令路径
7, ansible_connection :
连接类型,可以是local、ssh 或 paramiko,ansible1.2之前默认为 paramiko
8, ansible_ssh_private_key_file :私钥文件路径
9, ansible_shell_type :
目标系统的 shell 类型,默认为 sh,如果设置 csh/fish,那么命令需要遵循它们语法
10, ansible_python_interpreter :
python 解释器路径,默认是/usr/bin/python,但是如要要连BSD系统的话,就需要该指令修改 python 路径
11, ansible__interpreter :
这里的"*"可以是 ruby 或 perl 或其他语言的解释器,作用和 ansible_python_interpreter 类似
3.主机与被控机建立ssh公私匙连接
1.主机配置文件添加被控端
cat >>/etc/ansible/hosts <<EOF
[web]
192.168.1.168
192.168.1.186
EOF
2.配置ssh无密码登录
#1.主机生成ssh密钥
[root@test1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
e4:99:c4:17:c9:68:86:3c:ac:1b:20:19:c4:36:c1:fe root@test1
The key's randomart image is:
+--[ RSA 2048]----+
|==. o . o.. |
|o=. =.+ o. |
|o... . ++ . |
| . o + + |
| . o S |
| E. |
| |
| |
| |
+-----------------+
#2.将公钥发到被管理节点用户的.ssh目录
[root@test1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.168
The authenticity of host '192.168.1.168(192.168.1.168)' can't be established.
ECDSA key fingerprint is 80:a7:8d:c6:6c:14:27:5c:2b:dd:17:5e:ec:60:33:1c.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO:1 key(s) remain to be installed --if you are prompted now it is to install the new keys
root@192.168.1.168's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.1.168'"
and check to make sure that only the key(s) you wanted were added.
#3.验证无密码配置是否成功
[root@test1 ~]# ssh root@192.168.1.168
Last login: Wed Apr 12 11:02:08 2017 from 192.168.1.110
[root@test2 ~]#
#192.168.186执行2,3步即可
3.测试主机连通性
#测试web组中机器联通性(测试所有用all)
[root@test1 ~]# ansible web -m ping
192.168.1.168| SUCCESS =>{
"changed": false,
"ping":"pong"
}
192.168.1.186| SUCCESS =>{
"changed": false,
"ping":"pong"
}
4.常见模块
ping:探测目标主机是否存活;
举例: ansible all -m ping
command:在远程主机执行命令;
举例:ansible all -m command -a "ifconfig"
举例:ansible all -m command -a "useradd centos"
shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,如管道等
举例:ansible all -m shell -a "echo centos |passwd --stdin centos"
copy:复制文件,给定内容生成文件,mode, owner, group,follow,...
拷贝文件
举例:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
生成文件
举例:ansible all -m copy -a "content='hell\nworld\n' dest=/tmp/fstab.ansible mode=640"
file:设置文件属性
更改文件属主
举例:ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
删除文件
举例:ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
state 用来定义目标文件状态的
创建指定文件空目录
举例:ansible all -m file -a "path=/tmp/dir.ansible state=directory"
链接文件
举例:ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible
state=link"
fetch:从远程主机拉取一个文件
ansible是用来管理多节点的,从远程拉取多个文件到目标主机显然不近乎仁义。所以用scp就能搞定。略过
cron:用来管理crontab的周期性任务
定义一个任务
举例:ansible all -m cron -a "minute'*/5' job='/usr/sbin/ntpdate 10.1.0.1 &>/dev/null'
name='sync time'"
crontab -l
删除一个任务
举例:ansible all -m cron -a "name='sync time' state=absent"
只删除用ansible定义的名
hostname:定义主机名
举例:
yum:使用yum包管理器,完成程序包管理
举例:ansible all -m yum -a "name=httpd"安装
举例:ansible all -m yum -a "name=httpd state=absent"删除
service:控制服务,控制服务是否开机自动启动
举例:ansible all -m service -a "name=httpd state=started enbaled=true"
script模块:
目的:在指定节点上执行/root/a.sh脚本(该脚本是在ansible主控端)
命令:ansible 10.1.1.113-m script -a ‘/root/a.sh‘
group:添加或者删除组
举例:
user:管理组账号
举例:
setup:收集远程各主机的各种属性之和
举例:ansible all -m setup
playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无非是调用ansible的一个module。将多个paly组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。
playbook核心元素:
Tasks:任务,由模块定义的操作的列表;
Variables:变量
Templates:模板,即使用了模板语法的文本文件;
Handlers:由特定条件触发的Tasks;
Roles:角色;自包含,有完整独立实体
playbook的基础组件:
Hosts:运行指定任务的目标主机,可多个;
remote_user:在远程主机以哪个用户身份执行;
sudo_user:非管理员需要拥有sudo权限;
tasks:给出任务列表,执行完一个,执行第二个
模块,模块参数:
格式:
(1) action: module arguments //任务执行过程
(2) module name: arguments //指定运行的模块
playbook实例1(指挥web组内主机安装httpd并监听8080端口)
- hosts: web
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
tags: installpkg #指明跑某个标签 -t installpkg
- name: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: installconf #指明跑某个标签 -t installconf
notify: restart httpd service
- name: start httpd service
service: name=httpd state=started
handlers:#处理器,也是任务,在一定条件触发
- name: restart httpd service
service: name=httpd state=restarted
#检查语法,测试执行
ansible-playbook --syntax-check -t installconf --list-tags httpd.yaml
ansible-playbook --syntax-check httpd.yaml
ansible-playbook --list-hosts --list-tasks httpd.yaml
注意:
handlers:是指在一定条件下触发,指明在一个需要让别人重启服务才生效的任务上使用notify,通知一定是handlers名字
tags:只执行playbook中指定的tags标签,满足部分需要,多个任务可指明一个同tags
也可以一次调用两个标签,如下
annsible-playbook -t installconf,installpkg httpd.yaml
playbook实例2(自定义变量Varable,可自定义安装任意程序包)
vim name.yaml
- hosts: web
remote_user: root
vars:
- pkgname: memcached #playbook中使用变量Variables
tasks:
- name: install a package
yum: name={{ pakgname }} state=present #自定义变量
#语法测试
ansible-playbook --syntax-check name.yaml
ansible-playbook -e pkgname=httpd/vsftpd/ name.yaml
#对应配置文件hosts设置
vim /etc/ansible/hosts
[web]
192.168.1.168 pkgname=nginx
192.168.1.186 pkgname=httpd
[web:vars]#为一个内不同主机定义相同变量,效果同上
#web组内有一组变量vars,其中变量pkgname值是memcaches
pkgname=memcached
Inventory还可以使用参数:
用于定义ansible远程连接目标主机使用的属性,而非传递给playbook的变量
如:[webserver]
192.168.1.168 ansible_ssh_user= ansible_ssh_pass ansible_sudo_pass
不再是传递给playbook变量,而是主机本身。
when条件判断
- name: start nginx service on CentOS6
shell: service nginx start
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="6"
- name: start nginx service
shell: systemctl start nginx.service
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="7"
基于字符串列表给出元素 循环:迭代,需要重复执行的任务;
- name: install package
yum: name={{ item }} state=latest
with_items:
- httpd
- php
- php-mysql
- php-mbstring
- php-gd
基于字典列表出元素 循环:迭代,需要重复任务;
- name: creat groups //第一个任务
yum: name={{ item }} state=latest
with_items:
- groupx1
- groupx2
- groupx3
- name: creat users //第二个任务
user: name={{ item.name }} group={{ item.group }} state=present
with_items://元素列表
-{name:'userx1', group:'groupx1'}//name键值队
-{name:'userx1', group:'groupx1'}//name键值队
-{name:'userx1', group:'groupx1'}//name键值队
角色(自包含,按照目录结构来组织)
roles是以特定的层级目录结构进行组织的tasks、variables、handlers、templates…
role_name/
files/:存储由copy或script等模块调用的文件;
tasks/:核心配置,分发资源和安装软件
handlers/: 发生改变则执行的操作(notify触发)
vars/: 定义变量
templates/:存储由template模块调用的模板文本;
meta/: 说明信息,角色依赖等,一般不用
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
Ansible官方文档:http://www.ansible.com.cn/docs/playbooks_intro.html
学习博客:http://guoxh.blog.51cto.com/10976315/1914287
学习博客:http://zyxjohn.blog.51cto.com/5313197/1886251
学习博客:http://51eat.blog.51cto.com/11892702/1891709
原文:https://blog.csdn.net/HzSunshine/article/details/70227803
Ansible自动化运维工具使用的更多相关文章
- Ansible自动化运维工具-上
[Ansible特点] 1)Ansible与saltstack均是基于Python语言开发的 2)安装使用简单,基于不同插件和模块实现各种软件,平台,版本的管理以及支持虚拟容器多层级的部署 3)不需要 ...
- Ansible 自动化运维工具
Ansible 自动化运维工具 Ansible是什么? Ansible是一个"配置管理工具"也是一个"自动化运维工具" Ansible 作用: Ansible是 ...
- Ansible自动化运维工具的使用
Ansible自动化运维工具的使用 host lnventory 管理主机 ip root账号密码 ssh端口 core mod ...
- Ansible自动化运维工具及其常用模块
Ansible自动化运维工具及其常用模块 目录 Ansible自动化运维工具及其常用模块 一.Ansible简介 1. Ansible概述 2. Ansible作用 3. Ansible的工作模块 4 ...
- ansible自动化运维工具使用详解
一. ansible 简介 1. ansible ansible是新出现的 自动化 运维工具 , 基于Python研发 . 糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行 ...
- Ansible自动化运维工具
ansible软件介绍 python语言是运维人员必会的语言! ansible是一个基于Python开发的自动化运维工具!(saltstack) 其功能实现基于SSH远程连接服务! ans ...
- [Linux]Ansible自动化运维② - 工具与模块
目录 一.Ansible的工具 1.1 Ansible的工作前提 1.2 Ansible的安装文件 1.3 Ansible的配置文件 1.4 Ansible的相关工具 1.4.1 [帮助工具]Ansi ...
- 三石之道之Ansible自动化运维工具部署
centos6默认python版本为2.6 centos7默认python版本为2.7 ansible需要最低python2.7的支持 总结:centos6要部署ansible工具,需要先升级pyth ...
- ansible自动化运维工具的安装与使用
运行环境 centOS6.6 ansible ansible的功能还是比较多的,博主只用它在集群上进行批量部署软件和维护的功能,其他不多做研究,有需要的话这篇文章会慢慢补充. ansible特点 轻量 ...
随机推荐
- Leetcode 759. Employee Free Time
思路:区域覆盖问题.一个自然的想法是将每个员工的工作时间段看做一个木棒,每个木棒的长度就是这个时间段的时长.然后按照木棒的起始位置升序排列,接着由低位置向高位置一个木棒一个木棒的看过去.如果当前木棒的 ...
- 【详解】GrantedAuthority(已授予的权限)
前言 这篇是很久之前学习Spring Security整理的博客,发现浏览量都1000多了,一个赞都没有,那说明写得确实不怎么样,哈哈.应该很多初学者对这个接口存在疑问,特别是如果学习这个框架之前还了 ...
- java web 机试
经过近一个月的学习,我们的java web已经学习完了. 这是我们这次的机试题. 一:题目 请利用MVC设计模式,并使用JSP.Servlet.JSTL和JQuery等技术实现动态条件的分页显示查询. ...
- java设计模式--Builder模式
一.Builder模式 二.使用例子 三.Spring中的Builder模式 Builder模式,构建者.构造者模式,在<图解设计模式>中归为 生成实例 一栏,该模式用于组装具有复杂结构的 ...
- 长沙.NET社区之光
奈何万事开头难 迎着改革开放四十年带来的春风,长沙的互联网生态环境以唐胡子俱乐部为首的一众互联网社群讲长沙互联网的环境推上了一个新的台阶.年底,我与有幸一起共事的溪源兄,下班后一起闲聊,觉着长沙的.N ...
- 网络之Json生成解析
// // ViewController.m // Json // // Created by City--Online on 15/4/28. // Copyright (c) 2015年 CYW. ...
- ASP.NET开发,且编且改,分清职责
本篇Insus.NET使用一个实例,分享在ASP.NET开发时,一个功能一个方法(函数),且编且改,一步一个脚印把实例完成.在方法多变多形式的情况之下,怎样把写出来程序简单明了. 下面是一个Excel ...
- SpringMVC拦截器和@ResponseBody注解冲突
在使用@ResponseBody注解后controller方法只会返回ModelandView对象的数据模型,不会返回视图,这样有很多好处,但是如果在拦截器中进行了页面转发,在满足页面转发条件时,不会 ...
- c++类内存分布解析
首先使用Visual Studio工具查看类的内存分布,如下: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内 ...
- HDU3081(KB11-N 二分答案+最大流)
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...