设为首页 收藏本站
查看: 1133|回复: 1

[经验分享] Ansible快速入门

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-6 13:24:59 | 显示全部楼层 |阅读模式
                                                背景:
在实际生产环境中,当我门手工管理十来台服务器时,工作还是轻轻松松的;但是如果公司有上百服务器或者上千台服务器呢,不可能每一台都手工配置管理。所以ansible自动化运维工具的出现就很好的解决这问题,让我门从刀耕火种时代进入自动化运维时代。

Ansible简介:
Ansible是一种agentless(基于ssh),可实现批量配置、命令执行和控制,基于Python实现的自动化运维工具。
 其特性有:
  ①模块化:通过调用相关模块,完成指定任务,且支持任何语言编写的自定义模块
  ②playbook:剧本,可根据需要一次执行完剧本中的所有任务或某些任务
  安装方式:
 yum安装,在epel源中
          extras(注意ansible用的是这个extras仓库,也是仅次于os(base)仓库常用),    yum info ansible  可以查到
             这里直接使用yum安装
     yum -y install ansible  
               
程序配置文件:
/usr/bin/ansible:命令行工具
     /usr/bin/ansible-doc                 帮助文档
  /usr/bin/ansible-playbook         剧本执行工具
  /etc/ansible/ansible.cfg             主配置文件
  /etc/ansible/hosts                     管理的主机清单
  /etc/ansible/roles                      角色存放处
/usr/share/ansible_plugins/             插件目录

ansible命令通用格式:ansible <host-pattern> [options] [-m module_name] [-a args]
       命令的使用:  Usage: ansible <host-pattern> [options]
                  常用选项:
                                         -m                     MOD_NAME   指明调用的模块
                -a                MOD_ARGS    安装模块需要执行的参数 ,这两个是最常用的。
                                 -f                               指明被管理的主机,默认是5个
基本配置:
1.SSH基于密钥方式登陆

这次配置以三台CentOS 7 主机,一台CentOS 6 主机进行
  其中A主机为管理端主机(centos6):192.168.38.119
      B主机:192.168.38.120
      C主机:192.168.38.121
      D主机:192.168.38.122
   在A主机上创建密钥对,实现对其他三台主机实现无密码访问,执行:
     ssh-keygen -t rsa -P  ''   或者直接执行 ssh-keygen 也可以
     复制密钥到其他的3台主机
     for i in 119 120 121 ;do ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.38.$i;done
     连接测试,发现可以执行命令了。说明没问题
     ssh 192.168.38.121 'ifconfig'
2.配置A管理主机的清单
     进入配置文件   

vim /etc/ansible/ansible.cfg


43 ## db-[99:101]-node.example.com
44  [websrvs]            #配置第一个websrvs服务器
45 192.168.38.120
46 192.168.38.121
47
48 [dbsrvs]               #配置第二个dbsrvs服务器
49 192.168.38.121
50 192.168.38.122              


简单测试查看配置是否生效,结果发现没问题

ansible all -m command -a "w"      
192.168.38.122 | SUCCESS | rc=0 >>
19:21:20 up  8:53,  3 users,  load average: 0.05, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.38.1     19:17    4:18   0.03s  0.03s -bash
root     pts/1    node1            19:21    0.00s  0.18s  0.01s w

192.168.38.121 | SUCCESS | rc=0 >>
19:21:20 up  8:54,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.38.1     19:16    4:23   0.02s  0.02s -bash
root     pts/1    node1            19:21    0.00s  0.18s  0.01s w

192.168.38.120 | SUCCESS | rc=0 >>
19:21:20 up  8:53,  3 users,  load average: 0.04, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.38.1     19:16    4:24   0.04s  0.04s -bash
root     pts/1    node1            19:21    0.00s  0.17s  0.01s w


ansible常用模块:
            获取模块列表:
                                命令        ansible-doc  -l
command模块:在远程(目标)主机运行命令;
        查看对应的模块-a有哪些参数可用
                        命令 ansible-doc -s command
    相关选项
               creates:一个文件名,当该文件存在,则该命令不执行
                          removes:一个文件名,当该文件不存在,则该选项不执行
              free_form:要执行的linux指令
      chdir:在执行指令之前,先切换到该目录
             executable:切换shell来执行指令,该执行路径必须是一个绝对路径
    特别注意:  要求 执行操作每个命令必须是幂等的,就是执行多次不会有危害的后果,得到效果是一样的,例如执行ifconfig命令。
    如果不幂等就加上条件creates参数让它幂等
        示例1:
    ansible 192.168.38.120 -m command -a "mkdir mydir chdir=/tmp"
    [WARNING]: Consider using file module with state=directory rather than running mkdir
                  192.168.38.120 | SUCCESS | rc=0 >>

    ansible 192.168.38.120 -m command -a "mkdir mydir chdir=/tmp creates=mydir"
                     192.168.38.120 | SUCCESS | rc=0 >>
                     skipped, since mydir exists
    在120机器上查看就发现目录/tmp/mydir 已经创建       
示例2:添加用户并赋予密码,可以使用shell,用command会报错。
    ansible websrvs -m command -a "useradd user1"
                             ansible websrvs -m shell  -a "echo magedu |passwd --stdin user1"

结论:command模块不支持管道命令(|);shell支持,想用管道就用shell

shell模块:在远程主机在shell进程下运行命令,支持shell特性,如管道等;
     相关选项:
            chdir=:执行命令前切换工作目录至指定的位置; creates=/PATH/TO/SOMEFILE_OR_DIR:如果此处给定的文件或目录存在,则  不执行命令;
             removes=/PATH/TO/SOMEFILE_OR_DIR:如果此处给定的文件或目录不存在,则不执行命令;
       意为:令此处给定的文件或目录存在时方执行命令;
            executable=/PATH/TO/SHELL:指定运行命令使用的shell解释器;
示例3:
    ansible all -m shell -a "echo "test" | passwd --stdin test1"

group模块:管理用户组模块
    相关选项:
   name:组名称
   gid:指定GID
   state:present/absent   创建/删除
   system:yes/no  系统组
示例4:创建组名name=haproxy ;system如果不给表示no 就是普通用户
                     ansible websrvs -m group -a "name=haproxy system=yes state=present"       
             删除组:ansible websrvs -m group -a "name=haproxy system=yes state=absent"
             在node2查看:[iyunv@node2 ~]# tail /etc/group

user模块:管理用户模块
    相关选项:
   由于user模块的选项众多,这里只介绍一些常用的选项:
   name:用户名
   password:为用户设置登陆密码,此密码是明文密码加密后的密码
   update_password:always/on_create
     always:只有当密码不相同时才会更新密码(默认)
     on_create:只为新用户设置密码
   shell:用户的shell设定
   groups:用户组设定
   home:指定用户的家目录
   state:present/absent
   append:yes/no
      yes:增量添加group
      no:全量变更group,只设置groups指定的group组(默认)
   remove:配合state=absent使用,删除用户的家目录->remove=yes
   expires:设置用户的过期时间,值是一个时间戳
示例5:创建用户tom 加入组是groups=haproxy  ,注意必须先有组,否则报错
    先创建组:ansible websrvs -m group -a "name=haproxy system=yes state=present"
    ansible websrvs -m user -a "name=tom groups=haproxy state=present uid=3000 shell=/bin/tsch generate_ssh_key=true"

copy模块:复制本地文件至远程主机上  
    相关选项:
            backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项: yes|no
            content:用于替代“src”,可以直接设定指定文件的值
             dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
            directory_mode:递归设定目录的权限,默认为系统默认权限
            force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
            others:所有的file模块里的选项都可以在这里使用
            src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的                内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

示例6:把test.txt文件复制到所有主机
    ansible all -m copy -a "src=test.txt dest=/tmp/ owner=daemon group=nobody mode=664"
    在 node2主机查看;ll /tmp 就可以看到 -rw-rw-r--  1 daemon nobody   16 Nov 18 11:47 test.txt

file模块:设置文件属性
    相关选项:
          force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选                  项:yes|no
   group:定义文件/目录的属组
   mode:定义文件/目录的权限
   owner:定义文件/目录的属主
   path:必选项,定义文件/目录的路径
   recurse:递归设置文件的属性,只对目录有效
   src:被链接的源文件路径,只应用于state=link的情况
   dest:被链接到的路径,只应用于state=link的情况
   state:
         directory:如果目录不存在,就创建目录
          file:即使文件不存在,也不会被创建
          link:创建软链接
          hard:创建硬链接
          touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
         absent:删除目录、文件或者取消链接文件
    注意:state属性的可用值
             file,directory,link,hard(硬链接),touch(创建空文件),absent(删除)
示例6:
    ansible all -m file -a "path=/tmp/hidir state=directory"
    ansible all -m file -a "path=/tmp/hidir state=directory owner=nobody mode=770"
    删除:ansible all -m file -a "path=/tmp/hidir state=absent"   

get_url模块: Downloads files from HTTP, HTTPS, or FTP to node
    从网页上下载链接url到主机指明的地方
    相关选项:
             *url=
             *dest=
               sha256sum=
               owner, group, mode
示例7:把这网页https://redis.io/download 的url下载到所有的主机目录是tmp下
            ansible all -m get_url -a "url=https://redis.io/download dest=/tmp"
                                 


git模块:Deploy software (or files) from git checkouts
        可以克隆特别好用的工具,直接拖到本地
    相关选项:
           clone=
                            repo=
            dest=
            version=
示例7:直接把源码克隆到本地,注意的先安装git
             git clone https://github.com/happyfish100/fastdfs.git
     ansible websrvs -m git  -a "repo= https://github.com/happyfish100/fastdfs.git dest=/tmp/fastdfs"

cron模块:计划任务的实现
    相关选项:
   minute=/hour=/day=/month=/weekday= 某个值不写,默认就是*
   name:必选项,任务描述信息
   job:执行的任务,要加引号
   state:present(创建)/absent(删除)
示例8:创建计划任务,同步时间
     创建:ansible all -m cron -a "name='timesync' job='/usr/sbin/ntpdate 172.18.0.1 &> /dev/null' minute='*/5'"
    删除: ansible all -m cron -a "name='timesync' job='/usr/sbin/ntpdate 172.18.0.1 &> /dev/null' minute='*/5' state=absent"
     ansible all -m cron -a "name='timesync' job='/usr/sbin/ntpdate 172.18.0.1 &> /dev/null' minute='*/5' state='present' disabled='false/(true)'"       

yum模块:Manages packages with the `yum' package manager
    相关选项:               
        name=:程序包名称,可以带版本号;
                 state=  安装状态
                         present, latest, installed (安装)
                         absent, removed (卸载)
示例9:yum 安装nginx  状态是最新的state=latest
               ansible websrvs -m yum -a "name=nginx state=latest"
               查看安装完成的命令:ansible websrvs -a “rpm -q nginx”

service模块:管理服务   注意这服务很重要
    相关选项:
   name:服务名称
   state:started/stopped/restarted
   enabled:true(开机启动)/false(关闭)
   runlevel:运行级别                          
示例10:启动nginx服务  
    ansible websrvs -m service -a "name=nginx enabled=true state=started"

其它的包管理工具:apt(debian), zypper(suse), dnf(fedora), rpm, dpkg,mpm,pip ...
     注意: pip 、npm、yum 都是用来实现安装管理功能的组件

Playbook:YAML格式,任务(task)
    playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂      等的,这意味着多次执行是安全的,因为其结果均一致;
      核心元素:hosts,tasks,variables,templates,handlers和roles(包含以上四个元素于一体的角色集合)

    基本数据结构:
            标量、数组、关联数组
            维基百科 :https://zh.wikipedia.org/wiki/YAML
                               
    Playbook的核心元素:
            Hosts:主机
            Tasks:任务列表
            Variables  #变量
            Templates:包含了模板语法的文本文件;模板
            Handlers:由特定条件触发的任务;  处理器
                     Roles
        
     playbook的基础组件:
            Hosts:运行指定任务的目标主机;
            remoute_user: 在远程主机上执行任务的用户;
            sudo_user:
            tasks:任务列表
             模块,模块参数;
定义任务的2种格式:
                    (1) action: module arguments
                    (2) module: arguments  模块、参数
注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;
                                    (1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
                    (2) 任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

例子11: 做个计划任务,安装nginx、redis
        vim nginx.yaml                           
             - hosts: websrvs
               remote_user: root   #远程主机可以是可以普通用户用sudo 运行
              tasks:
             - name: install nginx package
                        yum: name=nginx state=latest
            - name: start nginx service   
                     service: name=nginx enabled=true state=started #启动服务的命令

           - hosts:dbsrvs
                     remote_user: root
                 tasks:
           - name: install redis package
                      yum: name=redis state=latest
           - name: install conf file  
                    copy: src=/root/redis.cnf dest=/etc/redis.conf owner=redis group=root mode=644
                     tags: instconf
           - name: start redis service
                    service: name=redis state=started
查看:有两处主机
    ansible-playbook --list-hosts nginx.yaml      
        playbook: nginx.yaml
                         play #1 (websrvs): websrvs    TAGS: []
                          pattern: [u'websrvs']
                                   hosts (2):
                                    192.168.38.120
                                    192.168.38.121

                        play #2 (dbsrvs): dbsrvs      TAGS: []
                                    pattern: [u'dbsrvs']
                                    hosts (2):
                                        192.168.38.121
                                        192.168.38.122
   

列出任务:
         ansible-playbook --list-tasks  nginx.yaml
                playbook: nginx.yaml
                                         play #1 (websrvs): websrvs    TAGS: []
                                            tasks:
                                            install nginx package     TAGS: []
                                            start nginx service       TAGS: []

                                play #2 (dbsrvs): dbsrvs      TAGS: []
                                            tasks:
                                                install redis package     TAGS: []
                                                             install conf file TAGS: []
                                                    start redis service       TAGS: []

       
    语法检查:ansible-playbook --syntax-check nginx.yaml
             测试有没有报错(试运行): ansible-playbook -C nginx.yaml
             没问题就运行:ansible-playbook nginx.yaml

运行playbook的方式:
         查看帮助:ansible-playbook -h
                            (1) 测试
                   ansible-playbook  --check
                        只检测可能会发生的改变,但不真正执行操作;
                    ansible-playbook  --list-hosts
                        列出运行任务的主机;
                    ansible-playbook  --list-tasks
                        列出要运行的任务列表
                    ansible-playbook --syntax-check
                        语法检查
                (2) 运行:ansible-playbook


                                       


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421322-1-1.html 上篇帖子: 配置文件ansible.cfg中Become (Privilege Escalation) 下篇帖子: 如何利用ansible callback插件对执行结果进行解析
累计签到:2 天
连续签到:2 天
发表于 2017-12-19 10:36:53 | 显示全部楼层
看了一圈,没看懂讲些什么。看来是落后了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表