A. Ansible安装配置和基本使用
http://www.tuicool.com/wx/vUfYVfA
一、ansible 安装
ansible 依赖于python2.6或更高的版本、paramiko、PyYAML及Jinja2。
https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
将python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件
备份旧版本的python,并符号链接新版本的python
修改yum脚本,使其指向旧版本的python,已避免其无法运行
1.1 编译安装
解决依赖关系
解压安装包
https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
编译安装
拷贝配置文件
1.2 rpm包安装
使用阿里云镜像源即可,这里为了方便使用,就直接使用yum安装了。
Fedora 用户可直接安装Ansible, 但RHEL或CentOS用户,需要 配置 EPEL # yum install -y epel-release # yum install -y ansible
注意:不同版本的ansible的功能差异可能较大。
二、配置
配置文件:/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
主程序:ansible、ansible paly-book、ansible-doc
1、将要管理的主机纳入 /etc/ansible/hosts配置文件中,可以填写IP或是主机名
[WebServers] 10.10.10.3 10.10.10.4
2、.基于ssh的方式与被管理的主机进行通信,在管理的主机上(部署ansible的主机上)生成一对非对称密钥,将公钥发给被管理的主机。
a,生成密钥对:ssh-keygen -t rsa
b,将密钥发放到要管理的主机:ssh--id -i 10.10.10.3 或 ssh--id -i /root/.ssh/id_rsa.pub [email protected]
3、使用ansible命令测试
[root@wlm yum.repos.d]# ansible all -m ping 10.10.10.4 | SUCCESS => { "changed": false, "ping": "pong" }
三、基本使用
1、常用命令
ansible-doc 命令:获取模块列表、模块使用格式。
ansible-doc -l :获取列表
ansible-doc -s mole_name:获取指定模块信息
2、ansible 命令格式
ansible <host-pattern> [-f forks] [-m mole_name] [-a args]
<host-pattern> 指明管控主机,以模式表示或者直接指定ip,必须事先指定在文件中;all所有
[-f forks] 指明每批管控多少主机,默认是5个主机一批次
[-m mole_name] 使用何种模块操作,所有操作都需要通过模块指定
[-a args] 指明模块专用参数;args 一般是 key=value格式。注:command模块的参数不是kv模式,而是直接给出要执行的命令。
注意:<host-pattern> 默认读取/etc/ansible/hosts,也可以指明自定义文件路径 -iPATH,--inventory=PATH:指明使用的 host inventory文件路径;
3、常用模块介绍
1、command模块:远程主机上运行命令
例:ansible hosts -m command -a "ls /tmp" 注:command模块也可以省略。
给远程主机添加用户、设置密码:
ansible hosts -a 'useradd user1'
ansible hosts -a 'echo abc | passwd --stdin user1'
2、shell模块:远程主机在shell进程下运行命令,支持shell特性,也支持管道符。
10.10.10.4 | SUCCESS | rc=0 >>
3、模块:把当前主机文件复制到远程主机位置,可以指定mode、own、group
10.10.10.4 | SUCCESS => { "changed": true, "checksum": "", "dest": "/root/abc.txt", "gid": 0, "group": "root", "md5sum": "", "mode": "0644", "owner": "ansible", "size": 15, "src": "/root/.ansible/tmp/ansible-tmp-1484639082.19-114656107854348/source", "state": "file", "uid": 0 }
4、cron模块:在远程主机指定crontab周期性计划任务
minute= hour= day= month= weekday= job= name= (必须填写) state=
ansible all -m cron -a "minute=*/10 job='/sbin/ntpdate 10.10.10.10 & >/dev/null' name=synctime" 可使用crontab -l查看
在管理的主机上可以删除制定的计划任务
10.10.10.4 | SUCCESS => { "changed": true, "envs": [], "jobs": [] }
5、fetch模块:和相反,从远程主机拷贝文件到本地主机
可以不要flat=yes参数,但作用:
当dest=/root/kel/ ,abc.txt会保存在/root/kel/目录下
当dest=/root/kel ,会拷贝abc.txt文件,并命名成kel
6、file模块:file模块包含了文件、文件夹、超级链接类的创建、拷贝、移动、删除
path=/etc/foo.conf owner=foo group=foo mode=0644
src=/file/to/link/to dest=/path/ro/symlink owner=foo group=foo state=link
src=/tmp/{{item.path}} dest={{item.dest}} state=link with_items:
path=/etc/foo.conf state=touch mode="u=rw,g=w,o=r"
path=/etc/foo.conf state=touch mode="u+w,g-w,o-rw"
7、yum模块:用于yum安装安装和卸载
8、service模块:服务管理
9、user/group模块:user模块管理用户;group模块管理group
四、Playbook剧本
playbook 是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。playbook组织格式为使用YAML语言来编写的。
playbook 是由一个或多个“play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上讲,所谓的task无非是调用ansible的一个mole。将多个play组织在一个playbook中,即可以让他们联通起来按事先编排的机制生效。
1、例子:
在ansible主机上的root目录下创建httpd目录,将本机的httpd.conf文件拷贝到该目录下,修改配置文件里的监听端口是8081
remote_user:root #root前不能有空格
tasks: #任务列表
yum name=httpd state=present #yum后的: 删除掉
src=/root/httpd/httpd.conf dest=/etc/httpd/conf
service name=httpd state=started
注意:yaml文件中支持#;下面的操作要跟上面的name对齐。
测试:
ansible-playbook --check playbook :只检测可能会发生的改变,但不真正执行操作
ansible-playbook playbook :直接执行
ansible-playbook --list-hosts :列出运行任务的主机
2、playbook介绍
设置在特定条件下触发:
a,某任务的状态在运行后为changed时,可通过“notify”通知给相应的handles;
handles:任务在特定条件下触发;接收到其他任务的通知是被触发;
b,任务可以通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用;
B. Ansible系列-基础篇-Ansible 常见模块的使用
原文地址: Ansible系列-基础篇-Ansible 常见模块的使用
→ 上一篇中简单尝鲜了几个模块,本篇整理下实际中用到的模块及其用法Demo,总计有19个模块,分别为
ping、setup、debug、user、group、authorized_key、shell、script、command、service、systemd、、template、synchronize、file、lineinfile、yum、cron
ping 模块主要是验证 管理节点 和 目标节点 之间的连通性,是否正常配置好了对应账号的ssh免密登录
上一篇中配置的时候提到ansible facts 收集目标主机信息,也可以使用 setup 模块。
这个模块的好处就是让了解到 Ansible 都有哪些内置的变量,这些变量在我们后续写playbook的时候,在role templates 中配置很有帮助,
举个列子,Ansible 批量部署 zabbix agent,每个agent的配置文件中的 ListenIP 和 Hostname 我们就可以使用facts中的变量 ansible_default_ipv4.address 和 ansible_hostname
另外一旦知道知道都有哪些变量的时候,下次我们就可以再收集信息展示的时候,加参数通过filter来过滤我们想看的变量就可。比如
顾名思义,就是我们想调试输出一些结果的时候,比如上面提到的我想知道目标主机的IP地址
这里有两种用法,一种是 msg 输出,需要带 {{ variable-name }} , 另外一种是 var 用法,直接写变量名即可,不用添加 {{ }}
远程管理用户/用户组
主要用来给目标主机用户配置公钥,默认到目标用户家目录的.ssh目录的authorized_keys文件 没有则创建authorized_keys文件
这里是把 shell 和 script、command放到一起做对比,其实还有个 raw
其中 command 执行单一命令不能使用管道符、重定向符等,raw 类型command,可以使用管道符等;
shell 和 script 类似,都可以执行脚本,却别在于script执行的脚本在ansible管理机上,而shell执行的脚本必须先放到目标节点上去,才能执行;
另外shell执行可以使用环境变量,bash等,但是script只是执行脚本,不能带 bash
都是用来管理服务器上的服务,区别在于Service服务管理用于centos6及以前的系统,而systemd命令应用于centos7系统
核心参数 namestateenabled
把管理节点的文件到目标节点,并配置相关属性
template 的作用和一样,区别在于源文件是jinja2格式,文件中可以配置 Ansible变量,然后在目标节点上替换成对应的目标值
另外一个需要住的就是在roles中,默认是从files目录获取文件,template默认是 templates 文件夹获取模板文件
主要用于目录、文件的同步,基于 rsync实现,主要是有 push 和 pull 两种方式, 如果是push 推送,则src是管理节点,dest是目标节点;如果是pull拉取,则src是目标节点,dest是管理节点
在目标节点创建文件或目录,删除文件或目录,修改文件或目录的权限等;核心参数有:path、state、owner、group、mode、recurse
在文件中添加、修改、删除一行记录,在实践中用的很多,这里做简单介绍,后续有单独文章详细介绍
顾名思义,就是我们在Centos下进行yum安装,核心参数主要关注: name 需要安装的软件名、state 软件的状态(present、absent、removed、latest)和 enablerepo 特殊情况指定yum源
管理Linux定时任务,核心参数说明
name 定时任务的名称、 state 任务的状态、minute/hour/day/month/weekday 分别设定任务执行的时间配置、user指定是哪个用户配置任务,默认是管理员
C. 使用pip方式安装ansible的配置文件在哪
1. 打开上节的解决方案,为JackWangServiceClient工程添加一个App.config文件
2. 修改App.config的文件如下 <xml version="1.0" encoding="utf-8" >
<configuration> <system.serviceModel> <client>
<endpoint name="MyEndPoint"
我安装ansible的方式用pip安装,但是找不到配置文件,pip方式安装的配置文件在哪的?/etc目录下是没有的[root@localhost logs]# cd /etc/ananacrontab
anthy-conf
find找了,也没[root@localhost ~]# find / -name
ansible/usr/local/python27/bin/ansible/usr/local/python27/lib/python2.7/site-packages/ansible[root@localhost
~]# cd /usr/local/python27/lib/python2.7/site-packages/ansible
D. Ansible-基本概述
为什么要自动化运维
我们以 10 台机器部署 Nginx 为例。部署步骤如下:
1、通过 ssh 登录一台机器;
2、yum install -y nginx 或者 获取安装包自行编译安装;
3、配置 Nginx
4、启动 Nginx ,如有必要加入开机自启动;
5、退出登录
上面步骤重复 10 次,即可完成我们的部署要求。
痛点:
1、重复操作频繁,增加了人工成本和后续维护成本;
2、机器太多时,容易落下某些机器且未操作,进而产生后续影响;
3、人工频繁操作时可能有操作步骤不完整的情况,造成该机器和其他机器状态不一致。
我们还是以 10 台机器部署 Nginx 为例。部署步骤如下:
1、在控制机或者称为管理机的机器上写好相关脚本。「当然该脚本我们是测试通过的,脚本中包括安装、配置、启动等等」
2、将写好的脚本从控制机推送到受控机;
3、在受控机执行相关脚本,根据脚本部署我们需要的 Nginx。
好处
1、减少了重复操作,提高了工作效率;
2、减小了出错几率,提高了准确率;
3、所有机器状态一致,降低了后续维护成本。
软件安装部署
配置同步
代码变更
命令执行
任务执行
Ansible 是基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能的自动化管理工具。
Ansible 是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是 Ansible 所运行的模块,Ansible 只是提供一种框架。进而能减少我们的重复操作,提高工作效率。
Ansible 不需要在远程主机上安装 client/agents,因为它们是基于 SSH 来和远程主机通讯的。
Ansible 目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
1、批量执行远程命令:可以对 N 台主机同时进行命令的执行;
2、批量配置软件服务:可以用自动化的方式管理配置和服务;
3、实现软件开发功能:例如 jumpserver 底层使用 Ansible 来实现自动化管理;
4、编排高级的 IT 任务:Ansible 的 Playbooks 是一门编程语言,可以用来描绘一套 IT 架构。
1、部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作;
2、安全可靠,默认使用 SSH 协议对被控端进行管理;
3、有大量的常规运维操作模块,可实现日常绝大部分操作;
4、配置简单、功能强大、扩展性强;
5、支持 API 及自定义模块,可通过 Python 轻松扩展;
6、通过 Playbooks 来定制强大的配置、状态管理;
7、轻量级,无需在客户端安装 Agent,更新时只需在操作机上进行一次更新即可。
模块说明如下:
Ansible:Ansible 核心程序。
Host Inventory:记录由 Ansible 管理的主机信息清单,包括端口、密码、IP 等。
Playbooks:“剧本” YAML 格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
Core Moles:核心模块,主要操作是通过调用核心模块来完成管理任务。
Custom Moles:自定义模块,完成核心模块无法完成的功能,支持多种语言。
Connection Plugins:连接插件,Ansible 和 Host 通信使用
Ansible 控制主机对被管节点的操作方式可分为两类,即 ad-hoc 和 playbook:
ad-hoc 模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。 就相当于 bash 中的一句 shell。
playbook 模式(剧本模式)
是 Ansible 主要管理方式,也是 Ansible 功能强大的关键所在。 playbook 通过多个 tasks 集合完成一类功能 ,如 Web 服务的安装部署、数据库服务器的批量备份等。可以简单地把 playbook 理解为通过组合多条 ad-hoc 操作的配置文件。
简单理解就是:Ansible 在运行时,首先读取 ansible.cfg 中的配置,根据规则获取 Inventory 中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。
1、加载自己的配置文件,默认 /etc/ansible/ansible.cfg;
2、查找对应的主机配置文件,找到要执行的主机或者组;
3、加载自己对应的模块文件,如 command;
4、通过 Ansible 将模块或命令生成对应的临时py文件(python脚本),并将该文件传输至远程服务器;
5、对应执行用户的家目录的 .ansible/tmp/XXX/XXX.PY文件;
6、给文件 +x 执行权限;
7、执行并返回结果;
8、删除临时py文件,sleep 0退出;
E. ansible总结
ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台,它是基于python语言,由Paramiko和PyYAML两个关键模块构建。集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的.
ansible被定义为配置管理工具,配置管理工具通常具有以下功能:
常用的自动化运维工具技术特性比较:
ansible系统由控制主机和被管理主机组成,控制主机不支持windows平台
部署简单, 只需要在控制主机上部署ansible环境,被控制端上只要求安装ssh和python 2.5以上版本,这个对于类unix系统来说相当与无需配置.
Ansible任务执行模式分为以下两种:
ansible配置文件查找顺序
ansible配置文件
ansible 有许多参数,下面我们列出一些常见的参数:
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的inventory file为/etc/ansible/hosts。
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。
Inventory文件格式:
inventory其他的参数
ansible通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各被管理节点。
ansible命令使用语法:
例如:
可以通过 ansible-doc -l 列出所有可用的mole,常用的mole有:
ansible -s <mole-name> 可以查看指定mole的用法,或者参看 官方帮助文档 :
playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个mole。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。
下面是一个简单示例:
playbooks的组成部分
执行过程:
playbook安装配置apache实战
ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
一个roles的案例如下所示:
在playbook中,可以这样使用roles:
也可以向roles传递参数:
也可以用条件来使用roles:
ansible运行playbook时会启动很多ssh连接来执行复制文件,运行命令这样的操作.openssh支持这样一个优化,叫做ssh Multiplexing,当使用这个ssh Multiplexing的时候,多个连接到相同主机的ssh回话会共享相同的TCP连接,这样就只有第一次连接的时候需要进行TCP三次握手.
ansible会默认使用ssh Multiplexing特性,一般不需要更改配置,相关的配置项为:
ansible执行过程中,他会基于调用的模块生成一个python脚本,然后将python脚本复制到主机上,最后执行脚本.ansible支持一个优化,叫做pipelining,在这个模式下ansible执行脚本时并不会去复制它,而是通过管道传递给ssh会话,这会让ansible的ssh会话从2个减少到1个,从而节省时间.
pipelining默认是关闭的, 因为他需要确认被管理主机上的/etc/sudoers文件中的 requiretty 没有启用, 格式如下:
ansible开启pipelining方法, 修改ansible.cfg配置文件:
ansible playbook会默认先收集fact信息,如果不需要fact数据可以在playbook中禁用fact采集:
也可以全局禁用fact采集:
另一种解决方案就是使用fact缓存,目前ansible支持下面几种fact缓存:
jsON文件做fact缓存示例
ansible把采集到的fact写入控制主机的json文件中,如果文件已经存在,那么ansible不会再去主机上采集fact
启用JSON文件缓存,修改ansible.cfg文件:
ansible默认并发数是5,可以用下面两种方法修改并发数:
ansible内置多种云计算相关模块,如aws,openstack,docker等,下图是ansible与docker相关的模块:
通过playbook和dockerfile相结合的方式生成镜像, 示例如下:
ansible可以通过docker模块来操作容器,示例如下: