ansible简介
运维工具分类:
agent:基于专用的agent程序完成管理功能,puppet, func, zabbix, …
agentless:基于ssh服务完成管理,ansible, fabric, …
Ansible默认通过 SSH 协议管理机器
ansible 架构:
Ansible Core:absible核心
Modules:
Core Modules:内键模块
Customed Modules:自定义模块
Host Iventory:主机清单,定义要管理的主机
可以是Files
可以是CMDB
PlayBooks:定义主机要使用的那些角色
Hosts
roles
Connection Plugins:连接插件:并发连接默认一次管理5台
ansible特性:
模块化:调用特定的模块完成特定任务
基于Python语言开发,由Paramilo,PYYAML和Jinjia2(模板库)单个核心库实现
部署简单:agentless
强大的playbook机制
幂等性,一个playbook可以在同一台主机使用多次,效果一样
默认没有server
不依赖证书
支持任何编程语言编写自动义模块
ansible安装:
ansible软件包位于epel源中,配置好epel源直接安装即可
yum install ansible
安装完成后成程序:
ansible
ansible-playbook
ansible-doc
ansible主要文件:
配置文件:
/etc/ansible/ansible.cfg
主机清单:
/etc/ansible/hosts
插件目录:
/usr/share/ansible_plugins/
ansible简单使用:
ansible命令:
Usage: ansible <host-pattern> [options]
常用选项:
-m MOD_NAME -a MOD_ARGS
ansible配置
1、配置基于ssh无密码登录要管理的主机,在ansible管理主机上生成公钥 ssh-keygen -t rsa

2、将生成的公钥发送到要管理主机的家目录中ssh-copy-id root@ip

3、编辑/etc/ansible/hosts文件,配置管理主机清单

ansible管理远程主机命令:
模块:
获取模块列表:ansible-doc -l
获取指定模块的使用帮助:ansible-doc -s MOD_NAME
ansible常用模块:
1、 ping:探测目标主机是否存活;
2、command:在远程主机执行命令;不支持特性的命令


3、shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 ; 注意:command和shell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;

copy: 用法: (1) 复制文件 -a "src= dest= " (2) 给定内容生成文件 -a "content= dest= " 其它参数:mode, owner, group, ...

file:设置文件属性 用法: (1) 创建目录: -a "path= state=directory" (2) 创建链接文件: -a "path= src= state=link" (3) 删除文件: -a "path= state=absent“



fetch:从远程主机拉去文件

cron:管理远程主机自动化任务
-a ""
minute=
hour=
day=
month=
weekday=
job=
name=
user=
state={present|absent} present:新建计划任务默认选项 absent:删除计划任务



hostname:管理主机名 name=

yum:yum包管理 -a "" (1) name= state={present|latest} 安装包可以使用present或者absent
(2) name= state=absent

service:服务启动管理 -a "" name= state= started stopped restarted enabled= runlevel=
group: A d d o r r e m o v e g r o u p s -a "" name= state= system= gid= user:M a n a g e u s e r a c c o u n t s -a "" name= group= groups= comment= uid= system= shell= expires= home=
setup:获取远程主机中信息
playbook 编写:
YAML:
YAML is a data serialization format designed for human readability and interaction with scripting languages.
YAML:编程语言
程序包:PyYAML
数据结构:
key:value
- item1
- item2
- item3
{name:jerry, age:21}
palybook作用:
将远程操作的命令通过YAML语言编写脚本,通过执行脚本完成操作
PlayBook:
核心元素:
Tasks:任务,由模块定义的操作的列表;
Variables:变量
Templates:模板,即使用了模板语法的文本文件;
Handlers:由特定条件触发的Tasks;
Roles:角色;
playbook的基础组件:
Hosts:运行指定任务的目标主机;
remote_user:在远程主机以哪个用户身份执行;
sudo_user:非管理员需要拥有sudo权限;
运行playbook:
运行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 :只运行某TAGS的命令
--skip-tags=SKIP_TAGS
--start-at-task=START_AT
示例:
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd service
- name: start httpd service
service: name=httpd state=started
handlers:
- name: restart httpd service
service: name=httpd state=restarted
playbook tasks创建实例:
大写的注意:注意脚本之间的缩进,缩进错误也会包语法错误,缩进为2个字符
tasks:任务列表 模块,模块参数: 格式: (1) action: module arguments (2) module: arguments
1、给webservers组中的所有主机创建grp组,和用户mygrp ,并所属组为grp

2、给所有的webservers组中的主机安装web服务,并启动端口为8080 注意:保障每个主机中的yum源配置 方法一:在ansible主机中编译httpd.conf文件,将端口改成8080,并将httpd.conf文件复制给每个主机 (注意:此方法适应于相同版本的应用程序,否则配置文件不听可能会出错) 方法二:不同版本之间可以用命令直接更改

playbook handlers介绍及实例:
handlers:由特定条件触发的Tasks; 调用及定义方式: tasks: - name: TASK_NAME module: arguments notify: HANDLER_NAME handlers: - name: HANDLER_NAME module: arguments 3、出发操作,httpd配置文件发生变化时,执行restart命令

playbook tags语法及实例:
tags:给指定的任务定义一个调用标识;指在tasks中定义,在handlers中定义不生效 - name: NAME module: arguments tags: TAG_ID 4、定义重启操作标签切restart ,下次启动时可以直接执行重启,而不执行其他脚本中的任务


playbook vaiable语法以及实例:
Variables:
类型
内建:
(1) facts
自定义:
(1) 命令行传递;
-e VAR=VALUE
(2) 在hosts Inventory(清单)中为每个主机定义专用变量值;
(a) 向不同的主机传递不同的变量 ;
IP/HOSTNAME variable_name=value
(b) 向组内的所有主机传递相同的变量 ;
[groupname:vars]
variable_name=value
(3) 在playbook中定义
vars:
- var_name: value
vars:
- var_name: value
(4) Inventory还可以使用参数:
用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量;
ansible_ssh_host :指定ansible远程连接主机使用的哪个ip地址
ansible_ssh_port :指定ansible远程连接主机使用的哪个端口
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
(5) 在角色调用时传递
roles:
- { role: ROLE_NAME, var: value, ...}
变量调用:
{{ var_name }}
注意::-e传递的变量值会覆盖playbook和hosts传递的变量值
实例:
5、而根据不同主机安装和卸载不同的程序包
※编写脚本vim /root/bin/install.yaml

※通过执行脚本传递参数

※通过/etc/absible/hosts传递参数,


※通过playbook中传递参数

playbook Templates 语法以及使用:
什么是模板:文本文件,内部嵌套有模板语言脚本(使用模板语言编写)
编写语言:jinja2
语法:
字面量:
字符串:使用单引号或双引号;
数字:整数、浮点数;
列表:[item1, item2, ...]
元组:(item1, item2, ...) 是一个不可变类型
字典:{key1:value1, key2:value2, ...} :以键值对队存储数据
布尔型:true/false
算术运算:
+, -, *, /, //, %, **
比较操作:
==, !=, >, <, >=, <=
逻辑运算:and, or, not
执行模板文件中的脚本,并生成结果数据流,需要使用template模块;
template:
-a ”“
src=
dest=
mode=
onwer=
group=
注意:此模板不能在命令行使用,而只能用于playbook;
示例:
题目:将nginx安装到ngxsrvs组中的服务器中,并启动nginx,启动时的wordpress为cpu核心数
思路:每台主机的cup核心数不同,要完成操作,就必须用变量代表,ansible内嵌了ansible_process_vpus
变量,可获取每台主机的cpu核心数
步骤:
1、 在ansible主机中安装nginx为了生成nginx.conf文件
2、更改配置文件nginx.conf文件worker_processes {{ ansible_processes_vpus }};
3、复制文件到/root/目录下并更改名称为/etc/nginx.conf.j2
4、编写脚本 :installnginx.yaml
- hosts: ngxsrvs
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: install conf file
template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
tags: ngxconf
notify: reload nginx service
- name: start nginx service
service: name=nginx state=started enabled=true
handlers:
- name: reload nginx service
shell: /usr/sbin/nginx -s reload
条件测试:
when语句:在tasks中使用,Jinja2的语法格式;
- hosts: all
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- 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"
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为"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'}
ansible roles语法和使用:
角色:roles
角色概念:以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等,方便调用;
role_name/:角色名称,例如安装httpd,在/etc/ansible/roles中常见httpd文件,在httpd文件中常见以下的目录。httpd则为角色名
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的文件,用于设定默认变量;
ansible中角色默认存放路径为:/etc/ansible/roles中
更改角色路径:便捷/etc/ansible/ansible.cfg
roles_path=/path/to/somefile
在playbook中调用角色的方法:
- hosts: HOSTS
remote_user: USERNAME
roles:
- ROLE1:角色名
- ROLE2
- { role: ROLE3, VARIABLE: VALUE, ...} :在调用角色的同时传递参数
- { role: ROLE4, when: CONDITION }:在调用角色的同时给出条件
角色实用实战: 利用角色安装memcache,并将启动的内存设置为总内存的4分之一 步骤一: 1、创建memcache角色 mkdir /etc/ensible/roles/memcached 2、在memcached创建tasks 和templates文件 3、在tasks文件中创建main.yml文件 4、修改memcache配置文件/etc/sysconfig/memcached文件并将文件拷贝到/etc/ansible/roles/memcahced/templates中,重名为为 memcahced.conf.j2 5、编写playbook调用此角色
1、main.yml 和 playbook文件


原创文章,作者:wangnannan,如若转载,请注明出处:http://www.178linux.com/57578

