天天看点

Ansible基础简介与使用Ansible基础简介与使用

Ansible基础简介与使用

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

    ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible优点:
    Agentless(去中心化)
    Stupied Simple (上手简单,学习曲线平滑)
    SSH by default (安全,无需安装客户端)
    YAML no code,定制剧本 (语法简单,维护方便)

Ansible使用场景:
(1)文件传输:
        mv cp scp rsync
(2)命令执行:
        剩下的其它命令
        安装http服务:
            安装
            配置
            启动服务(本机的服务启动) tasks
            让服务对用户提供服务(路由器配置,iptables)

Ansible企业实际应用场景分析:
(1)Dev开发环境
    使用者:程序员
    功能:程序员开发软件测试BUG的环境
    管理者:千万不能是运维,一定是要程序员自已
(2)测试环境
    使用者:qa测试工程师
    功能:测试经过Dev环境测试通过的软件的功能
    管理者:运维
    备注:测试环境往往有多套(测试环境满足测试功能即可,不宜过多)
    (2.1)测试同学希望测试环境有多套
        公司的产品多产品线并发,即多个版本,意味着多个版本同步测试
    (2.2)通常情况下,测试环境有多少套和产品线数量保持一样
(3)发布环境(代码发布机,有些公司堡垒机(安全屏障))
    使用者:运维
    功能:发布代码至生产环境
    管理者:运维(有经验的)
    发布机:往往需要有2台(主备)
(4)生产环境
    使用者:运维,只能是运维(极少数情况下会开放权限给核心开发人员,极少数公司将该 环境权限完全开放给开发人员并让开发人员维护)
    功能:对用户提供公司产品的服务
    管理者:只能是运维
    生产环境服务器数量:一般比较多,且应用非常重要。往往需要自动工具协助部署配置应用。机器数量具体和公司业务规模相关。
(5)灰度环境(生产环境的一部分)
    使用者:运维
    功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境
    案例:
        大家手头100台服务器,先发布其中的10台服务器,这10台服务器就是灰度服务器。
    管理者:只能是运维
    灰度环境:往往该版本功能变更较大,为保险起见特意先让一部分用户优化体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器。

Ansible核心组件:
    ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件;
    INVENTORY:Ansible管理主机的清单;/etc/ansible/hosts
    MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义; (ansible-doc -l获取Ansible的所有模块列表)
    PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。
    API:供第三方程序调用的应用程序编程接口;
    ANSIBLE:该部分图中表示的不明显,组合INVENTORY、API、MODULES、PLUGINS的绿框大家可以理解为是ansible命令工具,其为核心执行工具;

Ansible命令集
    /usr/bin/ansible   # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
    /usr/bin/ansible-doc  # Ansible 模块功能查看工具
    /usr/bin/ansible-galaxy  # 下载/上传优秀代码或Roles模块的官网平台,基于网络的
    /usr/bin/ansible-playbook  # Ansible 定制自动化的任务集编排工具
    /usr/bin/ansible-pull  # Ansible远程执行命令的工具(使用较少,海量机器时使用,对运维的架构能力要求较高)
    /usr/bin/ansible-vault  # Ansible 文件加密工具
    /usr/bin/ansible-console  # Ansible基于Linux Consoble界面可与用户交互的命令执行工具
           

ansible命令详解:Usage: ansible [options]

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS
     module arguments  # 指定Ansible调用的模块的参数
  --ask-become-pass    
     ask for privilege escalation password # Ansible su切换用户的时候使用该参数输入密码
  -k, --ask-pass      
     ask for SSH password  # 以密码认证
  --ask-su-pass        
      ask for su password (deprecated, use become) # su的时候使用该 参数
  -K, --ask-sudo-pass  
      ask for sudo password (deprecated, use become) # sudo的时候
  --ask-vault-pass    
      ask for vault password # ansible-valut 加密文件
  -B SECONDS, --background=SECONDS
      run asynchronously, failing after X seconds (default=N/A) # 后台等待X秒
  -b, --become        
       run operations with become (nopasswd implied)
  --become-method=BECOME_METHOD
    privilege escalation method to use (default=sudo),
valid choices: [ sudo | su | pbrun | pfexec | runas ]
  --become-user=BECOME_USER
     run operations as this user (default=None)  # su到哪个用户
  -C, --check         
   # 不执行命令只做命令执行检查
  -c CONNECTION, --connection=CONNECTION
      connection type to use (default=smart)
  -e EXTRA_VARS, --extra-vars=EXTRA_VARS  # 调用外部变量
     set additional variables as key=value or YAML/JSON
  -f FORKS, --forks=FORKS  # Ansible一次命令执行并发的线程数
  -h, --help          
     show this help message and exit
  -i INVENTORY, --inventory-file=INVENTORY 
   # Ansible调用的Hosts文件,默认/etc/ansible/hosts
  -l SUBSET, --limit=SUBSET  # 限定主机列表中的某台机器执行
     further limit selected hosts to an additional pattern
  --list-hosts         
     outputs a list of matching hosts; does not execute anything else  ## 列出主机列表中的主机
  -m MODULE_NAME, --module-name=MODULE_NAME 
     # Ansible 调用的执行模块
  -M MODULE_PATH, --module-path=MODULE_PATH
    specify path(s) to module library (default=None)
  -o, --one-line        condense output
  -P POLL_INTERVAL, --poll=POLL_INTERVAL
    set the poll interval if using -B (default=15)
  --private-key=PRIVATE_KEY_FILE
    use this file to authenticate the connection
  -S, --su             
      run operations with su (deprecated, use become) #使用su和become结合使用
  -R SU_USER, --su-user=SU_USER  # su的话切换至哪个用户
     run operations with su as this user (default=root)
  -s, --sudo          
     run operations with sudo (nopasswd) (deprecated, use become)  # 执行sudo命令
  -U SUDO_USER, --sudo-user=SUDO_USER  # sudo 
      desired sudo user (default=root) (deprecated, use become)
  -T TIMEOUT, --timeout=TIMEOUT  # 执行命令的超时时间
      override the SSH timeout in seconds (default=10)
  -t TREE, --tree=TREE  log output to this directory
  -u REMOTE_USER, --user=REMOTE_USER
    connect as this user (default=root)
  --vault-password-file=VAULT_PASSWORD_FILE  
      ## ansible-vault加密的密码文件
   -v, --verbose        
      verbose mode (-vvv for more, -vvvv to enable connection debugging)  # 显示详细信息 -vvvv
  --version          
    show program's version number and exit ## 显示版本号


安装与认证:
可以通过Github获取ansible源码安装,这里使用yum安装
           
]# Yum install –y ansible
Ansible是通过ssh进行认证后管理的,需要为管理主机添加认证,
在ansible管理主机上执行一下指令:
]# ssh-keygen #生成公钥与私钥
在/etc/ansible/hosts内添加需要管理的主机IP或FQDN,一般情况ansible管理的都是内网主机,建议使用IP,如下:
[web] #IP组的组名
.
.
.
]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]或
]# ssh-copy-id [email protected]
为每个被管理主机添加认证,
           

使用ansible web –m ping 测试一下:

Ansible基础简介与使用Ansible基础简介与使用
Ansible-->/etc/ansible/hosts内的webIP,/etc/ansible/ansible.cfg的配置-->加载模块文件,将对应的模块命令生成对应的py临时文件,并将该文件传输至远程服务器的对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件,执行并返回结果,删除py临时文件,退出。

ansible-galaxy
用法:
           
去 https://galaxy.ansible.com/ 上传或下载优秀的Playbook(roles)
列出所有已安装的galaxy
ansible-galaxy list
安装galaxy
ansible-galaxy install geerlingguy.redis
删除galaxy
ansible-galaxy remove geerlingguy.redis
Ansible基础操作:
常用模块详解:模块可用参数,使用ansible-doc+模块名 查看,这里不赘述 
Command:命令模块,也是默认使用的模块,不支持变量与“<、>、|、;、&、”等符号,如需使用可使用shell模块。

Shell:
           
Ansible基础简介与使用Ansible基础简介与使用
Copy:
    ansible web -m copy -a 'src=/root/mbr dest=/tmp' #拷贝/root/mbr到webIP组成员的/tmp目录下
    ansible web -a 'ls -l /tmp/mbr' #显示各被管理的mbr文件长格式信息
    ansible web -a 'rm /tmp/mbr -rf' #删除各被管理的mbr文件

Cron:
    ansible web  -a 'crontab -l' #查看cron计划任务
    ansible web -m cron -a 'name=update minute=30 hour=5 job="ntpdate 172.16.0.1"' #添加计划任务update:每天5:30请求172.16.0.1更新时间
    ansible web -m cron -a 'name=update state=absent' #删除name为update的计划任务

Fetch:拷贝被管理主机文件到管理主机
    ansible web -m fetch -a 'src=/etc/fstab dest=/tmp' #拷贝被管理主机的/etc/fstab文件到管理主机的/tmp下,
**注意:文件在管理主机的绝对路径为:/tmp/被管理主机IP/etc/fstab,**

File:
    ansible web -m file -a 'path=/tmp/tmpdir state=directory' #建立/tmp/tmpdir目录
    ansible web -m file -a 'path=/tmp/a.sh state=file owner=root mode=700' #设置/tmp/a.sh文件,root属主,700权限 
    ansible web -m file -a 'src=/tmp/a.sh path=/tmp/a.sh.link state=link' #新建/tmp/a.sh软链接文件/tmp/a.sh.link

Hostname:
ansible web -m hostname -a 'name=webhost' # 设置主机名

Yum:
ansible web -m yum -a 'name=lrzsz state=latest' # 重新安装lrzsz包,
ansible web -m yum -a 'name=nginx state=present' #安装nginx包
Service:
ansible web -m service -a 'name=nginx state=started' #启动nginx服务
ansible web -m service -a 'name=nginx state=stoped' #停止nginx服务
ansible web -m service -a 'name=nginx state=reloaded' #重载nginx配置

User:
ansible web -m user -a 'name=test comment="test ansible" uid=1666' 
#新建用户test,注释信息test ansible,uid为1666

Group:
ansible web -m group -a 'name=ansible gid=1888' #新建ansible组id为1888

Script:
ansible web -m script -a 'hello.sh' #在各被管理主机执行hello.sh脚本
ansible web -m script -a 'hello.sh creates=/tmp/testscript' 
#如果/tmp/testscript存在,则不执行hello.sh脚本
ansible web -m script -a 'hello.sh removes=/tmp/testscript'  
#如果/tmp/testscript存在,则执行hello.sh脚本

Ping:
ansible web -m ping #测试web组内主机连通性

**Ansible-playbook操作:**
YAML语法简介:
1、  首先以“---”(3个减号)开始,且需顶行首写。
2、  次行开始正常写Playbook的内容,但笔者一般建议写明该
Playbook的功能。
3、  使用#号注释代码。
4、  缩进必须是统一的,不能空格和tab混用。
5、  缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的。
6、  YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写,K/V的值均需大小写敏感
7、  k/v的值可同行写也可换行写。同行使用:分隔,换行写需要以-分隔。
8、  一个name只能包括一个task。

Ansible-playbook用法 
    Usage: ansible-playbook playbook.yml
Playbook 核心组件
   Hosts  #执行的远程主机列表
   Tasks  #任务集
   Varniables #内置变量或自定义变量在playbook中调用
   Templates #模板,可替换模板文件中的变量及可实现一些简单逻辑的文件。
   Handlers #和nogity结合使用,为条件触发操作,满足条件方才执行,否则不执行

执行状态:
    绿色: 执行成功并且不需要做改变的操作
    黄色:执行成功并且对目标主机做变更
    红色:执行失败
           

示例:1

在/etc/ansible/目录下编写test1.yml,如下:

---
- hosts: web
  remote_user: root
  tasks: 
  - name: add group nginx
    group: name=nginx state=present
  - name: add user nginx
    user: name=nginx state=present group=nginx
  - name: install nginx
    yum: name=nginx state=present
  - name: start nginx
    service: name=nginx state=started
           
Ansible基础简介与使用Ansible基础简介与使用

在/etc/ansible/目录下编写test2.yml,如下:

---
- name: web
  remote_user: root
  tasks:
  - name: remove nginx
    yum: name=nginx state=absent
           
Ansible基础简介与使用Ansible基础简介与使用

示例2:

在/etc/ansible/目录下编写test5.yml,如下:

---
- hosts: web
  remote_user: root
  tasks: 
  - name: add group nginx
    group: name=nginx state=present
  - name: add user nginx
    user: name=nginx state=present group=nginx
  - name: install nginx
    yum: name=nginx state=present
    notify:
      - start nginx
      - check nginx
  handlers:
  - name: start nginx
    service: name=nginx state=started
  - name: check nginx
   shell: ss -tnl | grep 80
           
Ansible基础简介与使用Ansible基础简介与使用

ansible-playbook test5.yml执行后片段如下:

Ansible基础简介与使用Ansible基础简介与使用

变量使用:

使用ansible web(IP组名) –m setup 获取远程主机的所有变量

自定义变量

a. 在/etc/ansible/hosts 定义变量,在主机组中的主机单独定义,优先级高于组中公共变量

b. 在/etc/ansible/hosts 定义变量,针对主机组中的所有主机集中定义变量

c. 通过命令行指定变量,优先级最高

变量调用方式:

{{ variable_name }} 通过{{ }} 调用变量,且变量和{}两头之间必须有空格

注意:

在playbook中调用变量时,有时”{{ variable_name }}”需要要双引号引起来方可生效,有时候必须不能用”“引起来

templates功能:

根据模块文件动态生成对应的配置文件

(1) templates文件必须存放于目录名为templates下,且命名为 .j2 结尾

(2)yaml/yml playbook文件需和templates目录平级,目录结构如下:

./

├── temnginx.yml

└── templates

└── nginx.conf.j2

示例3:

编辑templates/nginx.conf.j2,如下(测试内容,如需使用在真实环境中需添加其他必要项)

{% for vhost in nginx_vhosts %}
   server {
       listen {{ vhost }}
   }
   {% endfor %}
           

编辑temnginx.yml,如下

---
- hosts: web
  remote_user: root
  vars:
    nginx_vhosts:
      - 
  tasks:
    - name: add group nginx
      group: name=nginx state=present
    - name: add user nginx
      user: name=nginx state=present group=nginx
    - name: install nginx
      yum: name=nginx state=present
    - name: config file
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify:
        - start nginx
        - check nginx
  handlers:
    - name: start nginx
      service: name=nginx state=started
    - name: check nginx
      shell: ss -tnl | grep 88
           
Ansible基础简介与使用Ansible基础简介与使用

示例4: when,根据系统版本操作

编辑test2.yml,如下:

---
- hosts: web 
  remote_user: root
  tasks:
    - name: test when
      file:  name=/tmp/whentest state=touch
      when: ansible_distribution_major_version == "6"
系统主版本为6,则指定file下的操作
           
Ansible基础简介与使用Ansible基础简介与使用

示例5:with_items列表

---
- hosts: web
  remote_user: root
  tasks:
  - name: service start
    service: name={{ item }} state=started
    with_items:
      - nginx
      - mysqld
      - php-fpm
将被管理主机的以上三个服务启动
           
Ansible基础简介与使用Ansible基础简介与使用

嵌套变量:

---
- hosts: web
  remote_user: root
  tasks:
  - name: add several users
    user: name={{ item.name }} state=present groups={{ item.groups }}
    with_items:
      - { name: 'testu1' , groups: 'tgroup1'}
      - { name: 'testu2' , groups: ' tgroup2'}
           

Roles操作

Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。

将各类文件放到相应目录下,使用时直接调用,或使用tags标识调用,可以理解为将一个多行多功能的yml文件分解成多个小文件,根据需求调用,方便,便捷,易用,同时良好地复用了代码。

Ansible基础简介与使用Ansible基础简介与使用
ansible]# cat nginx-role.yml
---
- hosts: web
  remote_user: root
   roles:
     - { role: nginx , tags: [ 'nginx' ] }
           
ansible]# cat roles/nginx/tasks/groupadd.yml 
---
- name: groupadd
  group: name=nginx gid=1555
           
ansible]# cat roles/nginx/tasks/useradd.yml 
---
- name: useradd
  user: name=nginx group=nginx uid=1444
           
ansible]# cat roles/nginx/tasks/install.yml 
--- 
- name: install nginx
  yum: name=nginx state=latest
           
ansible]# cat roles/nginx/tasks/main.yml 
---
- include: groupadd.yml
- include: useradd.yml
- include: install.yml
- include: restart.yml
- include: filecp.yml
           
ansible]# cat roles/nginx/tasks/restart.yml 
---
- name: restart nginx
  service: name=nginx state=restarted
           
ansible]# cat roles/nginx/tasks/filecp.yml 
---
- name: file cp
  copy: src=mbr dest=/tmp
ansible-playbook nginx-role.yml --tags=nginx
           
Ansible基础简介与使用Ansible基础简介与使用

http://ansible.com.cn/