ansible基础模块及playbook简单示例讲解

  ansible自动化运维工具的介绍


       ansible结构特性:     

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

            基于Python语言实现,由Paramiko、PyYAML和Jinja2三个关键模块;

            部署简单,agentless

            主从模式

            支持自定义模块

            支持Playbook

            幂等性:不会重复执已经完成的任务

      配置文件:

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

             /etc/ansible/hosts:主机清单(用于主机分组取名,定义变量)

       简单应用:

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

            ansible <host-patter> [-f forks] [-m module_name] [-a args]

                     -m module:默认为command

            snaible-doc:show Ansible module documentation

                    -l,--list    List available modules

                    -s,--snippet   show playbook snippet for specified module(s)

                    

       基本组件:

             Host inventory存放被管理的节点地址信息,支持分类存放

             Core Modules:存放各种功能实现的模块

                      例如:调用实现用户管理的模块,并指名Host文件中的哪个主机 

             Custom Modules:自定义模块

             Connection Plugins:真正实现与节点通信的连接插件

             Playbook:将一个主机要完成的多个任务使用YAML格式写到此文件中,多次调用   

      ansible的特性:

             基于Python语言实现,由Paramiko,PyYAML和Jinjia2三个关键模块;

             部署简单:agentless

             主从模式:

                    master:ansible,ssh client

                    slave:ssh server

             支持自定义模块:支持各种编程语言

             支持Playbook

             基于“模块”完成各种任务

        如何查看模块帮助:

              ansible-doc -l

              ansible-doc -s MODULE_NAME

              示例:ansible-doc -s cron


下面我们通过具体示例来讲解:

ansible是通过ssh协议与远程主机进行通信,所以它对远程主机的管理可以基于ssh工具,我们在进行实验之前可以将安装ansible工具的服务器与被管理的服务器之间进行密钥的交换,这样ansible在对远程主机进行管理的时候就不要再验证用户名跟密码,当然我们也可以在ansible的host配置文件中定义主机名跟密码。


首先在管理端生成密钥并与被管理的主机进行密钥交换:

ssh-keygen -t rsa -P ''

ssh-copy-id   -i   ~/.ssh/id_rsa.pub [email protected]

ssh-copy-id   -i   ~/.ssh/id_rsa.pub [email protected]

ssh-copy-id   -i   ~/.ssh/id_rsa.pub [email protected]

进行测试

ssh 192.168.153.9 'ifconfig'


cd /etc/ansible/

在hosts文件中定义要管理的主机,在配置文件中我们可以使用组来定义主机

[webservs]

192.168.153.8

192.168.153.9

[dbservs]

192.168.153.10


ansible命令应用基础:

       语法:ansible <host-pattern> [-f forks] [-m module_name] [-a args]

                 -f forks:启动的并发线程数

                 -m module_name:要使用的模块;

                 -a args:模块特有的参数;

       常见模块:

                 command:命令模块,默认模块,用于在远程执行命令

                           ansible all -a 'date'            //在所有主机上date命令

                 cron:

                       -a 'name= minute= hour= day= month= weekday= job= user= state={present|absen}'  

                        present:安装

                        absent:移除

                        ansible webservs -m cron -a 'minute="*/1" job="/bin/echo test" name="test cron job"'       //创建一个任务调度,每分钟执行一次echo test.默认使用root用户运行

                        ansible 192.168.153.8 -m cron -a 'minute="*/1" job="/bin/echo test" name="test cron job" state=absent’ //删除上面创建的任务调度

                        ansible all -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate 192.169.153.1 &> /dev/null"' //创建一个任务调度,每10分钟到ntp服务器上面进行时间同步

                 user:

                        -a 'name= state={present|absent} system={yes|no} uid='

                        ansible all -m user -a 'name="user1"'     //使用user模块创建user1用户

                        ansible all -m user -a 'name="user1" state=absent'     //删除user1用户

                 group:  

                         -a 'name= gid= state= system='

                        ansible  all -m group -a 'name="mysql" gid="1111"'   //常见mysql组,组ID为1111

                        ansible all -m user -a 'name=mysql uid=333 system=yes group=mysql'    //创建mysql用户为系统用户,用户ID为333,所属组为mysql

                copy:

                        -a 'dest= src= mode= owner= group='

                        src=定义本地源文件路径

                        dest=定义远程目标文件路径

                        content=”直接生成文件内容“

                        ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=640'     //复制本地/etc/目录下的fstab文件到全部主机的/tmp目录下保存为fstab.ansible,属主为root,权限为640

                        ansible all -m copy -a 'content="Hello Ansible\nHi MageEdu" dest=/tmp/test.ansible'      //将conetnt引号中的话保存到指定主机/tmp目录下,文件名为test.ansible       

               file:设置文件属性

                    -a 'path= mode= owner= group= state={directory|link|present|absent} src='

                   path=指定文件路径,可以使用name或dest来替换;

                   创建文件的符号链接:

                        src=指明源文件

                        path=指明符号链接文件路径

                   ansible all -m file -a 'owner=mysql group=mysql mode=644 path=/tmp/fstab.ansible'     //将全部主机的/tmp目录下的fstab.ansible文件的属主数组设置为mysql,权限为640

                  ansible all -m file -a 'path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'                   //将全部主机的/tmp目录下的fstab.ansible文件创建一个名为fstab.link的链接文件,并保存在当前目录下

             ping:

                  ansible all -m ping     //测试指定主机是否能ping同

             service:指定运行状态;

                  -a 'name= state={started|stopped|restarted} enabled='    

                  enabled=是否开机自动启动,取值为true或者false;

                  name=服务名称

                  state=状态,取值有started,stopped,restarted;

                  ansible webservs -m service -a 'enabled=true name=httpd state=started'      //启动webservs组中的主机的httpd服务并设置开机自启

                  ansible webservs -a 'systemctl status httpd'                                                        //查看在webservs组中的主机httpd服务的运行状态

            shell:在远程主机上运行命令,尤其是用到管道等功能的复杂命令;

                   ansible all  -m shell -a 'echo test123 | passwd --stdin user1'                         //为user1用户设置密码为test123

            script:将本地脚本复制到远程主机并运行,调用时使用相对路径

                   ansible all -m script -a 'test.ansible'

            yum:安装程序包,安装程序包之前须先将yum配置号

                     -a 'name= state={started|stopped|restarted} '    

                     ansible all -m yum -a 'name=zsh'        //安装zsh程序包

                     ansible all -m yum -a 'name=zsh state=absent'   //卸载zsh程序包

                                            

            setup:收集远程主机的facts

                     每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息,如操作系统版本、IP地址等报告给远程ansible主机;         

                     ansible all -m setup      //查看全部主机的相关信息


playbook基本示例:


playbook的组成结构

Inventory        //表示要应用在那些主机上进行操作

Modules         //调用哪些模块,做出什么样的操作

Ad Hoc Commands       //运行那些命令

Playbooks           

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

    Variables                  //变量

    Templates               //模板

    Handlers                //处理器,再某条件满足时执行的操作

    Roles                      //角色

基本结构

            - host:webservs

               remote_user:

               tasks:        

                    - task1

                        module_name:module_args

                    -task2

            -host:dbsrvs        

     

ansible的基本语法规则如下。


• 大小写敏感

• 使用缩进表示层级关系

• 缩进时不允许使用Tab键,只允许使用空格。

• 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可


示例1:

以root身份运行命令,在webservs组的主机中创建nginx用户及nginx组

复制本地/etc/目录下inittab文件到dbservs组的主机的/tmp目录下并命名为inittab.ansible 

- hosts: webservs

  remote_user: root

  tasks:

  - name: creat nginx group

    group: name=nginx system=yes gid=203

  - name: create nginx user

    user: name=nginx uid=203 group=nginx system=yes

- hosts: dbservs

  remote_user: root

  tasks:

   - name: copy file to dbservs

     copy: src=/etc/inittab dest=/tmp/inittab.ansible


示例2:

以root身份运行,在webservs组中的主机上安装httpd服务,并设置开机自启,复制本地/etc/httpd/conf下的httpd.conf配置文件到组中主机的/etc/httpd/conf/目录下充当配置文件

- hosts: webservs

  remote_user: root

  tasks:

  - name: install httpd package

     yum: name=httpd state=latest

  - name: install configuration file for httpd

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

  - name: start httpd service

     service: enabled=true name=httpd state=started


示例3:更改配置文件之后,使用handers重新启动服务

- hosts: webservs

  remote_user: root

  tasks:

  - name: install httpd package

    yum: name=httpd state=latest

  - name: install configuration file for httpd

    copy: src=/root/httpd.moban dest=/etc/httpd/conf/httpd.conf

    notify:

    - restart httpd

  - name: start httpd service

    service: enabled=true name=httpd state=started

  handlers:

  - name: restart httpd

    service: name=httpd state=restarted

                                     

示例4:使用变量定义

- hosts: webservs

  remote_user: root

  vars:

  - package: httpd        //将httpd程序包赋值给package字段并调用

  - service: httpd          //将httpd服务赋值给service字段并调用

  tasks:

  - name: install httpd package

    yum: name={{ package }} state=latest          //yum模块调用package字段

  - name: install configuration file for httpd

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

    notify:

    - restart httpd

  - name: start httpd service

    service: enabled=true name={{ service }} state=started     //service模块调用service字段

  handlers:

  - name: restart httpd

    service: name=httpd state=restarte


示例5:变量的直接调用

调用ansible_default_ipv4变量,将变量输出的值保存到werservs组中主机的/tmp目录下,文件名为vars.ansible

- hosts: webservs

  remote_user: root

  tasks:

  - name: copy file

    copy: content="{{ ansible_default_ipv4 }}"  dest=/tmp/vars.ansible     


示例6:主机变量的定义

在hosts文件中直接定义主机变量并引用

编辑hosts文件

[webservs]

192.168.153.8 testvar="100.7"

192.168.153.9 testvar="100.8"

[dbservs]

192.168.153.10 testvar="100.10"

yml文件

- hosts: all

   remote_user: root

   task:

   - name: copy file

      copy: content="{{ ansible_default_ipv4 }},{{ testvar  }}"  dest=/tmp/var.ansible


示例7:模板的使用

将变量定义在hosts文件中,然后再httpd的配置文件中直接调用系统变量或者是hosts文件中定义的变量


编辑配置文件并保存为httpd.moban名称的文件

Listen {{ http_port }}    //端口号调用httpd_port变量

ServerName {{ ansible_fqdn }}  //主机名直接调用系统变量


在hosts文件中定义httpd_port变量

[webservs]

192.168.153.8 http_port=80

192.168.153.9 http_port=8080


yml文件

- hosts: webservs

  remote_user: root

  vars:

  - package: httpd

  - service: httpd

  tasks:

  - name: install httpd package

    yum: name={{ package }} state=latest

  - name: install configuration file for httpd

    template: src=/root/httpd.moban dest=/etc/httpd/conf/httpd.conf       //调用模板文件,这样模板中使用变量的字段会做响应的替换

    tags:

    - conf

    notify:

    - restart httpd

  - name: start httpd service

    service: enabled=true name={{ service }} state=started

  handlers:

  - name: restart httpd

    service: name=httpd state=restarted







猜你喜欢

转载自blog.51cto.com/11970509/2348287
今日推荐