为什么要学习ansible:
ansible是自动化运维的一种工具,使用ansible可以一次性管理多台主机,为多台主机安装或这执行相同或者不同的操作,省去了一台台主机去重复执行相同的任务,可以使用corn选项结合本机的crontab设置本主机的任务性计划,比如,每天导出nginx的access.log和error.log到指定的主机,我们分析相应的日志,而达到监控整个网络架构的目的。
下图是ansible和所有软件,操作系统之间的关系:
1.ansible的框架:
Ansible Core:ansible的主要核心
Modules:模块
Core Modules:内核模块
Customed Modules:相关的模块
Host Iventory
Files
CMDB
PlayBooks
Hosts <–> roles
Connection Plugins
2.特性:
高度模块化:调用特定的模块,完成特定的任务;
基于Python语言开发,由Paramiko,PyYAML和jinja2三个核心库实现;
部署简单:agentless;
支持自定义模块,使用任意编程语言;
强大的playbook机制;
幂等性;
3.安装和使用:ansible(epel源)
安装:yum -y install ansible
程序环境:
ansible
ansible-playbook
ansible-doc
配置文件:
/etc/ansible/ansible.cfg
主机清单:
/etc/ansible/hosts
插件目录:
/usr/share/ansible_plugins/
安装和基本部署ansible服务:(包括远程主机的简单配置)
配置epel源
yum -y install ansible
ssh-keygen -t rsa -P ''
vim /etc/ansible/hosts
[web_server]
192.168.1.147
[db_server]
192.168.1.148
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.147
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.148
简单测试:
ansible all -a 'who'
4.基本使用入门:
ansible命令:
Usage: ansible <host-pattern> [options]
常用选项:
-m MOD_NAME -a MOD_ARGS
配置Host Inventory
/etc/ansible/hosts
[group_id]
HOST_PATTERN1
HOAT_PATTERN2
模块:
获取模块列表:ansible-doc -l
获取指定模块的使用帮助:ansible-doc -s MOD_NAME
常用模块:
ping:探测目标主机是否存活;
command:在远程主机执行命令;(不会理解管道操作)
ansible all -m command -a "useradd centos"
shell: 在远程主机上调用shell解释器运行命令,支持shell命令的各种功能,例如管道;
注意:command和shell模块的核心参数直接作为命令本身;而其他模块的参数通常为"key=value"格式;
copy:复制文件到远程主机;(mode,owner,group,…)
用法:
(1)复制文件:-a "src= dest= "
eg:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
(2)给定内容生成文件:-a "content= dest= "
eg:ansible all -m copy -a "content='hello\nworld' dest=/tmp/test.ansible mode=640"
file:设置文件属性;
用法:
(1)创建目录:-a "path= state=directory"
(2)创建链接文件: -a "path= src= state=link"
(3)删除文件:-a "path= state=absent"
eg:
ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
ansible all -m file -a "path=/tmp/fstab.ansible.link src=/tmp/test.ansible state=link" 为远程主机上的/tmp/fstab.ansible设置本地的软连接
fetch:从远程主机上拉取文件到本地;(从远程一台主机上面获取)
cron:管理日常计划任务
-a "" (minute,hour,day,month,weekday,job,name,user,state={present|absent})
hostname:设置主机名;name=
yum:使用yum包管理器,完成包管理
-a "" name= state={present|latest} / name= state=absent
service:服务管理;
-a "" name enable runlevel state={started|stopped|restarted}
group:组管理,添加或移除组;
-a "" name state system gid
user:用户管理,管理用户的事项;
-a "" name group groups comment uid system shell expires home
setup:从远程主机上面,收集关于远程主机的信息;
5.YAML:YAML是数据序列化格式设计的可读性与脚本语言与互动。
数据结构:key:value
– item1
– item2
– item3
eg:{name:jerry,age:21}
6.PlayBook:
核心元素:
Tasks:任务,由模块定义的操作的列表;
Variables:变量
Templates:模板,即使用了模板语法的文本文件;
Handlers:由特定条件出发的Tasks;
Roles:角色;
playbook的基础组件:
Hosts:运行指定任务的目标主机;
remote_user:在远程主机以哪个用于身份执行;
sudo_user:非管理员需要用于sudo权限;
tasks:任务列表
模块,模块参数:
格式:
(1)action:module arguments
(2)module:aeguments
7.运行playbook,使用ansible-playbook命令:
(1)检测语法:
ansible-playbook –syntax-check /path/to/playbook.yaml
(2)测试运行
ansible-playbook -C /path/to/playbook.yaml
–list-hosts:指明测试运行的主机
–list-tasks:指明要测试运行的任务
–list-tags:指明要测试运行的标签
(3)运行:
ansible-playbook /path/to/playbook.yaml
-t TAGS,–tags=TAGS:指明运行指定标签的任务
–skip-tags=SKIP_TAGS:指明运行忽略指定标签的任务
–start-at-task=START_AT
8.Playbook核心元素详解:
(1)handlers:由特定条件触发的Tasks;
调用以及定义方式:
tasks:
– name:TASK_NAME
module:arguments
notify:HANDLER_NAME
handlers:
– name:HANDLER_NAME
module:arguments
(2)tags:给指定的任务定义一个调用标识;
– name:NAME
module:arguments
tags:TAG_ID
(3)Variables:变量
类型:
内建变量:facts
自定义变量:
a.命令行传递:
-e VAR=VALUE
b.在hosts Inventory中为每个主机定义专用变量值:
①向不同的主机传递不同的变量;
IP/HOSTNAME variable_name=value
②向组内的所有主机传递相同的变量;
[groupname:vars]
variable_name=value
c.在playbook中定义:
vars:
– var_name:value
– var_name:value
d.Inventory还可以使用参数:
用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook变量:
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
…
e.在角色调用时传递:
roles:
– { roles: ROLE_NAME,var: value,….}
变量的调用:
{{ var_name }}
(4)Templates:模板:文本文件,内部嵌套有模板语言脚本(使用模板语言编写)
Jinja2 is a template engine written in pure Python. It provides a Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.
jinja2是模板引擎用纯Python。它提供了一个Django启发非XML语法但支持内联表达式和一个可选的沙箱环境。
语法:
字面量:
字符串:使用单引号或双引号;
数字:整数、浮点数;
列表:[item1, item2, …]
元组:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布尔型:true/false
运算类:
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, <, >=, <=
逻辑运算:and, or, not
执行模板文件中的脚本,并生成结果数据流,需要使用template模块;
template:
-a "" (src dest mode owner group)
注意:此模板不能在命令行使用,而只能用于playbook;
条件测试:
when语句:在tasks中使用,Jinja2的语法格式;
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素;
元素:列表(字符串 字典)
基于字符串列表给出元素示例:
– hosts: websrvs
remote_user: root
tasks:
– name: install packages
yum: name={{ item }} state=latest
with_items:
– httpd
– php
– php-mysql
– php-mbstring
– php-gd
基于字典列表给元素示例:
– hosts: all
remote_user: root
tasks:
– name: create groups
group: name={{ item }} state=present
with_items:
– groupx1
– groupx2
– groupx3
– name: create users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
– {name: 'userx1', group: 'groupx1'}
– {name: 'userx2', group: 'groupx2'}
– {name: 'userx3', group: 'groupx3'}
(5)roles:角色
以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;
role_name/
files/:存储由copy或script等模块调用的文件;
tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
templates/:存储由template模块调用的模板文本;
meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
在playbook中调用角色的方法:
– hosts: HOSTS
remote_user: USERNAME
roles:
– ROLE1
– ROLE2
– { role: ROLE3, VARIABLE: VALUE, …}
– { role: ROLE4, when: CONDITION }
原创文章,作者:sjsir,如若转载,请注明出处:http://www.178linux.com/57130