www.350.vipanisble使用及常用模块,自动化运行工具Ansible

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

– name:run this command and ignore the result

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

ntp_server-ntp_mageedu.com

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

2.Inventory

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

字典:

各主机SSH互信

[webservers]

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

组id为111;

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

> ansible_ssh_pricate_key_file

www.350.vip 1

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

yum 安装:

> ansible_ssh_pass

例:

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

orc:

=hard:创建硬链接

  command: /sbin/reboot -t now

command: yum -y install httpd

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

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

– orange

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

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

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

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

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

换163的源

job:developer

 

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

例:

– name: yum httpd

 

tasks:

二、特性

    user模块:

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

– orange

 

apache

    – 12

httpd2.mageedu.com

    “stdout”: “123rn”,

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

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

    Command and Concrol:

    returned: success

tasks:

[root@hd02 ~]#

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

       被控端           hd03                    
192.168.1.13                 webservers   

Ad Hoc Commands

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

[webservers:vars]

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

tasks:    #\任务

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

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

 yum clean all

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

 

command: /sbin/shutdown -h now

www.350.vip 2

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

关于定义主机与组

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

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

Roles:角色

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

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

www.350.vip 3

– name:disable selinux

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

Templates:模板

– banana

tasks:

   sp: 8

playbook组成结构:

  level: 4

###### ansible常用模块

 

– apple

www.350.vip 4

    Configuration:

例:

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

#Ansible: check passwd md5value

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

    data: crash

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

www.350.vip 5

> ansible_sudo_pass

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

max_clients:256

www.350.vip 6

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

例:

vars:

 

file模块:

– { name: ‘testuser1’, groups: ‘nginx’ }

 

gender:male

192.168.1.100               #IP

handlers:  #\ 定义一个handlers

# ansible webservers -m ping

1.5 通过roles传递变量

测试主机免密 连通性:

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

[atlanta:vars]

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

   sp: 0

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

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

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

 

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

结果:

2.5 Inventory参数

print(obj)

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

 

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

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

command: rpm -e httpd

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

        puppet工具(ruby开发)

    “rc”: 0,

[webservers]    ##被控组组名

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

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

对应python结果为:

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

    OS Provisioning:

-m command是默认模块  可省略

hosts和remote_user:

 – chuanzhi

– name: install httpd  #\任务描述

Ansible安装

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

RETURN VALUES:

    程序发布:

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

[apache]

“””

remote_user: root

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

1.变量

[root@hd02 ~]# crontab -l

gender:female

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

> ansible_shell_type

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

group模块:

  sp: 0

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

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

– hosts:webservers

[atlanta]

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

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

    主机清单:/etc/ansible/hosts

ansible webservers -m ping -u ansible -sudo

nginx

远程Linux主机sysctl配置。

vars: ##定义变量package和service

192.168.1.110               #IP

– common

yum -y install ansible

when: ansible_os_family == “Debian”

 

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

获取webservers组中主机uptime信息

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

定义Host Inventory

command:/sbin/setenforce 0

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

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

    ]

age:41

 

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

# force:

#playbook的核心元素:

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

1.when语句

www.350.vip 7

[databases]

– file2

 

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

www.350.vip 8

Tasks:任务

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

remote_user: root

 

ping模块:

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

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

  hp: 12

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

定义主机变量

age:14

[atlanta]

remote_user:mageedu

 

–  name:jimmy smith

重启webservers组所有Apache服务

    ## yum -y install ansible

– ping:

name:john smith

将公钥传给webservers组中的主机

1、可读性好

例: 

roles:

    “stdout”: “123rn”,

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

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

notify:

对应Python结果为:

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

    “stderr”: “Shared connection to 192.168.1.12 closed.rn”,

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

www.350.vip 9

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

www.350.vip , hero:

=link:创建软链接

 

nginx2.mageedu.com

www.350.vip 10

– shell:/usr/bin/foo

       被控端           hd02                    
192.168.1.12                 webservers   

– name:restart apache

OK

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

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

2.4 组嵌套

Ansible 常用模块学习

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

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

name:example developer

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

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

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

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

www.350.vip 11

示例:ansible test -m setup

[webservers]                #组名

– name: touch file

alpha.example.org    #域名对应192.168.1.100     

[webservers]

 – apple

    支持自定义模块:

 

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

 

Modules

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

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

    – 30

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

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

shell模块:

        “123”

###### ansible密钥登陆

www.350.vip 12

    灰度发布:

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

age:37

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

setup模块:

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

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

[root@hd01 ~]# ansible –version

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

# Example from an Ansible Playbook

###### Ansible基础元素

import yaml

[nginx]

 

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

– apple

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

 – orange

Variables:变量

一直回车就OK

ansible test -m cron -a ‘name=”wuyongfeng crontab list” state=absent’

ntp_server=ntp. atlanta.example.com

disable_gpg_check:关闭gpg_check

四、执行过程

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

Ansible在github上地址:

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

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

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

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

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

  level: 2

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

– name: reboot the service

www2.mageedu.com

  sp: 8

mode:文件权限

yum clean all

        物理机:PXE、Cobbler

 

1.4 通过命令行传递变量

    “stdout_lines”: [

src:源路径

)

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

host2 http_port=303 maxRequestsPerChild=909

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

    “stdout_lines”: [

remote_user:root

例:

– hosts:webservers

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

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

www.350.vip 13

    主从模式:

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

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

支持Linux/UNIX及windows环境

    支持playbook:

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

tasks:

www.350.vip 14

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

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

– hosts:webservers

– orc:

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

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

> ansible_connection

块序列描述

– hosts: test

匹配目标

Handlers:处理器

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

service: name=httpd state=restarted

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

    部署简单:agentless类工具

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

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

 

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

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

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

可获得模块的帮助信息

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

www.[01:50].example.com

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

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

######  ansible安装

   level: 4

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

Ansible安装部署与配置

– file1

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

nginx1.mageedu.com

然后输入密码 操作

        Saltstack(python开发)

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

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

  executable location = /usr/bin/ansible

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

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

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

wget      

– { name: ‘testuser2’, groups: ‘apache’ }

    description: value provided with the data parameter

        不能影响用户体验;

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

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

[webservers]

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注