Ansible基础简介与使用
2017-07-07 17:29
495 查看
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组的组名 172.16.252.140 172.16.253.190 172.16.253.145 ]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.252.140或 ]# ssh-copy-id root@172.16.252.140 为每个被管理主机添加认证,
使用ansible web –m ping 测试一下:
Ansible-->/etc/ansible/hosts内的webIP,/etc/ansible/ansible.cfg的配置-->加载模块文件,将对应的模块命令生成对应的py临时文件,并将该文件传输至远程服务器的对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件,执行并返回结果,删除py临时文件,退出。 ansible-galaxy 用法:
ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
e292 [code]去 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:
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
在/etc/ansible/目录下编写test2.yml,如下:
--- - name: web remote_user: root tasks: - name: remove nginx yum: name=nginx state=absent
示例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-playbook test5.yml执行后片段如下:
变量使用:
使用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: - 88 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
示例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下的操作
示例5:with_items列表
--- - hosts: web remote_user: root tasks: - name: service start service: name={{ item }} state=started with_items: - nginx - mysqld - php-fpm 将被管理主机的以上三个服务启动
嵌套变量:
--- - 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]# 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
http://ansible.com.cn/
相关文章推荐
- memcached系列之1:memcached基础知识简介(为什么要使用memcached做缓存服务器)
- memcached系列之1:memcached基础知识简介(为什么要使用memcached做缓存服务器)
- AndroidStudio中 AspectJ 基础使用 简介
- redis基础简介(八)- redis持久化配置和使用
- redis基础简介(六)- jedis使用管道(pipeline)对redis进行读写(使用hmset、hgetall测试)
- memcached系列之1:memcached基础知识简介(为什么要使用memcached做缓存服务器)
- 【RN - 基础】之Image使用简介
- asm基础——nasm使用简介
- Javascript简介,基础(变量和函数的声明使用)
- 【RN - 基础】之View使用简介
- memcached系列之1:memcached基础知识简介(为什么要使用memcached做缓存服务器)
- C++基础:C++中vector使用简介
- C++基础:C++中vector使用简介
- Ansible使用jinja2管理配置文件以及jinja2语法简介
- HTML5基础03----HTML5元素简介及使用方法
- memcached系列之1:memcached基础知识简介(为什么要使用memcached做缓存服务器)
- Android基础之Notification的简介及使用
- 【基础】使用Ansible连接AWS EC2
- YAML基础语法-ansible使用ansible-playbook
- 【RN - 基础】之Text使用简介