快捷搜索:

您的位置:澳门新葡4473网站 > 热门贴子 > anisble使用及常用模块

anisble使用及常用模块

发布时间:2019-10-17 04:13编辑:热门贴子浏览(177)

    一、简介

    ###### Ansible总结

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

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

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

        OS Provisioning:

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

            物理机:PXE、Cobbler

    二、特性

            虚拟机:Image、Templates

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

        Configuration:

    支持Linux/UNIX及windows环境

            puppet工具(ruby开发)

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

            Saltstack(python开发)

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

            chef

    三、总体架构

        Command and Concrol:

     

            fabric

    图片 1

        预发布环境验证:

    四、执行过程

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

    图片 2

        程序发布:

    五、Ansible 与 SaltStack对比

            不能影响用户体验;

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

            系统不能停机;

    Ansible在github上地址:

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

     

        灰度发布:

    Ansible安装部署与配置

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

           角色              主机名                  IP                                组名             

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

           控制端           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时表示删除用户;

    图片 3

                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;

    图片 4

    组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;

    图片 5

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

     

    minute:分钟;

     

    job:要进行的操作;

    测试主机免密 连通性:

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

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

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

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

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

    图片 6

    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

    图片 7

    #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"

    列表: 也叫做序列

    图片 8

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

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

    - apple

    例:

    - orange

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

    - mango

     

    字典:

    图片 9

    字典通过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放置与{}中表示,例如:

    图片 10

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

     

    ###### Ansible基础元素

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

    1.变量

    图片 11

    1.1 变量命名

     

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

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

    1.2 facts

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

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

    执行之后    

    #ansible hostname -m setup

    图片 12

    1.3 register

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

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

    图片 13

    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]

     图片 14

    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]

    图片 15

    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参数

    图片 16

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

    卸载

    > ansible_ssh_host

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

    > ansible_ssh_port

    图片 17

    > 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

    图片 18

    > 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组成结构:

    图片 19

    Inventory

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

    Modules

    图片 20

    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:

    图片 21

    - name:test connection

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

    ping:

    图片 22

    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后重新执行一次即可;

    图片 23

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

     

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

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

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

    图片 24

    tasks:

     

    - name:make sure apache is running

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

    service:name=httpd state=running

    图片 25

    在众多模块中,只有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

    本文由澳门新葡4473网站发布于热门贴子,转载请注明出处:anisble使用及常用模块

    关键词: