澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:anisble使用及常用模块,自

2019-06-15 作者:澳门新萄京官方网站   |   浏览(170)

一、简介

Ansible总结

###### Ansible总结

使用命令生成秘钥(机器互信)

[root@ansible ~]# ssh-keygen 

将公钥发送到所有安装 客户端的主机

[root@ansible ~]# ssh-copy-id 192.168.163.170

[root@ansible ~]# ssh-copy-id 192.168.163.171

一、Ansible概述

  • 互联网的快速发展导致产品更新换代速度加快,按照传统维护操作使得工作效率低下,自动化运维以尽可能安全高效的完成工作为目的,实现代替传统工作方式。
  • 自动化运维工具划分为两类:
  • 一是需要使用代理工具的,也就是基于agent程序来实现管理功能,例如puppet、func、zabbix等
  • 二是不需要代理配置工具的,可以直接基于SSH服务来完成管理功能,如ansible,fabric等。

  • 自动化运维工具比较:

工具 开发语言 结构 配置文件格式 运行任务
Ansible Python YAML 支持命令行
SaltStack Python C/S YAML 支持命令行
Puppet Ruby C/S Ruby语法格式 通过模块实现

当下有许多的运维自动化工具( 配置管理 ),例如:Ansible、SaltStack、Puppet、Fabric 等。

运维工作: 系统安装(物理机、虚拟机)-->程序包安装、配置、服务启动 --> 对主机批量操作 --> 程序版本更新 -->监控
OS Provisioning:

    物理机:PXE、Cobbler

    虚拟机:Image、Templates

Configuration:

    puppet工具(ruby开发)

    Saltstack(python开发)

    chef

Command and Concrol:

    fabric

预发布环境验证:

    新版本的代码先发布到内网测试服务器(跟线上环境配置完全相同,只是未介入到调度器);

程序发布:

    不能影响用户体验;

    系统不能停机;

    不能导致系统故障或造成系统完全不可用;

灰度发布:

    一种发布模式;在调度器上下线一批主机 --> 关闭服务 --> 部署新版本的应用程序 --> 启动服务 --> 在调度器上启用这一批主机;

    自动化灰度发布机制:可通过脚本或公司自己的发布平台发布;

##### 运维工作:  系统安装(物理机、虚拟机)-->程序包安装、配置、服务启动 --> 对主机批量操作 --> 程序版本更新 -->监控

安装 Ansible 软件

[root@ansible ~]# yum install -y ansible

修改配置文件,将客户机添加进组,

(在文末添加即可)

[root@ansible ~]# vim /etc/ansible/hosts 

[webserver]

192.168.163.170

192.168.163.171

Ansible

  • Ansible基于Python开发,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需任何客户端代理软件,从而使得自动化环境部署变得简单,同时支持多台主机并行管理,使得管理主机更加便携。

Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。

运维工具的分类 :
agent:代理工具:puppet,func

agentless:无代理工具:ansible,fabric;agentless类工具必须依赖ssh服务;

    OS Provisioning:

ansible(主)命令体验:

1.ping

ansible all -m ping 

!检测机器是否可登录,ping模块不需要传送参数

!注:这里的ping模块并非调用了系统的ping命令,而是类似于登录到远程机器再echo出一个信息。

2.command

!可以执行任意命令,但不接受管道命令和重定向符号,如果想使用这些,则需要使用Shell模块。

ansible all -m command -a "ls" #在所有匹配主机上执行ls命令

playbook:

- name: test for command

command: ls

3.copy

#复制一个文件到远程服务器

ansible all -m copy -a "src=/tmp/text.txt dest=/home/tmp/"

#将本地text.txt文件复制到所有匹配主机的/home/tmp/路径下。

playbook:

- name: test for copy

copy: src=/tmp/text.txt dest=/home/tmp/ force=yes

4.file

这个模块这次构建系统中并没有用到,官方的解释是用来设置文件、文件夹或快链的属性,或者删除文件、快链、文件夹。

创建一个文件夹,如果目标不存在

ansible webservers -m file -a "path=/tmp/tdir state=directory mode=0755"

playbook

- name: create a directory if it doesn't exist

- file:

path: /etc/some_directory

state: directory

mode: 0755

5.get_url

!从服务器上下载一个文件到远程主机指定的目录

ansible webservers -m get_url -a "url=' dest=/tmp/ba.html"

playbook

- name: download foo.conf

get_url:

url:

dest: /etc/foo.conf

mode: 0440

6.yum

特别适用于批量安装一些依赖包的时候

ansible webservers -m yum -a "name=httpd state=latest"

ansible webservers -m yum -a "name=httpd state=absent" !删除包

playbook

- name: install the latest version of Apache

yum:

name: httpd

state: latest 

7.service

控制远程服务器上的服务

ansible webservers -m service -a "name=nginx state=restart"

playbook

- name: restart rmote nginx

service: name=nginx state=restart

8.setup

收集远程服务器信息

ansible all -m setup

在playbook中,这项任务默认是执行的,不需要列出。

9.server start

ansbile all -m service -a 'name=httpd state=started

10.script

ansibleall -m script -a '/root/123.sh

11.shell

ansible all -m shell -a "echo $RANDOM | tr'0-9' 'a-z' > /root/123"

二、安装部署Ansible服务

  • ansible自动化运维环境有控制主机与被管理主机组成,由于ansible是基于SSH协议进行通信的,所以控制主机安装ansible软件后不需要重启或者运行任何程序,被管理主机也不需要安装或者运行任何代理程序。

Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。

ansible的模块化:
模块化:调用特定的模块来完成特定的任务;

基于python语言实现,由paramaiko、pyYAML和jinja2三个关键模块

部署简单:agentless类工具

主从模式:

支持自定义模块:

支持playbook:

        物理机:PXE、Cobbler

2.1、安装部署Ansible

服务器 IP地址 操作系统 组名
控制主机 192.168.144.112 CentOS7.3 x86_64
被控制主机1 192.168.144.111 centos7.3 x86_64 webserver
被控制主机2 192.168.144.114 centos7.3 x86_64 mysql
  • 1)配置yum源

yum install epel-release

  • 2)安装ansible

yum install ansible -y
yum install tree -y

  • 3)安装完成后,利用tree命令查看配置文件结构。

tree /etc/ansible

/etc/ansible/
├── ansible.cfg   //主配置文件
├── hosts         //管控主机文件
└── roles        //角色目录

澳门新萄京官方网站 1

二、特性

ansible密钥登陆
ansible是通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各个被管理节点;

    ansible管理端做密钥:ssh-keygen -t rsa -P ‘’

    将密钥拷贝到各个被控节点:ssh-copy-id  root@192.168.4.41

    ssh远程连接测试:ssh root@192.168.4.41 ##应该不需要密码就可以直接远程进被控端

        虚拟机:Image、Templates

2.2、配置主机清单

vim /etc/ansible/hosts

[webserver]      //主机分类组名
192.168.144.111  //主机IP地址或者是域名

[mysql]
192.168.144.114

部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。

ansible安装
## wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

## yum -y install ansible

配置文件:/etc/ansible/ansible.cfg

主机清单:/etc/ansible/hosts

    Configuration:

2.3、利用SSH实现登录

  • 控制服务器上操作,为了避免ansible下发指令时输入被管理主机的密码,需要使用SSH证书签名达到免密登录效果。使用ssh-keygen产生一对密匙,使用ssh-copy-id来下发公匙。

ssh-keygen -t rsa
ssh-copy-id root@192.168.144.111 //发送公匙给被控服务器
ssh-copy-id root@192.168.144.114

  • 当被控制服务器接收到公匙后,实际已经可以通过ansible进行命令控制,只是,存在每次都需要输入私钥密码交互式验证较为麻烦,因此需要设置免交互代理。

ssh-agent bash
ssh-add //输入私钥密码即可

澳门新萄京官方网站 2

支持Linux/UNIX及windows环境

ansible的简单使用
1、修改/etc/ansible/hosts文件,添加ansible被控主机或被控组;

    ##必须先在hosts文件添加主机ip,不然远程控制被控端时会报错: [WARNING]: No hosts matched, nothing to do

2、执行一个简单的ansible命令:

    在ansible控制端执行:

    ansible 192.168.4.41 -m command -a 'ifconfig'会显示被控端的网卡信息

        puppet工具(ruby开发)

三、Ansible应用命令模块

默认使用 SSH(Secure Shell)协议对设备进行管理,用它来配置思科路由也非常方便。

ansible常用模块

        Saltstack(python开发)

3.1、ansible命令格式

  • 命令格式:ansible [主机] [-m 模块] [-a args]
  • ansible-doc -l //列出所有已安装的模块 注:按q退出
  • ansible-doc -s user //-s列出user模块描述信息和操作动作

澳门新萄京官方网站 3

主从集中化管理。
配置简单、功能强大、扩展性强。
支持 API 及自定义模块,可通过 Python 轻松扩展。
通过 Playbooks 来定制强大的配置、状态管理。
对云计算平台、大数据都有很好的支持。
提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 ---- AWX 平台。

可以使用‘ansible-doc -s 模块名 ’来查看模块的详细用法
ansible用法:ansible  [-f forks] [-m module_name] [-a args]

user模块:

    示例:ansible test -m user -a 'name=wuyongfeng state=present system=yes'

        在test组包含的被控端上创建用户,name为wuyongfeng;

        state=present表示创建用户,state=absent时表示删除用户;

        system=yes表示创建系统用户;

group模块:

示例:ansible test -m group -a 'name =testgroup gid=111 state=present system=yes'

在test组包含的被控端上创建组testgroup;

组id为111;

state=present表示创建组,state=absent时表示删除组;

syste=yes表示创建系统组,system=no表示创建的不是系统组;

cron模块:

示例:ansible test -m cron -a 'name="wuyongfeng crontab list" minute="*/20" job="/sbin/ntpdate 192.168.4.40 &>/dev/null"'

在test组包含的被控端添加任务计划,每20分钟向192.168.4.40同步时间,并把输出丢如/dev/null;

name:计划任务的描述信息;

minute:分钟;

job:要进行的操作;

day:日(1-31,/2,……);

hour:小时(0-23,/2,……);

month:月(1-12,/2,……);

weekday:周(0-7,*,……);

user:以哪个用户的身份执行;

若要删除之前在被控端部署的计划任务,只需指定name和state=absent即可;

例如:

ansible test -m cron -a 'name="wuyongfeng crontab list" state=absent'

copy模块:

示例:ansible test -m copy -a 'src=/data/wyf.txt dest=/tmp/wyf.txt mode=600'

复制ansible控制端的wyf.txt文件到test组所指定的被控端的主机的/tmp目录下

src:源路径

dest:目标路径

mode:文件权限

file模块:

专门用来设定文件属性;

ansible test -m file -a 'path=/tmp/www state=directory'

在test组定义的被控端的/tmp/下创建www目录,state指定文件属性为目录

group:定义文件/目录的属组

mode:定义文件/目录的权限

owner:定义文件/目录的属主

path:必选项,定义文件/目录的路径

recurse:递归的设置文件的属性,只对目录有效

src:要被链接的源文件的路径,只应用于state=link的情况

dest:被链接到的路径,只应用于state=link的情况

state:

=directory:如果目录不存在,创建目录

=file:即使文件不存在,也不会被创建

=link:创建软链接

=hard:创建硬链接

=touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

=absent:删除目录、文件或者取消链接文件

ping模块:

用于确认和对象机器之间是否能够ping通,正常情况会返回pong;

示例:ansible test -m ping

ping test组定义的被控端;如果是可以通的则返回pong;

yum模块:

示例:ansible test -m yum -a 'name=httpd state=present'

在test组的被控端yum安装httpd;

config_file:yum的配置文件

disable_gpg_check:关闭gpg_check

disablerepo:不启用某个源

enablerepo:启用某个源

name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径

state:状态(present安装,absent卸载,latest最新的)

service模块:

示例:ansible test -m service -a 'name=httpd state=started enabled=yes'

test组的所有被控端,启动httpd服务,开机启动(enabled)

enabled:[yes/no] 启动os后启动对应service的选项;是否开机启动

name:需要进行操作的service名字

state:[stared/stoped/restarted/reloaded] 服务最终操作后的状态。

shell模块:

示例:ansible test -m shell -a 'sh /date/1.sh chdir=/date/www creates=/date/www/1.txt'

执行test组所有被控端,先切换到/date/www目录,如果/date/www/1.txt不存在,则执行/data/1.sh,

chdir:command一样的,运行shell之前cd到某个目录;

creates:跟command一样的,如果某个文件存在则不运行shell;

removes:跟command一样的,如果某个文件不存在则不运行shell;

script模块:

可以实现被控端上可以执行ansible控制端的脚本。

示例:ansible test -m script -a '/4.40/www/2.sh'

在test组所有被控端执行ansible控制端中/4.40./www/目录下的2.sh

setup模块:

用于收集远程主机的一些基本信息。

示例:ansible test -m setup

收集test组所有主机的基本信息

        chef

3.2、command模块

  • Ansible管理工具默认模块,若省略-m command,ansible默认使用command的模块

ansible 192.168.144.111 -m command -a 'date' //指定ip执行date
ansible webserver -m command -a 'date' //指定分类执行date
ansible mysql -m command -a 'date'
ansible all -m command -a 'date' //所有hosts主机执行date命令
ansible all -a 'ls -l /' 如果不加-m模块,则默认运行command模块

三、总体架构

Ansible Playbooks

    Command and Concrol:

3.2、cron模块

  • 两种状态,present表示添加,默认状态,absent表示移除

ansible-doc -s cron //查看cron模块信息
ansible webserver -m cron -a 'minute="*/1" job="/bin/echo heihei" name="test cron job"'

ansible webserver -m cron -a 'hour="23" job="/bin/echo heihei" name="test cron job"'    //每天23点执行,若想每隔23个小时执行需要改成hour="*/23"
ansible webserver -m cron -a 'weekday="6" job="/bin/echo heihei" name="test cron job"'

ansible-doc -s cron  //结合查看详细用法

ansible webserver -a 'crontab -l'
ansible webserver -m cron -a 'name="test cron job" state=absent' //移除计划任务,假如该计划任务没有取名字,name=None即可

 

playbook的核心元素:

Tasks:任务

Variables:变量

Templates:模板

Handlers:处理器

Roles:角色

ansible --yaml语法

一:介绍:

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl等。

YAML不是XML,不过,在开发的这种语言时,YAML的意思其实是:“Yet Another Makup Language”(仍是一种标记语言)

特点:

1、可读性好

2、和脚本的交互性好

3、使用实现怨言的数据类型

4、有一个一致的信息模型

5、易于实现。

6、可以基于流来处理。

7、表达能力强,扩展性好。

二:yaml语法

yaml的语法和其他高阶语言类似,并且可以简单表达清单,散列表,标量等数据结构,其结构通过空格来展示,序列里的项目用“-”来表示,map里的键值对用“:”分隔,下面是一个示例:

name:john smith

age:41

gender:male

spouse:

name:jane smith

age:37

gender:female

children:

  • name:jimmy smith

age:17

gender:male

  • name:jenny smith

age:14

gender:female

列表: 也叫做序列

列表中的所有元素都用“-”打头,例如:

  • apple

  • orange

  • mango

字典:

字典通过key与value进行标识,例如:


name:example developer

job:developer

skill:elite

也可以将key:value放置与{}中表示,例如:

{name:example developer,job:developer,skill:elite}

        fabric

3.3、user模块

  • 用于创建新用户,更改删除已存在用户,name选项用于指定用户名称。
  • user模块是请求的是useradd, userdel, usermod三个指令
  • 可指定新建用户的uid,group所属组

ansible webserver -m user -a 'name="test1"'
ansible webserver -m user -a 'name="test2" shell=/sbin/nologin' //添加用户指定shell登录方式
ansible webserver -m command -a 'tail /etc/passwd' //查看用户
ansible webserver -m user -a 'name="test1" state=absent' //删除用户test01

澳门新萄京官方网站 4

Ansible基础元素

1.变量

1.1 变量命名

变量名仅能由字母,数字和下划线组成,且只能以字母开头

1.2 facts

facts是由正在通信的远程目标主机返回的信息,这些信息能保存在ansible变量中,要获取指定的远程主机所支持的素有的facts,可使用如下命令进行

    预发布环境验证:

3.4、group模块

  • 针对用户的组进行管理,请求groupadd、groupdel、groupmod三个指令

ansible-doc -s group //查看group模块帮助文档
ansible mysql -m group -a 'name=mysql gid=306 system=yes' //创建mysql组,指定gid,设置为系统组
ansible mysql -a 'tail /etc/group'
ansible mysql -m user -a 'name=test01 uid=306 system=yes group=mysql' //使用user模块添加用户,并添加到mysql组
ansible mysql -a 'tail /etc/passwd'
ansible mysql -a 'id test01'

四、执行过程

ansible hostname -m setup

1.3 register

注册器:把任务的输出定义为变量,然后用于其他任务,示例如下:

tasks:

  • shell:/usr/bin/foo

register:foo_result

ignore_errors:True

1.4 通过命令行传递变量

在运行playbooks的时候也可以传递一些变量供playboo使用:示例如下:

ansible-playbook test.yml --extra-vars"hosts=www user=mageedu"

1.5 通过roles传递变量

当给一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量,示例如下:

  • hosts:webservers

roles:

  • common

  • { roles:foo_app_instance,dir:'/web/htdocs/a.com',port 8000 }

2.Inventory

澳门新萄京官方网站:anisble使用及常用模块,自动化运维工具Ansible。ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名,默认的inventory file为/etc/ansible/hosts

Inventory file可以有多个,且也可以通过Dynamic Inventory动态生成;

2.1 Inventory文件格式

Inventory文件INI文件风格,中括号中的字符为组名,可以将同一个主机分配到多个不同的组,此外,当被控制的主机使用了非默认的ssh 22端口时,还可以在主机ip或主机名之后使用冒号加端口号标明;示例:

[webservers] ##被控组组名

192.168.1.100 ##使用ip添加被控端主机

www.mageedu.com:222 ##如果被控端没有使用默认的ssh端口,可用冒号加端口号注明

如果主机名称遵循相似的命名格式,还可以使用列表的方式标识主机,示例:

[webservers]

www[1:50].example.com ##表示www1.example.com-www50.example.com的主机

2.2 主机变量

可以在Inventory中定义主机时为其添加主机变量以便于在playbook中使用,例如:

[webservers]

www1.mageedu.com http_port-80 maxRequestsPerChild-808

www2.mageedu.com http_port-8080 maxRequestsPerChild-909

2.3 组变量

组变量是指赋予给指定组内所有主机上的在playbook中可用的变量,例如:

[webservers]

www1.mageedu.com

www2.mageedu.com

[webservers:vars] :vars是固定写法,指定下边两行都可以分别对应给webservers组的两台主机

ntp_server-ntp.mageedu.com

nfs_server-nfs.mageedu.com

2.4 组嵌套

Inventory中,组还可以包含其他的组,并且也可以向组中的主机指定变量,不过,这些变量只能在ansible-playbook中使用,而ansible不支持,例如:

[apache]

httpd1.mageedu.com

httpd2.mageedu.com

[nginx]

nginx1.mageedu.com

nginx2.mageedu.com

[webservers:children] webservers组内包含apache和nginx两个组,:children表示引用了其他组用来做webservers组的子组

apache

nginx

[webservers:vars]

ntp_server-ntp_mageedu.com

2.5 Inventory参数

ansible基于ssh连接Inventory中指定的远程主机时,还可以通过参数指定其交互方式,这些参数如下所示:

ansible_ssh_host

ansible_ssh_port

ansible_ssh_user

ansible_ssh_pass

ansible_sudo_pass

ansible_connection

ansible_ssh_pricate_key_file

ansible_shell_type

ansible_python_interpreter

ansible_*_interpreter

        新版本的代码先发布到内网测试服务器(跟线上环境配置完全相同,只是未介入到调度器);

3.5、copy模块

  • 用于实现文件复制和批量文件下发,src用来定义文件源路径,dest定义被管理主机的文件路径,owner指定属主,group指定属组,mode指定文件权限。

ansible-doc -s copy
ansible mysql -m copy -a 'dest=/opt/123.txt content="heihei" owner=test01 group=test01 mode=600' //新建文件且指定内容
ansible mysql -a 'ls -l /opt'
ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640' //复制文件

澳门新萄京官方网站 5

Ansible playbooks

playbooks是一个或多个“play”组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的tasks定义好的角色,从根本上来讲,所谓task无非是调用ansible的一个module,将多个play组织在一个playbook中,即可以让他们连同起来按事先编排的机制同唱一台大戏,下面是一个简单示例:

  • hosts:webservers ##定义inventory,主机组

vars:

http_port:80

max_clients:256

remote_user:root ##定义连接到远程主机时,以哪个用户的身份执行

tasks:

  • name:install apache is at the latest version ##描述,可随意写

yum:name=httpd state=latest ##使用yum模块,指定选项,安装最新版本的httpd

  • name: ensure apache is running ##描述信息

service:name=httpd state=started ##使用service模块,指定httpd状态

handlers: ##处理器

  • name:restart apache

service:name=httpd state=restarted

playbook组成结构:

澳门新萄京官方网站:anisble使用及常用模块,自动化运维工具Ansible。Inventory

Modules

Ad Hoc Commands

Playbooks

Tasks:任务,即调用模块完成的某操作

Variables:变量

Templates:模板

Handlers:处理器,在某条件满足时,会由某事件触发执行的操作

Roles:角色

hosts和remote_user:

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务,hosts即用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组,remote_user则用于指定远程主机上的执行任务的用户,如以上示例中的

  • hosts:webservers

remote_user:root

不过,remote_user也可以用于各个tasks中(可能每个tasks指定的用户不一样),也可以指定其通过sudo的方式在远程主机上执行操作,其可用于play全局或某任务,此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户;

  • hosts:webservers

remote_user:mageedu

tasks:

  • name:test connection

ping:

remote_user:mageedu

sudo:yes ##以remote_user指定的用户切入进去,然后以这个用户的身份sudo到root用户去

任务列表和action:

play的主体部分是task、list、task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再执行第二个任务,在运行自上而下某playbook时,如果中途发生错误,所有已执行任务都可能回滚,因此,在更正playbook后重新执行一次即可;

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行是幂等的,这意味这多次执行是安全的,因为其结果均一致;

每个task都应该有个name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤,如果为提供name,则执行action的结果将用于输出;

定义task的可以使用"action:module option"或"module:option"的格式,推荐使用后者以实现向后兼容;

tasks:

  • name:make sure apache is running

service:name=httpd state=running

在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用key:value格式,例如:

tasks:

  • name:disable selinux

command:/sbin/setenforce 0

如果命令或脚本的退出码不为零,可以使用如下方式替代:

tasks:

  • name:run this command and ignore the result

shell:/usr/bin/SOME COMMAND||/bin/true

在执行/usr/bin/下的某条命令时,如果报错了,但是这不影响我们本身意愿或者执行结果时,可以使用/bin/true将退出码强制改为true

或者使用ignore_errors来忽略错误信息:

tasks:

  • name:run this command and ignore the result

shell:/usr/bin/SOME COMMAND

ignore_errors:True

Handlers:处理器

用于当关注的资源发生变化时采取一定的操作:

“notify”这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之, 仅在所有的变化发生完成后一次性的执行指定操作,在notify中列出的操作成为Handlers,也即notify中调用handlers中定义的操作;

示例:

  • hosts: test #主机组,在/etc/ansible/hosts定义

remote_user: root # 远端执行任务的用户

tasks: #任务

  • name: install httpd #任务描述

command: yum -y install httpd #调用ansible的command模块安装httpd

  • name: install configuration file for httpd #任务描述

copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf #调用ansible的copy模块复制ansible管理端的文件到被控端

notify: #定义一个notify,当执行copy这个模块的命令时执行notify

  • restart httpd # notify引用的handlers的名字为restart httpd(必须跟handlers的名字一样)

handlers: # 定义一个handlers

  • name: restart httpd #名字为restart httpd

service: name=httpd state=restarted #调用ansible的service模块,重启httpd服务

    程序发布:

3.6、file模块

  • 在ansible中使用file模块来设置文件属性,其中使用path指定文件路径,使用src定义源文件路径,使用name或者dest来替换创建文件的软链接。

ansible-doc -s file
ansible mysql -m file -a 'owner=root group=root mode=755 path=/opt/123.txt' //更改文件的属主属组
ansible mysql -m file -a 'src=/opt/123.txt dest=/opt/123.txt.bk state=link' //创建软连接
ansible mysql -m file -a 'path=/opt/test.txt state=touch' //新建一个空文件,若需要指定内容需要copy模块,content指定内容

五、Ansible 与 SaltStack对比

playbook的一个简单实例:
  • hosts: test #主机组,在/etc/ansible/hosts定义

remote_user: root # 远端执行任务的用户

tasks: #任务

  • name: install httpd #任务描述

command: yum -y install httpd #调用ansible的command模块安装httpd

        不能影响用户体验;

3.7、ping模块

  • 在ansible中使用ping模块来检测指定主机的连通性。

ansible all -m ping

>> 最大的区别是 Ansible 无需在被监控主机部署任何客户端代理,默认通过 SSH 通道进行远程命令执行或下发配置。
>> 相同点是都具备功能强大、灵活的系统管理、状态配置,都使用 YAML 格式来描述配置,两者都提供丰富的模板及 API,对云计算平台、大数据都有很好的支持。

在playbook中使用变量:
  • hosts: test #主机组,在/etc/ansible/hosts定义

remote_user: root # 远端执行任务的用户

vars: ##定义变量package和service

  • package: httpd

  • service: httpd

tasks: #任务

  • name: rpm -e httpd

command: rpm -e httpd

  • name: install {{ package }} #任务描述 调用变量用{{ }}引用

command: yum -y install httpd #调用ansible的command模块安装httpd

  • name: install configuration file for httpd

copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf

notify:

  • restart httpd

handlers:

  • name: restart httpd

service: name=httpd state=restarted

        系统不能停机;

3.8、yum模块

  • 负责在被管理的主机上安装与卸载软件包,但是需要前提在每个节点配置自己的yum仓库,其中name指定软件包名称,state=absent为选择卸载软件包。

ansible-doc -s yum
ansible mysql -m yum -a 'name=httpd'
ansible mysql -m yum -a 'name=httpd state=absent'
ansible mysql -m command -a 'rpm -q httpd'

Ansible在github上地址:

Ansible使用条件测试

如果需要根据变量、facts或此前任务的执行结果来做为某task执行还是不执行的前提时需要用到条件测试;

1.when语句

在task后添加when子句即可使用条件测试,when语句支持jinja2表达式语法,例如:

tasks:

  • name: "shutdown debian system"

command: /sbin/shutdown -h now

when: ansible_os_family == "Debian"

当系统为debian系统时,则关机

  • hosts: test

remote_user: root

tasks:

  • name: yum httpd

command: yum -y install httpd

when: ansible_fqdn == "wwww"

当test组的某台主机的主机名为wwww时,才给符合条件的主机安装httpd

        不能导致系统故障或造成系统完全不可用;

3.9、service模块

  • 控制服务的运行状态,enabled表示打开开机自启动,取值为true或者false,使用name定义服务名称,使用state指定服务状态,取值为started、stopped、restarted.(此处注意很多参数后有ed,注意stopped)

ansible-doc -s service
ansible mysql -m service -a 'name=httpd enabled=true state=started' //设置httpd开启自启动,且状态为开启
ansible mysql -m command -a 'systemctl status httpd'

 

Ansible playbook使用迭代(循环)

当有需要重复性执行的任务时,可以使用迭代机制,其使用格式为将需要迭代的内容定义为item变量引用,并通过with_item语句来指明迭代的元素列表即可,例如:

  • hosts: test

remote_user: root

tasks:

  • name: touch file

file: name={{ item }} state=directory ##循环创建ietm,而item对应的值为with_items中指定的

with_items: ##列出item索要对应的值

  • file1

  • file2

事实上,with_items中可以使用元素还可为hashes,例如:

  • hosts: test

remote_user: root

tasks:

  • name: touch file

user: name={{ item.name}} state=present groups={{ item.groups }} ##在各个主机创建用户,以及指定用户的基本组

with_items:

  • { name: 'testuser1', groups: 'nginx' }

  • { name: 'testuser2', groups: 'apache' }

    灰度发布:

3.10、shell模块

  • 用于创建用户无交互模式给用户设置密码。

ansible-doc -s shell
ansible mysql -m shell -a 'echo abc123 | passwd --stdin test' //为test用户创建面交互式密码

Ansible安装部署与配置

Ansible中使用Templates

http://blog.csdn.net/modoo_junko/article/details/45460693

        一种发布模式;在调度器上下线一批主机 --> 关闭服务 --> 部署新版本的应用程序 --> 启动服务 --> 在调度器上启用这一批主机;

3.11、script模块

  • 可以将本地脚本复制到被管理主机上进行运行,需要注意的是,使用相对路径指定脚本!!!

ansible-doc -s script
vi test.sh

#!/bin/bash
echo "hello ansible from script"> /opt/script.txt

chmod x test.sh
ansible mysql -m script -a 'test.sh'

       角色              主机名                  IP                                组名             

        自动化灰度发布机制:可通过脚本或公司自己的发布平台发布;

3.12、setup模块

  • 查看被管理主机的facts(facts是ansible采集被管理主机设备信息的一个功能)每个被管理主机在接受并运行管理命令之前,都会将自己的相关信息(操作系统版本IP地址等)发送给控制主机。

ansible-doc -s setup
ansible mysql -m setup

澳门新萄京官方网站 6

下面关于Ansible的文章您也可能喜欢,不妨参考下:

使用Ansible批量管理远程服务器 
在 CentOS 7 中安装并使用自动化工具 Ansible 
CentOS 7上搭建Jenkins Ansible服务 
Linux下源码编译安装Ansible及排错记录 
Ansible基础—安装与���用模块 
Ansible配置及使用 
自动化运维工具Ansible使用教程
自动化运维工具之 Ansible 介绍及安装使用 
自动化运维之Ansible详解 
Ansible入门notify和handlers 
CentOS 6.5安装自动化工具Ansible和图形化工具Tower 

Ansible 的详细介绍:请点这里
Ansible 的下载地址:请点这里

Linux公社的RSS地址:

本文永久更新链接地址

澳门新萄京官方网站 7

       控制端           hd01                     192.168.1.11                 ——             

###### 运维工具的分类 :

       被控端           hd02                     192.168.1.12                 webservers   

    agent:代理工具:puppet,func

       被控端           hd03                     192.168.1.13                 webservers   

    agentless:无代理工具:ansible,fabric;agentless类工具必须依赖ssh服务;

 

###### ansible的模块化:

Ansible安装

    模块化:调用特定的模块来完成特定的任务;

安装可使用源码编译安装,也可以更新yum源后使用yum安装

    基于python语言实现,由paramaiko、pyYAML和jinja2三个关键模块

 

    部署简单:agentless类工具

yum 安装:

    主从模式:

配置源(centos6)

    支持自定义模块:

yum install -y

    支持playbook:

换163的源

###### ansible密钥登陆

wget      

    ansible是通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各个被管理节点;

 mv CentOS6-Base-163.repo /etc/yum.repos.d/

        ansible管理端做密钥:ssh-keygen -t rsa -P ‘’

 yum clean all

        将密钥拷贝到各个被控节点:ssh-copy-id  root@192.168.4.41

 

        ssh远程连接测试:ssh root@192.168.4.41 ##应该不需要密码就可以直接远程进被控端

CentOS6-Base-163.repo主要是为了安装:PyYAML

######  ansible安装

配置源(centos7)
rpm -iUvh
下载配置文件(centos7)
wget          CentOS7-Base-163.repo主要是为了安装:PyYAML
mv CentOS7-Base-163.repo /etc/yum.repos.d/

    ## wget -O /etc/yum.repos.d/epel.repo

yum clean all

    ## yum -y install ansible

 

    配置文件:/etc/ansible/ansible.cfg

安装ansible

    主机清单:/etc/ansible/hosts

yum -y install ansible

###### ansible的简单使用

查看ansible 版本

    1、修改/etc/ansible/hosts文件,添加ansible被控主机或被控组;

[root@hd01 ~]# ansible --version

        ##必须先在hosts文件添加主机ip,不然远程控制被控端时会报错: [WARNING]: No hosts matched, nothing to do

ansible 2.5.3

    2、执行一个简单的ansible命令:

  config file = /etc/ansible/ansible.cfg

        在ansible控制端执行:

  configured module search path = [u'/usr/share/my_modules']

        ansible 192.168.4.41 -m command -a 'ifconfig'会显示被控端的网卡信息

  ansible python module location = /usr/lib/python2.6/site-packages/ansible

###### ansible常用模块

  executable location = /usr/bin/ansible

###### 可以使用‘ansible-doc -s 模块名 ’来查看模块的详细用法

  python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]

    ansible用法:ansible  [-f forks] [-m module_name] [-a args]

注:yum装ansible      随着时间的推移,ansible版本会是最新版的。

    user模块:

Ansible通过定义好的主机与组规则(Inventory)对匹配的目标主机进行远程操作,配置文件默认是/etc/ansible/hosts

        示例:ansible test -m user -a 'name=wuyongfeng state=present system=yes'

定义Host Inventory

            在test组包含的被控端上创建用户,name为wuyongfeng;

添加组名及允许执行命令的主机

            state=present表示创建用户,state=absent时表示删除用户;

澳门新萄京官方网站 8

            system=yes表示创建系统用户;

webservers 是组名,下面的是IP也可以使用域名、别名标识。

group模块:

各主机SSH互信

示例:ansible test -m group -a 'name =testgroup gid=111 state=present system=yes'

[root@hd01 ~]# ssh-keygen -t rsa   #创建公钥与私钥

在test组包含的被控端上创建组testgroup;

澳门新萄京官方网站 9

组id为111;

 

state=present表示创建组,state=absent时表示删除组;

一直回车就OK

syste=yes表示创建系统组,system=no表示创建的不是系统组;

将公钥传给webservers组中的主机

cron模块:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12

示例:ansible test -m cron -a 'name="wuyongfeng crontab list" minute="*/20" job="/sbin/ntpdate 192.168.4.40 &>/dev/null"'

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.13

在test组包含的被控端添加任务计划,每20分钟向192.168.4.40同步时间,并把输出丢如/dev/null;

澳门新萄京官方网站 10

name:计划任务的描述信息;

 

minute:分钟;

 

job:要进行的操作;

测试主机免密 连通性:

day:日(1-31,*,*/2,……);

[root@hd01 ~]# ansible webservers -m ping

hour:小时(0-23,*,*/2,……);

#-m 使用ping模块  -vvv 可以查看详细的执行过程

month:月(1-12,*,*/2,……);

澳门新萄京官方网站 11

weekday:周(0-7,*,……);

 

user:以哪个用户的身份执行;

OK

若要删除之前在被控端部署的计划任务,只需指定name和state=absent即可;

提示:

例如:

使用Linux普通用户账户进行连接并使用sudo命令实现root权限,格式为:

ansible test -m cron -a 'name="wuyongfeng crontab list" state=absent'

ansible webservers -m ping -u ansible -sudo

copy模块:

当没有做免密码访问时用 ansible webservers -m ping -k

示例:ansible test -m copy -a 'src=/data/wyf.txt dest=/tmp/wyf.txt mode=600'

然后输入密码 操作

复制ansible控制端的wyf.txt文件到test组所指定的被控端的主机的/tmp目录下

 

src:源路径

关于定义主机与组

dest:目标路径

在/etc/ansible/hosts中主机可以用域名、IP、别名进行标识。

mode:文件权限

/etc/ansible/hosts  中组成员主机名称支持正则描述   组成员主机IP支持正则描述

file模块:

举例说明 格式:

专门用来设定文件属性;

[webservers]                #组名

ansible test -m file -a 'path=/tmp/www state=directory'

alpha.example.org    #域名对应192.168.1.100     

在test组定义的被控端的/tmp/下创建www目录,state指定文件属性为目录

beta.example.org     #域名对应192.168.1.110     

group:定义文件/目录的属组

192.168.1.100               #IP

mode:定义文件/目录的权限

192.168.1.110               #IP

owner:定义文件/目录的属主

 

path:必选项,定义文件/目录的路径

mail.example.com

recurse:递归的设置文件的属性,只对目录有效

192.168.1.90:2135         #定义一个SSH服务端口为:2135的主机  

src:要被链接的源文件的路径,只应用于state=link的情况

 

dest:被链接到的路径,只应用于state=link的情况

组成员主机名称支持正则描述,举例:

state:

[webservers]

=directory:如果目录不存在,创建目录

www.[01:50].example.com

=file:即使文件不存在,也不会被创建

[databases]

=link:创建软链接

db-[a:f].example.com

=hard:创建硬链接

 

=touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

定义主机变量

=absent:删除目录、文件或者取消链接文件

主机可以指定变量,以便后面供Playbook配置使用,比如定义主机host1及host2上apache参数http_port及maxRequestsPerChild,目的是让两台主机产生Apache配置文件httpd.conf差异化,格式:

ping模块:

[atlanta]

用于确认和对象机器之间是否能够ping通,正常情况会返回pong;

host1 http_port=80 maxRequestsPerChild=808

示例:ansible test -m ping

host2 http_port=303 maxRequestsPerChild=909

ping test组定义的被控端;如果是可以通的则返回pong;

定义组变量

yum模块:

组变量的作用域是覆盖所有成员,通过定义一个新块,块名由组名 ”:vars”组成

示例:ansible test -m yum -a 'name=httpd  state=present'

格式:

在test组的被控端yum安装httpd;

[atlanta]

config_file:yum的配置文件

host1

disable_gpg_check:关闭gpg_check

host2

disablerepo:不启用某个源

[atlanta:vars]

enablerepo:启用某个源

ntp_server=ntp. atlanta.example.com

name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径

proxy=proxy.atlanta.example.com

state:状态(present安装,absent卸载,latest最新的)

 

service模块:

 

示例:ansible test -m service -a 'name=httpd state=started enabled=yes'

匹配目标

test组的所有被控端,启动httpd服务,开机启动(enabled)

格式:ansible <目标主机或组> -m <模块名字> -a <模块参数>

enabled:[yes/no] 启动os后启动对应service的选项;是否开机启动

重启webservers组所有Apache服务

name:需要进行操作的service名字

[root@hd01 ~]# ansible webservers -m service -a "name=httpd state=restarted"

state:[stared/stoped/restarted/reloaded] 服务最终操作后的状态。

 

shell模块:

匹配目标主机规则表

示例:ansible test -m shell -a 'sh /date/1.sh chdir=/date/www creates=/date/www/1.txt'

192.168.1.12或者hd02               匹配目标IP地址或主机名,多个IP或主机名使用”:”号分隔

执行test组所有被控端,先切换到/date/www目录,如果/date/www/1.txt不存在,则执行/data/1.sh,

webservers                                匹配目标组为webservers多个组使用”:”号分隔

chdir:command一样的,运行shell之前cd到某个目录;

all或者'*'                                   匹配所有主机

creates:跟command一样的,如果某个文件存在则不运行shell;

hd.*或者192.168.1.*                   支持正则匹配主机或者IP地址

removes:跟command一样的,如果某个文件不存在则不运行shell;

webservers:!192.168.1.11            匹配webservers组且排除192.168.1.11主机IP

script模块:

agent:&webservers                    匹配agent和webservers两个组的交集

可以实现被控端上可以执行ansible控制端的脚本。

webservers:!{{excluded}}:&{{required}}       支持变量匹配方式

示例:ansible test -m script -a '/4.40/www/2.sh'

 

在test组所有被控端执行ansible控制端中/4.40./www/目录下的2.sh

Ansible常用模块及API

setup模块:

Ansible提供了非常丰富的功能模块,包括cloud(云计算)、Commands(命令行)、Database(数据库)、Files(文件管理)、Internal(内置功能)、Monitoring(监控管理)等等。

用于收集远程主机的一些基本信息。

获取webservers组中主机uptime信息

示例:ansible test -m setup

[root@hd01 ~]# ansible webservers -m command -a "uptime"     

收集test组所有主机的基本信息

 

###### Ansible Playbooks

澳门新萄京官方网站 12

#playbook的核心元素:

 

Tasks:任务

-m command是默认模块  可省略

Variables:变量

[root@hd01 ~]# ansible-doc ping

Templates:模板

可获得模块的帮助信息

Handlers:处理器

EXAMPLES:

Roles:角色

# Test we can logon to 'webservers' and execute python with json lib.

ansible --yaml语法

# ansible webservers -m ping

一:介绍:

 

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl等。

# Example from an Ansible Playbook

YAML不是XML,不过,在开发的这种语言时,YAML的意思其实是:“Yet  Another Makup Language”(仍是一种标记语言)

- ping:

特点:

 

1、可读性好

# Induce an exception to see what happens

2、和脚本的交互性好

- ping:

3、使用实现怨言的数据类型

    data: crash

4、有一个一致的信息模型

 

5、易于实现。

RETURN VALUES:

6、可以基于流来处理。

ping:

7、表达能力强,扩展性好。

    description: value provided with the data parameter

二:yaml语法

    returned: success

yaml的语法和其他高阶语言类似,并且可以简单表达清单,散列表,标量等数据结构,其结构通过空格来展示,序列里的项目用“-”来表示,map里的键值对用“:”分隔,下面是一个示例:

    type: string

name:john smith

    sample: pong

age:41

在playbook中运行远程命令格式:

gender:male

- name: reboot the service

spouse:

  command: /sbin/reboot -t now

name:jane smith

 

age:37

Ansible 常用模块学习

gender:female

shell > ansible-doc -l    # 列出 Ansible 支持的模块

children:

ansible-doc <模块名>查看模块帮助信息

-  name:jimmy smith

 

age:17

>>远程命令模块( command / script / shell )

gender:male

command 作为 Ansible 的默认模块,可以运行远程权限范围所有的 shell 命令,不支持管道符。

-  name:jenny smith

例:

age:14

ansible webservers -m command -a "free -m"               # 查看 webservers 分组主机内存使用情况

gender:female

[root@hd01 ~]# ansible webservers -m command -a "free -m"

列表: 也叫做序列

澳门新萄京官方网站 13

列表中的所有元素都用“-”打头,例如:

shell 的功能是执行远程主机上的 shell 脚本文件,支持管道符。

- apple

例:

- orange

[root@hd01 ~]# ansible webservers -m shell -a "/root/test.sh"          # 执行远程脚本

- mango

 

字典:

澳门新萄京官方网站 14

字典通过key与value进行标识,例如:

 


ansible的command和shell模块的区别:

name:example developer

比如我要批量删除一些文件, 

job:developer

[root@hd01 ~]# ansible webservers -m command -a "rm -f /root/test*.sh"

skill:elite

因为你的命令行中包含了通配符*号,通配符必须要有在shell环境中才能被识别出,不然,它只能删除test*.sh这一个文件。

也可以将key:value放置与{}中表示,例如:

澳门新萄京官方网站 15

{name:example developer,job:developer,skill:elite}

 

###### Ansible基础元素

虽显示成功,但目标文件未被删除

1.变量

澳门新萄京官方网站 16

1.1 变量命名

 

变量名仅能由字母,数字和下划线组成,且只能以字母开头

所以你需要执行以下命令才能成功

1.2 facts

[root@hd01 ~]# ansible webservers -m shell -a "rm -f /root/test*.sh"

facts是由正在通信的远程目标主机返回的信息,这些信息能保存在ansible变量中,要获取指定的远程主机所支持的素有的facts,可使用如下命令进行

执行之后    

#ansible hostname -m setup

澳门新萄京官方网站 17

1.3 register

关于command模块运行的命令中无法使用管道符的说明。

注册器:把任务的输出定义为变量,然后用于其他任务,示例如下:

澳门新萄京官方网站 18

tasks:

 

- shell:/usr/bin/foo

script 的功能是在远程主机执行主控端存储的 shell 脚本文件,相当于 scp shell 组合。

register:foo_result

例:

ignore_errors:True

[root@hd01 ~]# ansible webservers -m script -a "/root/test.sh"      # 远程执行本地脚本

1.4 通过命令行传递变量

192.168.1.12 | SUCCESS => {

在运行playbooks的时候也可以传递一些变量供playboo使用:示例如下:

    "changed": true,

ansible-playbook test.yml --extra-vars"hosts=www user=mageedu"

    "rc": 0,

1.5 通过roles传递变量

    "stderr": "Shared connection to 192.168.1.12 closed.rn",

当给一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量,示例如下:

    "stdout": "123rn",

- hosts:webservers

    "stdout_lines": [

roles:

        "123"

- common

    ]

- { roles:foo_app_instance,dir:'/web/htdocs/a.com',port 8000 }

}

2.Inventory

192.168.1.13 | SUCCESS => {

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名,默认的inventory file为/etc/ansible/hosts

    "changed": true,

Inventory file可以有多个,且也可以通过Dynamic Inventory动态生成;

    "rc": 0,

2.1 Inventory文件格式

    "stderr": "Shared connection to 192.168.1.13 closed.rn",

Inventory文件INI文件风格,中括号中的字符为组名,可以将同一个主机分配到多个不同的组,此外,当被控制的主机使用了非默认的ssh 22端口时,还可以在主机ip或主机名之后使用冒号加端口号标明;示例:

    "stdout": "123rn",

[webservers]    ##被控组组名

    "stdout_lines": [

192.168.1.100  ##使用ip添加被控端主机

        "123"

www.mageedu.com:222 ##如果被控端没有使用默认的ssh端口,可用冒号加端口号注明

    ]

如果主机名称遵循相似的命名格式,还可以使用列表的方式标识主机,示例:

 

[webservers]

>>copy 模块(实现主控端向目标主机拷贝文件,类似于 scp 功能)

www[1:50].example.com ##表示www1.example.com-www50.example.com的主机

例:

2.2 主机变量

[root@hd01 ~]# ansible webservers -m copy -a "src=/root/test.sh dest=/tmp/ owner=root group=root mode=0755 backup=yes"

可以在Inventory中定义主机时为其添加主机变量以便于在playbook中使用,例如:

# 向 webservers 组中主机拷贝 test.sh 到 /tmp 下,owner:指定属主为 root,group:指定属组为:root ,mode:权限为 0755 , backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no

[webservers]

 澳门新萄京官方网站 19

www1.mageedu.com http_port-80 maxRequestsPerChild-808

 

www2.mageedu.com http_port-8080 maxRequestsPerChild-909

>>stat 模块(获取远程文件状态信息,atime/ctime/mtime/md5/uid/gid 等信息)

2.3 组变量

例:

组变量是指赋予给指定组内所有主机上的在playbook中可用的变量,例如:

[root@hd01 ~]# ansible webservers -m stat -a "path=/etc/passwd"    #path指定具体路径

[webservers]

澳门新萄京官方网站 20

www1.mageedu.com

 

www2.mageedu.com

>>get_url 模块(实现在远程主机下载指定 URL 到本地,支持 sha256sum 文件校验)

[webservers:vars]  :vars是固定写法,指定下边两行都可以分别对应给webservers组的两台主机

例:

ntp_server-ntp.mageedu.com

[root@hd01 ~]# ansible webservers -m get_url -a "url= dest=/tmp/index.html mode=0440 force=yes"  

nfs_server-nfs.mageedu.com

 

2.4 组嵌套

#下载百度首页index.html文件

Inventory中,组还可以包含其他的组,并且也可以向组中的主机指定变量,不过,这些变量只能在ansible-playbook中使用,而ansible不支持,例如:

# force:

[apache]

        yes:默认项,如果目标主机包含该文件,但内容不同,则强制覆盖

httpd1.mageedu.com

        no:则只有当目标主机的目标位置不存在该文件时,才复制

httpd2.mageedu.com

 

[nginx]

>>yum 模块(软件包管理)

nginx1.mageedu.com

#name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 

nginx2.mageedu.com

#state:目标状态(present,absent,latest)

[webservers:children]  webservers组内包含apache和nginx两个组,:children表示引用了其他组用来做webservers组的子组

  1. present是指安装套件,而 latest 則是指安装最新的套件,也就是会使用 yum mirror 上最新的版本。
  2. absent   卸载

apache

 

nginx

例:yum 装httpd

[webservers:vars]

[root@hd01 ~]#ansible webservers -m yum -a "name=httpd state=latest"

ntp_server-ntp_mageedu.com

安装

2.5 Inventory参数

澳门新萄京官方网站 21

ansible基于ssh连接Inventory中指定的远程主机时,还可以通过参数指定其交互方式,这些参数如下所示:

卸载

> ansible_ssh_host

[root@hd01 ~]#ansible webservers -m yum -a "name=httpd state=absent" 

> ansible_ssh_port

澳门新萄京官方网站 22

> ansible_ssh_user

>>cron 模块(远程主机 crontab 配置)

> ansible_ssh_pass

例: 

> ansible_sudo_pass

[root@hd01 ~]# ansible webservers -m cron -a "name='check passwd md5value' hour='8' job='md5sum /etc/passwd>/tep/p.txt'"

> ansible_connection

任务名字叫check passwd md5value   hour=’8’ 每天的8时执行任务

> ansible_ssh_pricate_key_file

澳门新萄京官方网站 23

> ansible_shell_type

效果:

> ansible_python_interpreter

[root@hd02 ~]# crontab -l

> ansible_*_interpreter

#Ansible: check passwd md5value

###### Ansible playbooks

* 8 * * * md5sum /etc/passwd>/tep/p.txt

playbooks是一个或多个“play”组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的tasks定义好的角色,从根本上来讲,所谓task无非是调用ansible的一个module,将多个play组织在一个playbook中,即可以让他们连同起来按事先编排的机制同唱一台大戏,下面是一个简单示例:

[root@hd02 ~]#

- hosts:webservers  ##定义inventory,主机组

 

vars:

>>mount 模块(远程主机分区挂载)

http_port:80

例:

max_clients:256

[root@hd01 ~]# ansible webservers -m mount -a 'name=/test src=/dev/sdb1 fstype=ext3 opts=ro state=present' 

remote_user:root ##定义连接到远程主机时,以哪个用户的身份执行

# fstype  指定文件系统类型为ext4  

tasks:

# opts     设定挂载的参数选项信息;-o ro == opts=ro 

- name:install apache is at the latest version ##描述,可随意写

# src       要被挂载的目录设备信息 src=/dev/sdb1

yum:name=httpd state=latest ##使用yum模块,指定选项,安装最新版本的httpd

 

- name: ensure apache is running ##描述信息

 

service:name=httpd state=started ##使用service模块,指定httpd状态

>>service 模块(远程主机系统服务管理)

handlers: ##处理器

例:

- name:restart apache

                                                          #state的4种目标状态

service:name=httpd state=restarted

[root@hd01 ~]# ansible webservers -m service -a "name=httpd state=started"  #启动httpd

playbook组成结构:

澳门新萄京官方网站 24

Inventory

[root@hd01 ~]# ansible webservers -m service -a "name=httpd state=stopped" #关闭httpd

Modules

澳门新萄京官方网站 25

Ad Hoc Commands

 

Playbooks

[root@hd01 ~]# ansible webservers -m service -a "name=httpd state=restarted" #重启httpd

Tasks:任务,即调用模块完成的某操作

 

Variables:变量

[root@hd01 ~]# ansible webservers -m service -a "name=httpd state=reloaded" #重新加载httpd

Templates:模板

 

Handlers:处理器,在某条件满足时,会由某事件触发执行的操作

>>sysctl 包管理模块

Roles:角色

功能

hosts和remote_user:

远程Linux主机sysctl配置。

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务,hosts即用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组,remote_user则用于指定远程主机上的执行任务的用户,如以上示例中的

实例

- hosts:webservers

sysctl: name=kernel.panic value=3 sysctl_file=/etc/sysctl.conf checks=before reload=yessalt '*' pkg.upgrade

remote_user:root

 

不过,remote_user也可以用于各个tasks中(可能每个tasks指定的用户不一样),也可以指定其通过sudo的方式在远程主机上执行操作,其可用于play全局或某任务,此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户;

>>user 服务模块(远程主机用户管理)

- hosts:webservers

例:

remote_user:mageedu

[root@hd01 ~]# ansible webservers -m user -a "name=wang comment='user wang'"

tasks:

澳门新萄京官方网站 26

- name:test connection

[root@hd01 ~]# ansible webservers -m user -a "name=wang state=absent remove=yes"    #state 目标状态  删除

ping:

澳门新萄京官方网站 27

remote_user:mageedu

实现一些监控功能

sudo:yes  ##以remote_user指定的用户切入进去,然后以这个用户的身份sudo到root用户去

查看全部主机在线情况

任务列表和action:

[root@ansible ~]# ansible all -m ping //内建的ping模块  #all表示/etc/ansible/hosts中全部主机

play的主体部分是task、list、task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再执行第二个任务,在运行自上而下某playbook时,如果中途发生错误,所有已执行任务都可能回滚,因此,在更正playbook后重新执行一次即可;

澳门新萄京官方网站 28

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行是幂等的,这意味这多次执行是安全的,因为其结果均一致;

 

每个task都应该有个name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤,如果为提供name,则执行action的结果将用于输出;

[root@hd01 ~]# ansible webservers -a "/bin/df -h" #输出挂载信息

定义task的可以使用"action:module option"或"module:option"的格式,推荐使用后者以实现向后兼容;

澳门新萄京官方网站 29

tasks:

 

- name:make sure apache is running

[root@hd01 ~]# ansible webservers -a "/sbin/ip addr show dev eth0"  #查看webservers组中主机网卡信息

service:name=httpd state=running

澳门新萄京官方网站 30

在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用key:value格式,例如:

 

tasks:

YAML语言

- name:disable selinux

yaml语言是一种基于Unicode容易阅读,容易和脚本语言交互的,用来表达数据序列的编程语言。Ansible与Saltstack环境中配置文件都以YAML格式存在,YAML文件扩展名通常为.yaml或者.yml

command:/sbin/setenforce 0

重要组成结构:list和directory

如果命令或脚本的退出码不为零,可以使用如下方式替代:

以下通过描述YAML与Python的对应关系,了解YAML的层次及结构

tasks:

块序列描述

- name:run this command and ignore the result

块序列就是将描述的元素序列到python的列表中

shell:/usr/bin/SOME COMMAND||/bin/true

Python:

在执行/usr/bin/下的某条命令时,如果报错了,但是这不影响我们本身意愿或者执行结果时,可以使用/bin/true将退出码强制改为true

import yaml

或者使用ignore_errors来忽略错误信息:

obj = yaml.load(

tasks:

"""

- name:run this command and ignore the result

- apple

shell:/usr/bin/SOME COMMAND

- banana

ignore_errors:True

- orange

Handlers:处理器

"""

用于当关注的资源发生变化时采取一定的操作:

)

“notify”这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,    仅在所有的变化发生完成后一次性的执行指定操作,在notify中列出的操作成为Handlers,也即notify中调用handlers中定义的操作;

print(obj)

示例:

结果:

- hosts: test  #\主机组,在/etc/ansible/hosts定义

['apple', 'banana', 'orange']

remote_user: root # \远端执行任务的用户

 

tasks: #\任务

YAML与Python块概念类似,例如:

- name: install httpd  #\任务描述

-

command: yum -y install httpd  #\调用ansible的command模块安装httpd

 - apple

- name: install configuration file for httpd #\任务描述

 - banana

copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf  #\调用ansible的copy模块复制ansible管理端的文件到被控端

 - orange

notify: #\定义一个notify,当执行copy这个模块的命令时执行notify

-

- restart httpd #\  notify引用的handlers的名字为restart httpd(必须跟handlers的名字一样)

 - chuanzhi

handlers:  #\ 定义一个handlers

 - oldboy

- name: restart httpd  #\名字为restart httpd

 - mage

service: name=httpd state=restarted  #\调用ansible的service模块,重启httpd服务

对应Python结果:

###### playbook的一个简单实例:

[['apple', 'banana', 'orange'],[ 'chuanzhi', 'oldboy', 'mage']]

- hosts: test      #\主机组,在/etc/ansible/hosts定义

块映射描述:

remote_user: root    # \远端执行任务的用户

块映射就是将描述的元素序列到字典的中,格式为”key: value”,以下为YAML例子:

tasks:        #\任务

hero:

- name: install httpd      #\任务描述

  hp: 34

command: yum -y install httpd    #\调用ansible的command模块安装httpd

  sp: 8

###### 在playbook中使用变量:

  level: 4

- hosts: test      #\主机组,在/etc/ansible/hosts定义

orc:

remote_user: root    # \远端执行任务的用户

  hp: 12

vars: ##定义变量package和service

  sp: 0

- package: httpd

  level: 2

- service: httpd

对应python结果为:

tasks:    #\任务

{'hero': '{'hp': 34, 'sp': 8, 'level': 4}, 'orc': {'hp': 12, 'sp': 0, 'level': 2}}

- name: rpm -e httpd

YAML块序列与块映射是可以自由组合在一起的,他们之间可以相互嵌套,通过灵活的组合实现复杂的对象属性。例如:

command: rpm -e httpd

- hero:

- name: install {{ package }}      #\任务描述 调用变量用{{ }}引用

   hp: 34

command: yum -y install httpd      #\调用ansible的command模块安装httpd

   sp: 8

- name: install configuration file for httpd

   level: 4

copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf

- orc:

notify:

   hp:

- restart httpd

    - 12

handlers:

    - 30

- name: restart httpd

   sp: 0

service: name=httpd state=restarted

   level: 2

###### Ansible使用条件测试

对应Python结果为:

如果需要根据变量、facts或此前任务的执行结果来做为某task执行还是不执行的前提时需要用到条件测试;

[{'hero': '{'hp': 34, 'sp': 8, 'level': 4}, {'orc': {'hp': [12,30] ,'sp': 0, 'level': 2}}]

1.when语句

 

在task后添加when子句即可使用条件测试,when语句支持jinja2表达式语法,例如:

 

tasks:

 

- name: "shutdown debian system"

未完待续。。

command: /sbin/shutdown -h now

when: ansible_os_family == "Debian"

当系统为debian系统时,则关机

- hosts: test

remote_user: root

tasks:

- name: yum httpd

command: yum -y install httpd

when: ansible_fqdn == "wwww"

当test组的某台主机的主机名为wwww时,才给符合条件的主机安装httpd

###### Ansible playbook使用迭代(循环)

当有需要重复性执行的任务时,可以使用迭代机制,其使用格式为将需要迭代的内容定义为item变量引用,并通过with_item语句来指明迭代的元素列表即可,例如:

- hosts: test

remote_user: root

tasks:

- name: touch file

file: name={{ item }} state=directory  ##循环创建ietm,而item对应的值为with_items中指定的

with_items:  ##列出item索要对应的值

- file1

- file2

事实上,with_items中可以使用元素还可为hashes,例如:

- hosts: test

remote_user: root

tasks:

- name: touch file

user: name={{ item.name}} state=present groups={{ item.groups }}  ##在各个主机创建用户,以及指定用户的基本组

with_items:

- { name: 'testuser1', groups: 'nginx' }

- { name: 'testuser2', groups: 'apache' }

###### Ansible中使用Templates

本文由澳门新萄京官方网站发布于澳门新萄京官方网站,转载请注明出处:澳门新萄京官方网站:anisble使用及常用模块,自

关键词: