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