V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wsgzao
V2EX  ›  程序员

Ansible 学习指北

  •  2
     
  •   wsgzao ·
    wsgzao · 2018-05-15 15:15:53 +08:00 · 5493 次点击
    这是一个创建于 2144 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    因为工作的缘故接触并积极推动 Ansible 在企业级生产环境的落地,独立承担并实现了《基于 ansible 的主机自动化配置管理》项目,此前也先后接触过 Puppet 和 SaltStack,本文不会讨论开源或者自主研发方案的优劣,重点是和大伙儿分享自己在 ansible 技术领域积累的一些项目实战经验,如果大家遇到任何问题也欢迎通过留言或者其他方式进行互动,我尽力做到有效回复。

    Ansible is Simple IT Automation

    更新历史

    2018 年 05 月 15 日 - 初稿

    阅读原文 - https://wsgzao.github.io/post/ansible/

    扩展阅读

    ansible - https://docs.ansible.com/


    Ansible 标准化学习路径

    Ansible 相关的书籍在逐步增多,由于 Ansible 版本迭代更新频率高但学习成本低,个人建议书为辅,官方文档为主

    Ansible is an IT automation tool. It can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates.

    Ansible ’ s main goals are simplicity and ease-of-use. It also has a strong focus on security and reliability, featuring a minimum of moving parts, usage of OpenSSH for transport (with other transports and pull modes as alternatives), and a language that is designed around auditability by humans – even those not familiar with the program.

    We believe simplicity is relevant to all sizes of environments, so we design for busy users of all types: developers, sysadmins, release engineers, IT managers, and everyone in between. Ansible is appropriate for managing all environments, from small setups with a handful of instances to enterprise environments with many thousands of instances.

    Ansible manages machines in an agent-less manner. There is never a question of how to upgrade remote daemons or the problem of not being able to manage systems because daemons are uninstalled. Because OpenSSH is one of the most peer-reviewed open source components, security exposure is greatly reduced. Ansible is decentralized – it relies on your existing OS credentials to control access to remote machines. If needed, Ansible can easily connect with Kerberos, LDAP, and other centralized authentication management systems.

    This documentation covers the current released version of Ansible and also some development version features. For recent features, we note in each section the version of Ansible where the feature was added.

    Ansible releases a new major release of Ansible approximately every two months. The core application evolves somewhat conservatively, valuing simplicity in language design and setup. However, the community around new modules and plugins being developed and contributed moves very quickly, adding many new modules in each release.

    Ansible Lightbulb 是 Ansible 官方推荐的入门教材,普通用户大概只需要 10-20 分钟时间即可入门

    The Ansible Lightbulb project is an effort to provide a content toolkit and educational reference for effectively communicating and teaching Ansible topics.

    Ansible Lightbulb - https://github.com/ansible/lightbulb

    Ansible Documentation 是 Ansible 官方文档,我的建议还是对英文不要害怕,多动手查多敲命令去理解

    Ansible Documentation - http://docs.ansible.com/ansible/latest/index.html

    基于 Ansible 的开源项目

    第一个是 ansible 官方开源项目,其他都是和 ansible 相关的运维平台开源项目,推荐学习和参考

    Ansible - https://github.com/ansible/ansible

    Jumpserver - http://www.jumpserver.org/

    OpsManage - https://github.com/welliamcao/OpsManage

    adminset - https://github.com/guohongze/adminset

    Ansible 项目实践

    以下内容来自于《基于 ansible 的主机自动化配置管理》项目,基于 ansible 目前可以满足生产环境所有基线要求,相信对大家有一定的参考价值

    image

    image

    ansible 部署

    因为生产环境为内外网物理隔离,所有的安装部署都是离线进行的

    # Install Packages
    yum install gcc zlib zlib-devel openssl-devel -y
    
    # Install Python
    tar xf Python-2.7.14.tgz
    cd Python-2.7.14
    ./configure
    make
    make install
    cd ..
    
    # renew python env
    exit
    
    # ImportError: No module named six.moves
    tar xf six-1.11.0.tar.gz 
    cd six-1.11.0
    python setup.py install
    cd ..
    
    # ImportError: No module named packaging.version
    tar xf packaging-17.1.tar.gz 
    cd packaging-17.1
    python setup.py install
    cd ..
    
    # ImportError: No module named pyparsing
    tar xf pyparsing-2.2.0.tar.gz 
    cd pyparsing-2.2.0
    python setup.py install
    cd ..
    
    # ImportError: No module named appdirs
    tar xf appdirs-1.4.3.tar.gz 
    cd appdirs-1.4.3
    python setup.py install
    cd ..
    
    # Install Setuptools
    unzip setuptools-38.5.2.zip
    cd setuptools-38.5.2
    python setup.py install
    cd ..
    
    # Install pip
    tar xf pip-9.0.1.tar.gz
    cd pip-9.0.1
    python setup.py install
    cd ..
    
    # pip 离线下载
    # pip download -d DIR -r requirements.txt
    pip download -d ~/ansible/ ansible
    
    # pip 离线安装
    # pip install --no-index --find-links=DIR -r requirements.txt
    pip install --no-index --find-links=pip-ansible-2.3.3/ -r requirements.txt
    pip install --no-index --find-links=pip-ansible-2.5.0/ -r requirements.txt -U
    
    # pip 离线安装 pipenv
    pip install --no-index --find-links=pip-pipenv/ pipenv
    
    # 使用 pipenv 创建虚拟环境
    mkdir win_ansible
    cd win_ansible
    pipenv shell
    pip install --no-index --find-links=pip-ansible-2.5.2/ -r requirements.txt
    

    ansible.cfg 配置解析

    ansible.cfg 不影响执行结果但合理的配置会有效提升效率

    # 配置文件路径(优先级)
    ./ansible.cfg
    /etc/ansible/ansible.cfg
    
    # 配置文件内容
    [defaults]
    #inventory = /etc/ansible/hosts
    #log_path = /var/log/ansible.log
    forks = 100 # 设置并发数
    host_key_checking = False # 不检查 SSH 主机登录的密钥
    display_skipped_hosts = False # 不显示已跳过的主机
    retry_files_enabled = False # 不创建任务失败后的重试文件
    # 按照 1d 设置 setup 缓存,优化执行效率
    gathering = smart
    fact_caching_timeout = 86400
    fact_caching = jsonfile
    fact_caching_connection = cachedir
    
    

    Linux

    • 服务端操作系统:RHEL 6/7 ( Windows 不可作为控制端)
    • 服务端 Python 版本:2.7.14 (实测安装完成无需额外调整)
    • Ansible 版本:2.3.3.0 (实测 2.4 以上版本已不支持 rhel5.5,客户端需 simplejson )
    • 管理对象:目前主要针对 RHEL 5/6/7 ( Windows 使用高版本 Ansible )
    • 基线标准:参考《主机岗配置基线 v1.1.xlsx 》

    服务端

    • 操作系统版本:RHEL 6/7
    • Python 版本:2.7.14
    • 安装方式:pip 离线安装依赖包

    客户端

    • 操作系统版本:RHEL 5/6/7
    • 非最小模式安装无需做调整
    • RHEL5.5 需要安装 simplejson

    核心用法

    # 检测 ansible 是否可以正常访问主机
    ansible-playbook -i hosts playbooks/ping.yml -v
    # 配置好 inventory,执行以下命令创建用户并建立信任关系
    ansible-playbook -i hosts playbooks/user/default.yml -v
    # 配置时间同步 /进程服务 /基线文件
    ansible-playbook -i hosts playbooks/baseline/cfgset.yml -v
    ansible-playbook -i hosts playbooks/baseline/cfgset.yml -v --tags="repo"
    ansible-playbook -i hosts playbooks/baseline/cfgset.yml -v --skip-tags="ntp,repo"
    # 更新系统软件包和补丁包
    ansible-playbook -i hosts playbooks/baseline/pakset.yml -v
    # 修改用户密码
    ansible-playbook -i hosts_changepw playbooks/user/changepw.yml -v -e "@userpass.json"
    # 备份配置,支持自定义日期命名,默认为"%Y%m%d"
    ansible-playbook -i hosts backup/backup.yml -v
    # 恢复配置,支持按日期目录全局或者局部主机恢复
    ansible-playbook -i hosts backup/restore.yml -v -e "var_backup_date=20180305"
    

    Windows

    • 服务端操作系统:RHEL 6/7 ( Windows 不可作为控制端)
    • 服务端 Python 版本:2.7.14 (实测安装完成无需额外调整)
    • Ansible 版本:2.5.0 ( Windows 原生模块支持需要持续更新 Ansible 新版本)
    • 管理对象:目前主要针对 Windows7/2008/2012 (不支持 xp/2003 )
    • 基线标准:参考《 Windows 安全基线》

    服务端

    • 操作系统版本:RHEL 6/7
    • Python 版本:2.7.14
    • 安装方式:pip 离线安装依赖包(目前使用 pipenv 切换管理 Linux 和 Windows )

    客户端

    • 操作系统版本:Window 7/2008/2012
    • WinRM ( Windows 7/2008 需要升级至 Powershell v3.0 )

    核心用法

    # 检测 ansible 是否可以正常访问主机
    ansible-playbook -i hosts win_playbooks/ping.yml -v
    # 配置好 inventory,执行以下命令创建用户并建立信任关系
    ansible-playbook -i hosts win_playbooks/user/default.yml -v
    # 配置时间同步 /进程服务 /基线文件
    ansible-playbook -i hosts win_playbooks/baseline/cfgset.yml -v
    ansible-playbook -i hosts win_playbooks/baseline/cfgset.yml -v --tags="wsus"
    ansible-playbook -i hosts win_playbooks/baseline/cfgset.yml -v --skip-tags="ntp,wsus"
    # 更新系统软件包和补丁包
    ansible-playbook -i hosts win_playbooks/baseline/pakset.yml -v
    # 修改用户密码
    ansible-playbook -i win_hosts_changepw win_playbooks/user/changepw.yml -v -e "@userpass.json"
    # 备份配置,支持自定义日期命名,默认为"%Y%m%d"
    ansible-playbook -i win_hosts win_backup/backup.yml -v
    # 恢复配置,支持按日期目录全局或者局部主机恢复
    ansible-playbook -i win_hosts win_backup/restore.yml -v -e "var_backup_date=20180305"
    
    

    结语

    很抱歉我暂时不能分享全部信息,但是这并不妨碍技术上的交流,我会逐步分享有价值的可公开代码

    1. 遵循 what/why/how 思路,要理解 ansible 能解决什么问题,为什么选择 ansible,怎么使用 ansible 去解决
    2. Ansible 学习成本低但不等同于没有难度,学习路径推荐参考官方文档并积极实践,官网没有答案要善用 Google 搜索
    3. Ansible 纯后台模式只解决了部分问题,还有更多需求要通过基于 Ansible 的自动化运维平台来实现,拥抱开源技术不能固步自封
    31 条回复    2022-03-24 18:03:24 +08:00
    defunct9
        1
    defunct9  
       2018-05-15 15:49:38 +08:00
    主机岗配置基线是什么东东?
    wsgzao
        2
    wsgzao  
    OP
       2018-05-15 16:00:51 +08:00
    @defunct9 #1 俗称 baseline,这里包含的内容主要针对不同的操作系统结合金融行业安全标准和实际经验梳理的安全策略和标准化配置,涉及的范围从 AIX, HP-UX,RHEL 5/6/7, Windows xp/2003/7/2008/2012/10,小机估计今年全部下线使用 x86 替换,生产环境以 RHEL 为主,终端环境 Windows 较多
    defunct9
        3
    defunct9  
       2018-05-15 16:24:56 +08:00
    @wsgzao 收到,估计跟 pci 标准差不多吧
    wsgzao
        4
    wsgzao  
    OP
       2018-05-15 16:35:08 +08:00
    @defunct9 #3 嗯,之前在银联的时候负责过 PCI DSS 和公安部信息系统安全等级保护 3 级项目,其实为了平衡安全管理和运维效率,中间还是得做不少妥协,现在大家都在鼓励运维自动化,相信很多经验和标准化模块是可以相互融合和复用的
    Greenm
        5
    Greenm  
       2018-05-15 16:38:19 +08:00
    我记得 ansible 在服务器比较多的时候,大概上千台运行命令的时候速度很慢,而且可靠率也不够。

    不知道这个问题现在 ansible 有改善吗
    wsgzao
        6
    wsgzao  
    OP
       2018-05-15 16:58:08 +08:00
    @Greenm #5 我这边还没有机会测试千台的规模(针对 2.5.2 版本),按照数百台观察执行结果均符合预期,服务端 CPU/MEM/带宽(内网千兆或万兆)压力可控,执行效率其实和很多层面相关,比如 ssh 连接方式(Windows 是 WinRM 密码交互),是否开启 gather_facts 缓存,playbook 写法等,对我们的环境来说 Ansible 最大的好处是 Agentless,如果觉得 Ansible 在性能上满足不了实际需求,考虑更换其它方案也很快的。因为我们的监控是自主研发减少了一些顾虑,所以 Ansible 作用就是专注运维标准化配置。
    owenliang
        7
    owenliang  
       2018-05-15 17:02:08 +08:00
    不错,很多公司都在用 ansible 做发布系统,做一个 web ui 来交互。
    defunct9
        8
    defunct9  
       2018-05-15 17:49:28 +08:00
    现在都是用 sshpass,没有 windows 机器。还成
    godjob
        9
    godjob  
       2018-05-15 18:24:29 +08:00
    @Greenm 上一千台还是使用 saltstack 吧,使用的是 MQ 消息队列,好像 ansible 也有 angent 模式也是使用 MQ 消息队列
    lauix
        10
    lauix  
       2018-05-15 18:35:01 +08:00
    自己写的 自动化运维平台,比 saltstack ansible 更适用。
    kaneg
        11
    kaneg  
       2018-05-15 19:11:30 +08:00 via iPhone
    我们也在用 ansible 进行复杂产品的安装和配置,目前看来对人力有很大的解放
    HarrisonZ
        12
    HarrisonZ  
       2018-05-15 19:53:22 +08:00
    ansible 稍微一升级之前的 role,task 就会跑不过,python 也不能随便升级,多次遇到 python 升级某个模块 ansible 罢工,更多次遇到升级 ansible 导致老的 task 都跑不过~~唉~~~
    vast0906
        13
    vast0906  
       2018-05-15 19:53:47 +08:00
    大佬,思维导图能发个原图吗?感谢
    julyclyde
        14
    julyclyde  
       2018-05-15 21:23:32 +08:00
    看了不少你的文章了,有几个问题
    1 为啥不选已经带有较新版本 python 的操作系统,而选择在旧版本上编译呢
    2 为什么不选已经打好包的新版本 python (比如 EPEL 里的),而选择编译呢
    3 为啥你总是 ImportError 然后再补东西呢? pip 的自动依赖管理就被你这么给降级成手工管理了
    4 你有没有觉得上述这些问题,和 ansible 的理念相悖呢?

    感觉政企信息化项目的思维方式和互联网行业相比,差太远了
    wsgzao
        15
    wsgzao  
    OP
       2018-05-15 22:02:45 +08:00
    @HarrisonZ #12 Ansible 2.3 和之后的版本差异比较大,之前的我不是很了解,但是后面的版本一般注意语法变化,升级 python, pip, ansible 都没有太大问题,我主要是为了 Windows 的模块支持一路升上去的

    @vast0906 #13 留一个加密后的邮箱地址吧,这个不算啥机密我单独发给你

    @julyclyde #14
    1. rhel 6/7 自带的 python 分别为 2.6.6 和 2.7.5,最新的 rhel 7.5 也是 2.7.5
    2. Redhat EPEL 里没有编译好的 Python,Redhat 当然也不允许安装 CentOS 的第三包,后果自然就是拒绝技术支持
    3. 我注释里写的 ImportError 是我自己手动部署遇到的所有缺失的组件包,写在这里是告诉大家为什么要先装这些
    4. Python 和 Pip 的部署本身和 ansible 使用没有直接关系,但很多人包括我们公司的 RHCA 持证人也会被卡在安装这步

    金融行业有自己的特殊性,流程化的东西很多,但和互联网公司相比节奏也会放慢,利弊都是双面的,不然怎么会有部分人愿意降薪来这儿呢
    Rob007
        16
    Rob007  
       2018-05-15 22:16:12 +08:00
    mark 一下
    jpmorn
        17
    jpmorn  
       2018-05-15 22:37:49 +08:00
    Mitogen ( https://mitogen.readthedocs.io/en/latest/index.html )这个项目楼主有了解过吗。

    比如升级 1000 个节点,你走 ssh 要 1000 个一个一个搞。他貌似是只要 2^10 =1024 就是一个衍生两个 ,两个生 4 个这么搞。

    可惜文档不太明白。借楼问下。

    @wsgzao @defunct9 @Greenm @owenliang @godjob @lauix @kaneg @HarrisonZ @vast0906 @julyclyde @Rob007
    defunct9
        18
    defunct9  
       2018-05-16 07:23:04 +08:00 via iPhone
    好不容易从金融这个破坑里跳出来,再也不想回去了。每年的 pci 和等保以及四大的审核,对于无知人员居然要求删除系统 root 用户或者改名的要求真是忍无可忍了。
    defunct9
        19
    defunct9  
       2018-05-16 09:23:26 +08:00
    @jpmorn 看了看文档,试试不就行了。之前想过用 BT 协议来分发 ,一个机房几千台机器同时装机,很是壮观啊。
    julyclyde
        20
    julyclyde  
       2018-05-16 09:30:32 +08:00
    @wsgzao
    1https://access.redhat.com/solutions/3358 这里说 Installing unsupported packages does not necessarily make a system unsupportable by Red Hat Global Support Services 你和你的 RHCA 们,确定真的懂 Redhat 吗?

    2 rhel7 里的 epel 当然不会再有 python2.7 了,因为系统已经自带了 2.7 ; 6 可以装 epel 里的 2.7
    4 用自动化工具,但没用自动化工具改善工具本身,你不觉得有问题吗?

    你经常发表的这些笔记,其实都是在解决其它企业风格里不存在的问题。

    至于金融行业自己的特殊性,从你这个“管”中,我大概“窥”到了,你们并没用明确的利弊在指导工作,没有正确的是非观,而是要么不懂,要么 refuse to lean,把工作扣死在流程上,换句话说就是把责任推给指定流程的人
    julyclyde
        21
    julyclyde  
       2018-05-16 09:32:37 +08:00
    RHCA 我觉得就别拿出来说了吧。脱离 ansible 这个话题,我说说以前我招聘的时候,见过的几个 rhca 考官连系统启动过程都说不清楚。

    btw:你的 rhca 同事们知道系统启动过程吗?

    所以,你明白为什么得降薪才能进去了吗?
    Greenm
        22
    Greenm  
       2018-05-16 10:24:57 +08:00
    @godjob 原生的 saltstack 也有一些问题,在两千台服务器,windows 和 linux 混搭的情况下。

    linux 是支持很好的,主要是 windows 有问题。(垃圾 windows )

    saltstack 目前遇到的问题: %1 左右的概率命令失败、无响应、无返回,agent 偶尔占用内存很高。

    可惜团队目前没有精力去解决这些问题。
    wsgzao
        23
    wsgzao  
    OP
       2018-05-16 10:27:15 +08:00
    @julyclyde #20

    > RHCA/CCIE 和降薪的选择咱们就不展开了,抛开 IT 行业看,各种职业资格证或者含金量较高的 CFA/FRM,不管是考出来的人到底懂多少但至少这帮人花了时间去准备,我敬重他们学习的过程,至少我没有或者没考出来,持证人也不可能什么都清楚或者记得住。至于证书重不重要那是每个人自己的选择,既要平衡事业又要兼顾家庭在没有资源积累的情况本身就很困难。

    > 第二个问题我想是因为我们对于 EPEL 的理解出现了偏差,您指的应该是 Fedora,而我指的是 Redhat Extras channel/repository,这个应该算是误会吧
    https://access.redhat.com/solutions/912213

    1. rhel6.10 ( beta )官方也没有提供升级至 python2.7 的方法,只是在 2.6.6 基础上提供安全补丁,如果你们也购买了 RHEL 订阅支持应该都可以看到,如果一定要给个官方的结论,那开 case 申请严重性 1 (Urgent)或者电话红帽 3 线工程师都可以

    2. rhel7 包括最新的 rhel7.5 自带 2.7.5,所以要不要升级我认为和 ansible 版本和引入的 python 包有关,这里没有反驳的意思。但是 rhel6 可以装 rhel7 里的 epel python2.7 这个我没有尝试过(如果是指 Fedora 的话),红帽不建议跨大版本升级或者引入包,如果可以通过源码安装那就不会影响 sosreport 收集的信息,服务端升级 python 只是一次性的操作,这个操作红帽工程师认可。

    3. 我知道自己发的笔记对于大部分互联网公司都不存在的,可以直接科学上网的公司甚至可以非常顺滑的按照官方文档轻轻松松部署,把时间和精力专注在怎么把产品本身用好上。我们也想减少不必要的时间在部署上,但现实就是这是必须面对和解决的蛋疼问题而且还会牵连出一堆烦心事,像 OpenStack 在测试环境我们就放弃 Redhat OpenStack 全部改用 CentOS 和开源版本的 OpenStack 在探索和定制 Portal,至少在一点点往前走。但也不得不承认红帽在 OpenShift 和 OpenStack 商业化领域做得确实还不错。
    julyclyde
        24
    julyclyde  
       2018-05-16 11:13:41 +08:00
    baseline 是底线,但现在已经被你搞成了上限了
    julyclyde
        25
    julyclyde  
       2018-05-16 11:18:04 +08:00   ❤️ 1
    另外我也不觉得学习辛苦有什么可敬的,如果没学到,再辛苦也只是他自己的事而已
    你天天发这些,真觉得是有价值的吗?坐标轴是不是定的太低了点?
    wsgzao
        26
    wsgzao  
    OP
       2018-05-16 11:34:30 +08:00
    @julyclyde #25 Blog 里分享的都是偏基础为主,以后者事太多生了娃哪还有闲工夫分享 Blog,有空能够坚持用简单有效的方式把 word 或者 markdown 的笔记分享出来我就很知足了,我已经有大半年没更新过 Blog 了,因为还有一点时间,争取把之前做的一部分工作放上来做分享,写出来的东西一定会有不严谨的地方但初衷还是希望帮助各位快速入门,有则改之,无则加勉
    vast0906
        27
    vast0906  
       2018-05-16 12:33:05 +08:00
    @wsgzao Base64: dmFzdDA5MDZAZ21haWwuY29t

    @jpmorn Ansible 可以通过 mq 做消息队列貌似速度会很快,我也只是在群里看别人用过,自己没实践过。
    wsgzao
        28
    wsgzao  
    OP
       2018-05-16 14:12:07 +08:00
    @vast0906 #27 已发送,原始格式是 xmind 制作的
    julyclyde
        29
    julyclyde  
       2018-05-16 20:00:17 +08:00
    @wsgzao 我觉得多写写和别人不一样的内容才有意义。如果都一样都干嘛看你的呢?
    但你那几个 ImportError 在你的每篇文章里都包含,而且占比极高,基本上把标题上要说的内容都冲淡了
    wsgzao
        30
    wsgzao  
    OP
       2018-05-16 21:18:46 +08:00
    @julyclyde #29 嗯嗯,这个建议我会改进的,重复内容是有点多,以 1、2 篇文章作为核心输出就好
    evenno
        31
    evenno  
       2022-03-24 18:03:24 +08:00
    你好,可以分享下基线的 playbook 剧本吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5672 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 06:29 · PVG 14:29 · LAX 23:29 · JFK 02:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.