本文说明

本系列使用 ansible 2.9.27 版本来说明和汇总相关信息。

  1. # cat /etc/system-release
  2. Red Hat Enterprise Linux Server release 7.8 (Maipo)
  3. #
  4. # uname -a
  5. Linux test01 3.10.0-1160.36.2.el7.x86_64 #1 SMP Wed Jul 21 11:57:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
  6. #
  7. # ansible --version # ansible版本
  8. ansible 2.9.27
  9. config file = /etc/ansible/ansible.cfg
  10. configured module search path = [u'/home/vipxf/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  11. ansible python module location = /usr/lib/python2.7/site-packages/ansible
  12. executable location = /bin/ansible
  13. python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
  14. #
  15. # yum info ansible # 包信息
  16. Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
  17. Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
  18. Loading mirror speeds from cached hostfile
  19. Installed Packages
  20. Name : ansible
  21. Arch : noarch
  22. Version : 2.9.27
  23. Release : 1.el7
  24. Size : 103 M
  25. Repo : installed
  26. Summary : SSH-based configuration management, deployment, and task execution system
  27. URL : http://ansible.com
  28. License : GPLv3+
  29. Description : Ansible is a radically simple model-driven configuration management,
  30. : multi-node deployment, and remote task execution system. Ansible works
  31. : over SSH and does not require any software or daemons to be installed
  32. : on remote nodes. Extension modules can be written in any language and
  33. : are transferred to managed machines automatically.
  34. #

Ansible 概念介绍

Ansible是自由开源的配置和自动化工具。

主要特点

  1. - 无客户端模式(agentless),无侵入性,只需在主控端部署Ansible环境,被控端无需做任何操作
  2. - 丰富的内置模块满足绝大部分场景需求,调用特定模块可以完成特定任务
  3. - 基于Python研发,支持API及自定义模块,二次开发相对容易
  4. - 默认使用SSH协议和节点进行通信
  5. - 强大的playbook机制,配置语法使用yamlJinja模板语言,便于配置管理和实现复杂功能
  6. - 具有幂等性,自动跳过没有变化的部分,也就是一个操作执行一次和多次的结果相同
  7. - 对云计算平台和大数据提供了支持

Ansible 使用模式

  1. - 结合CMDB:通过CMDB下发指令调用Ansible完成相关操作
  2. - API调用:远程调用Ansible提供丰富的API接口
  3. - Ad-Hoc命令:直接通过Ad-Hoc命令集执行相关操作,多用于非固化需求、临时性操作和二次开发接口调用的场景
  4. - playbook执行:运行Playbook按序执行任务集

Ansible由控制主机对被管节点的操作方式为 Ad-Hoc 和 Playbook。

  • Ad-Hoc模式使用单个模块,支持批量执行单条命令。
  • Playbook模式是Ansible主要管理方式,Playbook通过多个Task集合完成一类功能,可以简单地把 Playbook理解为通过组合多条Ad-Hoc操作的配置文件。

Ansible 架构及流程

  1. # Ansible 主要由五部分组成
  2. - Ansible Ansible核心
  3. - Modules 包括核心模块和自定义模块
  4. - Plugins 插件,对模块功能的补充,包含连接插件、邮件插件等
  5. - Playbooks 剧本,定义任务的配置文件
  6. - Inventory 定义管理主机的清单
  7. # ansible 命令执行过程
  8. 1. Ansible加载配置文件,默认为/etc/ansible/ansible.cfg
  9. 2. Ansible读取Inventory文件(默认为/etc/ansible/hosts),获取管理主机列表及相关变量信息
  10. 3. 根据参数调用对应配置和模块,产生临时py文件
  11. 4. 通过SSH方式传输到目标主机(默认为~/.ansible/tmp目录)
  12. 5. 设置临时py文件的执行权限,执行操作并返回结果
  13. 6. 删除临时py文件并退出

Ansible 基础信息

Ansible 主要目录

  1. # 配置文件目录
  2. /etc/ansible/
  3. - ansible.cfg # Ansible 主配置文件
  4. - hosts # Inventory,定义目标主机清单的文件
  5. - roles # 角色目录,用于定义角色
  6. # 执行文件目录
  7. /usr/bin/
  8. # Lib库依赖目录
  9. /usr/lib/python2.7/site-packages/ansible
  10. # Help文档目录
  11. /usr/share/doc/ansible-2.9.27/
  12. # Ansible模块目录
  13. /usr/share/ansible/
  14. - collections # 目录
  15. - plugins # 插件模块目录
  16. - roles # 角色模块目录

Ansible 配置文件

默认Ansible配置文件存放在 /etc/ansible/ansible.cfg

  1. # 常见参数
  2. inventory = /etc/ansible/hosts # 主机清单inventory文件的位置
  3. library = /usr/share/ansible # 存放Ansible模块的目录,支持用“:”隔开多个目录
  4. forks = 5 # 并发连接数,默认为5
  5. remote_port = 22 # 连接主机节点的端口,默认为22端口,建议修改
  6. host_key_checking = False # 是否检查SSH主机的密钥,值为True/False
  7. timeout = 60 # SSH连接的超时时间,单位为秒
  8. log_path = /var/log/ansible.log # 存储ansible日志的文件(默认不开启)

Ansible 执行文件

  1. $ ll /usr/bin/*ansible* # 相关执行文件
  2. lrwxrwxrwx 1 root root 20 Mar 17 2022 /usr/bin/ansible -> /usr/bin/ansible-2.7
  3. lrwxrwxrwx 1 root root 20 Mar 17 2022 /usr/bin/ansible-2 -> /usr/bin/ansible-2.7
  4. -rwxr-xr-x 1 root root 5933 Jan 16 2022 /usr/bin/ansible-2.7
  5. lrwxrwxrwx 1 root root 7 Mar 17 2022 /usr/bin/ansible-config -> ansible
  6. -rwxr-xr-x 1 root root 13432 Jan 16 2022 /usr/bin/ansible-connection
  7. lrwxrwxrwx 1 root root 28 Mar 17 2022 /usr/bin/ansible-console -> /usr/bin/ansible-console-2.7
  8. lrwxrwxrwx 1 root root 28 Mar 17 2022 /usr/bin/ansible-console-2 -> /usr/bin/ansible-console-2.7
  9. lrwxrwxrwx 1 root root 7 Mar 17 2022 /usr/bin/ansible-console-2.7 -> ansible
  10. lrwxrwxrwx 1 root root 24 Mar 17 2022 /usr/bin/ansible-doc -> /usr/bin/ansible-doc-2.7
  11. lrwxrwxrwx 1 root root 24 Mar 17 2022 /usr/bin/ansible-doc-2 -> /usr/bin/ansible-doc-2.7
  12. lrwxrwxrwx 1 root root 7 Mar 17 2022 /usr/bin/ansible-doc-2.7 -> ansible
  13. lrwxrwxrwx 1 root root 27 Mar 17 2022 /usr/bin/ansible-galaxy -> /usr/bin/ansible-galaxy-2.7
  14. lrwxrwxrwx 1 root root 27 Mar 17 2022 /usr/bin/ansible-galaxy-2 -> /usr/bin/ansible-galaxy-2.7
  15. lrwxrwxrwx 1 root root 7 Mar 17 2022 /usr/bin/ansible-galaxy-2.7 -> ansible
  16. lrwxrwxrwx 1 root root 7 Mar 17 2022 /usr/bin/ansible-inventory -> ansible
  17. lrwxrwxrwx 1 root root 29 Mar 17 2022 /usr/bin/ansible-playbook -> /usr/bin/ansible-playbook-2.7
  18. lrwxrwxrwx 1 root root 29 Mar 17 2022 /usr/bin/ansible-playbook-2 -> /usr/bin/ansible-playbook-2.7
  19. lrwxrwxrwx 1 root root 7 Mar 17 2022 /usr/bin/ansible-playbook-2.7 -> ansible
  20. lrwxrwxrwx 1 root root 25 Mar 17 2022 /usr/bin/ansible-pull -> /usr/bin/ansible-pull-2.7
  21. lrwxrwxrwx 1 root root 25 Mar 17 2022 /usr/bin/ansible-pull-2 -> /usr/bin/ansible-pull-2.7
  22. lrwxrwxrwx 1 root root 7 Mar 17 2022 /usr/bin/ansible-pull-2.7 -> ansible
  23. lrwxrwxrwx 1 root root 26 Mar 17 2022 /usr/bin/ansible-vault -> /usr/bin/ansible-vault-2.7
  24. lrwxrwxrwx 1 root root 26 Mar 17 2022 /usr/bin/ansible-vault-2 -> /usr/bin/ansible-vault-2.7
  25. lrwxrwxrwx 1 root root 7 Mar 17 2022 /usr/bin/ansible-vault-2.7 -> ansible
  26. $

Ansible 常见模块

Ansible基于模块工作,本身没有批量部署的能力。

可以理解为Ansilbe提供了框架来运行具备批量部署能力的指定功能模块。

  1. # 通过 ansilbe-doc 命令查看模块帮助信息,类似man命令
  2. ansible-doc -l # List available plugins
  3. ansible-doc -l | grep "copy" # 查找名称包含copy字符的模块
  4. ansible-doc <module_name> # 显示模块的说明信息
  5. ansible-doc -s <module_name> # Show playbook snippet for specified plugin(s)
  6. # 常见模块
  7. ## command 在指定主机上执行命令(默认模块),不支持变量、管道、重定向等shell特性
  8. ## ping 测试指定主机连接性
  9. ## shell 在指定主机上执行命令或运行脚本,打开远程主机的shell进程的一个子shell运行命令,支持shell的变量、管道、重定向等特性
  10. ## script 调用本地脚本在远程主机执行
  11. ## stat 获取文件信息
  12. ## setup 主机系统信息,收集facts
  13. ## copy 复制文件到远程主机的指定位置
  14. ## fetch 复制指定主机的文件到本地
  15. ## get_url 在远程主机下载指定的url地址,支持文件校验
  16. ## file 设置文件属性
  17. ## cron 设置计划任务
  18. ## group 管理用户组
  19. ## user 管理用户
  20. ## service 管理服务状态
  21. ## yum 管理程序包
  22. ## hostname 管理主机名称
  23. ## git 代码及版本管理
  24. ## B 后台管理
  25. ## assemble 文件组装,可以将多份配置文件组装成一份配置文件
  26. ## ini ini文件管理模块
  27. ## url web请求,发送HTTP协议请求并得到返回的状态码
  28. ## apt APT包管理模块

Ansible 命令讲解

Ansible 命令集

  1. # 以下所有命令均可使用`-h`参数获取帮助信息
  2. ansible # Define and run a single task 'playbook' against a set of hosts # 常用命令
  3. ansible-config # View ansible configuration.
  4. ansible-console # REPL console for executing Ansible tasks. # 交互式工具,相当linux中的shell,不常用
  5. ansible-doc # plugin documentation tool # 查询模块的文档说明,类似linux中的man,常用命令
  6. ansible-galaxy # Perform various Role and Collection related operations.
  7. ansible-inventory # Show Ansible inventory information, by default it uses the inventory script JSON format
  8. ansible-playbook # Runs Ansible playbooks, executing the defined tasks on the targeted hosts. # 执行系列任务,类似linux中的sh,常用命令
  9. ansible-pull # pulls playbooks from a VCS repo and executes them for the local host
  10. ansible-vault # encryption/decryption utility for Ansible data files

Ansible 常用命令集

  1. # 常用命令集
  2. ansible
  3. # Ansible指令的核心部分,主要用于执行ad-hoc命令,也就是单条命令
  4. # 默认使用command模块,默认的使用模块可以在ansible.cfg中进行定义
  5. ansible-doc
  6. # 用于查看模块信息,
  7. # 参数 -l 列出可用的插件
  8. # 参数 -s 用于查看指定模块的用法,例如“ansible-doc -s shell”
  9. ansible-playbook
  10. # 读取playbook文件内容并执行定义的任务
  11. # 对于固化的需求通常采用playbook方式定义和实现
  12. ansible-vault
  13. # 主要应用于包含敏感信息的场景,可以加密和解密敏感信息
  14. # 经过加密后的playbook,编辑时需要输入事先设定的密码才能打开
  15. # 使用 --ask-vault-pass 参数执行加密后的playbook文件
  16. ansible-config
  17. # 查看ansible的配置
  18. # 参数 list 打印所有配置参数,参数 view 查看配置文件
  19. # 结合 grep 使用可以获取具体配置信息,例如“ansible-config view |grep -v "#" |grep host_key_checking”

Ansible ad-hoc命令

  1. # ansible <host-pattern> [-f forks] [-m module_name] [-a args]
  2. # <host-pattern> 命令生效的主机: <inventory_group_name>/<inventory_host_ip>/all
  3. # 常用选项 通过 ansible -h 命令获取详细信息
  4. -v # 输出详细执行过程信息 verbose mode (-vvv for more, -vvvv to enable connection debugging)
  5. -i inventory_file # 指定inventory文件,默认为/etc/ansible/hosts
  6. -f forks # 指定并发线程数(一次处理多少个主机),默认5个线程
  7. -m module_name # 指定执行使用的模块
  8. -M directory # 指定模块存放路径,默认为/usr/share/ansible
  9. -a args # 指定模块参数
  10. -l hosts_ip # 限定主机(只在限定主机上执行任务)
  11. --become-method BECOME_METHOD # 提权方法,默认为sudo,一般为su
  12. --become-user BECOME_USER # 切换用户,默认为root
  13. -K, --ask-become-pass # 请求提权密码
  14. --list-hosts # 列出此次的主机列表,但不做任何改变
  15. --syntax-check # 语法检查
  16. -C, --check # 检验可能的错误,但不做任何改变
  17. # 主机名文件保留
  18. - "-t""--tree"选项可以将ansible的执行结果按主机名保存在指定目录下的文件中
  19. - 使用"-t"选项可以将第一次执行的结果按主机名保存在文件中, 此后即使不使用"-t"选项也能提升执行速度
  20. # 命令示例
  21. ansible 192.168.56.3 -a 'hostname' # 默认使用command模块(不支持变量、管道等)
  22. ansible 192.168.56.3 -m command -a 'hostname'
  23. ansible Test --list # 列出Test组所有的主机列表
  24. ansible Test:Test2 -m ping # 通过ping模块检查Test组和Test2组的主机是否存活
  25. ansible Test:!Test2 -m ping # 在Test组但不在Test2组的主机
  26. ansible Test:&Test2 -m ping # 同时存在Test组和Test2组的主机
  27. ansible Tes* -m ping # 组名开头为Tes的主机
  28. ansible all -m shell -a 'hostname && date' # 通过shell模块在所有主机试行shell命令
  29. ansible all -f 10 -m shell -a 'hostname && date;cat /etc/system-release' # shell模块支持变量、管道、if判断等复杂命令

部分参数如果不指定,将采用ansible.cfg中的设置值,或者采用原始默认值。

Ansible ad-hoc常用命令

  1. # ping 测试指定主机连接性
  2. ansible ta -m ping
  3. ansible -i /etc/ansible/hosts ta -m ping # 指定inventory文件
  4. # command 在指定主机上执行命令(默认模块),不支持变量、管道、重定向等shell特性
  5. ansible ta -m command -a "chdir=/home/ ls ./" # 在远程主机上切换到home目录执行ls命令
  6. # shell 在指定主机上执行命令或运行脚本,打开远程主机的shell进程的一个子shell运行命令,支持shell的变量、管道、重定向等特性
  7. ansible ta -m shell -a 'hostname && date;cat /etc/system-release' # 支持变量、管道、if判断等复杂命令
  8. ansible ta -m shell -a "echo 'this is a test' > test.txt" -C # 验证可能的错误,但不做任何改变
  9. ansible ta -m shell -a 'echo "123456"|passwd --stdin root' -K # 更改root密码
  10. # script 调用本地脚本在远程主机执行,但只能执行脚本,不能调用其他指令,且不支持管道命令
  11. ansible ta -m script -a "/home/vipxf/test.sh"
  12. ansible ta -m script -a "removes=/home/vipxf/test.sh /home/vipxf/test2.sh" -o # 如果远程主机上test.sh文件存在就执行本地脚本test2.sh,否则就不执行
  13. ansible ta -m script -a "creates=/home/vipxf/test.sh /home/vipxf/test2.sh" -o # 如果远程主机上test.sh文件存在就不执行本地脚本test2.sh,否则就执行
  14. # raw 类似shell,支持管道命令,可用于没有python环境的远程主机
  15. ansible ta -m raw -a "cd /home;pwd"
  16. # stat 获取文件信息
  17. ansible ta -m stat -a "path=/etc/ansible/hosts"
  18. # setup 系统信息,收集facts
  19. ansible ta -m setup
  20. ansible ta -m setup | grep "xxx" # 获取主机所有facts然后结合grep命令过滤
  21. ansible ta -m setup -a "filter=ansible_os_family" # 通过filter参数来查看指定信息
  22. ansible ta -m setup -a 'filter="*mem*"' --tree ./facts # 通过filter参数查看指定信息并按主机名保存到facts目录
  23. # copy 复制文件到远程主机的指定位置
  24. ansible ta -m copy -a "src=/etc/hosts dest=~/test.hosts mode=664 owner=vipxf group=vipxf" # 复制本地文件到远程主机并设置权限
  25. ansible ta -m copy -a "content="this is a test" dest=~/test.hosts mode=664 owner=vipxf group=vipxf" # 在远程主机创建指定内容文件并设置权限
  26. # fetch 复制指定主机的文件到本地
  27. ansible ta -m fetch -a "src=~/testfile.txt dest=~/" # 将在指定目录下创建对应IP文件夹来存放文件,保留了原目录结构
  28. # get_url 在远程主机下载网络文件,支持文件校验
  29. ansible ta -m get_url -a "url=http://172.20.5.3/pub/soft/docker/docker-19.03.9.tgz dest=~/ mode=655 owner=vipxf" # 下载文件到远程主机指定目录并设置权限
  30. # file 设置文件属性
  31. ansible ta -m file -a "path=~/testfile.txt mode=755 owner=vipxf group=vipxf" # 更新文件属性
  32. ansible ta -m file -a "path=~/testfile.txt state=touch mode=644" # 创建文件
  33. ansible ta -m file -a "path=~/testfile.txt state=absent" # 删除文件
  34. ansible ta -m file -a "path=~/testdir mode=755 state=directory" # 创建目录
  35. # cron 设置计划任务
  36. ansible ta -m cron -a "minute=0 hour=22 job='/home/vipxf/testcron.sh' name='test cron'" # 创建计划任务
  37. ansible ta -m cron -a "name='test cron' state=absent" # 删除计划任务
  38. # group 管理用户组
  39. ansible ta -b --become-user root --become-method su -m group -a "name=test system=yes" --ask-become-pass # 创建用户组
  40. ansible ta -b --become-user root --become-method su -m group -a "name=test state=absent" --ask-become-pass # 删除用户组
  41. # user 管理用户
  42. ansible ta -b --become-user root --become-method su -m user -a "name=test system=yes group=test password=pw@123" -K # 创建用户
  43. ansible ta -b --become-user root --become-method su -m user -a "name=test state=absent force=yes" -K # 删除用户
  44. # service 管理服务
  45. ansible ta -b --become-user root --become-method su -m service -a "name=sshd enabled=yes state=started" -K # 启动httpd服务并且不设置开机启动
  46. ansible ta -b --become-user root --become-method su -m service -a "name=sshd state=stopped" -K # 停止httpd服务并且不设置开机启动
  47. # yum 管理程序包
  48. ansible ta -b --become-user root --become-method su -m yum -a "name=httpd state=present" -K # 安装包,也可以将state设为installed
  49. ansible ta -b --become-user root --become-method su -m yum -a "name=httpd state=latest disable_gpg_check=no" -K # 关闭完整性校验,安装最新版包
  50. ansible ta -b --become-user root --become-method su -m yum -a "name=httpd state=absent" -K # 卸载包,也可以将state设为removed
  51. ansible ta -b --become-user root --become-method su -m yum -a "name=nginx state=latest enablerepo=local" -K # 启用本地yum源安装最新版软件包
  52. # hostname 管理主机名称
  53. ansible ta -b --become-user root --become-method su -m hostname -a "name=test" --ask-become-pass # 更改远程主机名

Ansible 变量使用

  • Ansible的变量名仅能由字母、数字和下划线组成,且只能以字母开头。
  • Python关键字和playbook关键字都不能作为有效的变量名。
  • Ansible的变量可以被定义在playbook、inventory、yaml格式文件、角色和命令行中,也可以将任务的输出定义为变量。

Ansible 自定义变量

  1. # 方式1:在Inventory中为主机或组定义专用变量
  2. [groupname]
  3. 192.168.56.1 variable_name=value
  4. [groupname:vars]
  5. variable_name=value
  6. [all:vars]
  7. ansible_ssh_port="2222"
  8. # 方式2:在playbook中通过关键字vars或vars_files定义变量
  9. vars:
  10. - var_name: value
  11. - var_name: value
  12. vars_files:
  13. - ./external_vars.yml # 变量文件内容遵循yml格式
  14. # 方式3:在playbook中把任务的输出通过关键字register定义为变量,然后用于其他任务
  15. tasks:
  16. - name: test
  17. shell: /usr/bin/foo
  18. register: foo_result
  19. # 方式4:在playbook中使用变量,执行palybook时通过命令行传递变量,通过“-e”或“--extra-vars”参数传递的变量优先级更高
  20. ansible-playbook test.yml --extra-vars "hosts=Test user=anliven"
  21. # 方式5:指定主机角色时通过 roles 传递变量,并在角色内通过` var_name `调用
  22. roles:
  23. - { role: ROLE_NAME, var: value, ...}

Ansible 系统变量

  1. # 远程主机的系统信息统称为facts
  2. # facts信息是JSON格式的数据结构,ansible_facts是最上层,可以使用 ansible_facts 变量查看所有内容
  3. # 此外默认情况下使用 ansible_ 前缀可以将一些fact作为顶级变量访问
  4. # 通过 setup 模块可以查看指定主机的所有facts信息,通过使用filter参数来查看指定信息
  5. ansible <host> -m setup # 查看指定主机的facts信息
  6. ansible ta -m setup | grep "xxx" # 获取主机所有facts然后结合grep命令过滤
  7. ansible ta -m setup -a "filter=ansible_os_family" # 通过filter参数来查看指定信息
  8. ansible ta -m setup -a 'filter="*mem*"' --tree ./facts # 通过filter参数查看指定信息并按主机名保存到facts目录

Ansible 引用变量

  1. # 普通变量
  2. 通过 {{ var_name }} 方式引用
  3. # 关键字register或系统fact变量
  4. - 返回结果集通常是嵌套yaml或者json的数据结构
  5. - 通过 {{ var_name.stdout }} {{ ansible_facts["eth0"]["ipv4"]["address"] }} 的方式引用

Ansible 变量优先级

  1. # 优先级
  2. 1. 命令行中定义的变量(用-e或--extra-vars定义的变量)
  3. 2. Inventory中定义的连接变量(比如:ansible_ssh_user
  4. 3. 普通变量(命令行转换、play中的变量、included的变量、role中的变量等)
  5. 4. Inventory中定义的其他变量
  6. 5. Facts变量

Ansible 清单定义

Ansible 主机清单(Inventory)

Ansible通过Inventory(可管理的主机集合)对远端服务器或者主机进行统一操作和管理,默认将主机列在一个文本文件中,这个文件称为Inventory文件。

  • 默认的路径和文件为:/etc/ansible/hosts
  • 可以通过ANSIBLE_HOSTS环境变量、ansible.cfg文件中inventory参数来指定,或者运行ansible和ansible-playbook时使用-i参数临时指定
  • 可以有多个 inventory 文件,也可以通过 Dynamic Inventory 动态生成
  • inventory文件为 INI文件格式,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中
  • 组名建议使用"_"来连接字符,例如“aaa_bbb_ccc”

Ansible Inventory文件

  1. 192.168.56.1 # 未分组
  2. test.example.com
  3. 127.0.0.1 ansible_connection=local # 直接访问本地主机,而不是通过SSH
  4. [Test] # 已分组名称
  5. 192.168.56.1
  6. 192.168.56.2
  7. 192.168.56.[3:4] # 通过列表方式通配地址
  8. 192.168.56.[5:6] # 多个通配地址
  9. anliven-[a:d].example.com # 通配主机域名
  10. [Test:vars] # 定义组变量
  11. ansible_ssh_user="anliven"
  12. ansible_ssh_pass="anliven"
  13. ansible_ssh_port="22"
  14. [Test2] # 在分组中指定变量
  15. 192.168.56.[1:2] ansible_ssh_user=anliven ansible_ssh_pass=Anliven
  16. 192.168.56.[3:4] ansible_ssh_user=anliven ansible_ssh_pass=Anliven
  17. 192.168.56.[3:4]
  18. [Test3] # 在分组中切换root用户
  19. 192.168.56.[1:2] ansible_ssh_port="22" ansible_ssh_user="anliven" ansible_ssh_pass="anliven" ansible_become_pass="Anliven"
  20. [Temp]
  21. 192.168.56.1:2222 # 指定端口
  22. 192.168.56.2 http_port=8080 var1=test1 var2=test2 # 定义主机时为其添加主机变量以便于在playbook中使用
  23. [Temp:vars]
  24. ansible_ssh_user="anliven"
  25. ansible_ssh_pass="anliven"
  26. [TestGroup:children] # 嵌套组,TestGroup为名称,其他为固定格式
  27. Test1
  28. Test2
  29. Test3
  30. [TestGroup:vars] # 嵌套组的变量只能在ansible-playbook中使用
  31. var1="test1"
  32. var2="123"
  33. [all:vars] # 类似全局变量,对inventory文件中所有节点都有效
  34. ansible_ssh_port="22"

Ansible Inventory内置参数

Ansible Inventory文件中可使用的行为参数

可以在ansible.cfg中的[defaults]部分更改一些Inventory行为参数的默认值

Ansible Dynamic Inventory

  • 动态Inventory也就是Ansible所有的Inventory文件里面的主机列表和变量信息都支持从外部拉取,例如CMDB等。
  • 避免主机列表不准确和频繁大量的手动更新的问题
  • 也可以通过设置ansible.cfg文件中的inventory参数为一个可执行脚本,将CMDB等其他系统的主机信息同步至Ansible中。
  • 对动态Inventory脚本的参数和输出必须遵循格式规则

Ansible Inventory分割

通过Inventory分割满足如下需要

  • 按不同业务/系统分割成的多个Inventory文件
  • 同时使用常规Inventory文件和动态Inventory脚本

实现方式

  • 配置ansible.cfg文件的hostfile参数,指定放置inventory文件目录作为Inventory,Ansible将合并目录里所有文件为一个完整的Inventory
  • 也可以在命令行中使用-i命令来指定特定的Inventory文件
  1. [defaults]
  2. hostfile = /etc/ansible/inventory # 指定目录作为Inventory

Ansible 剧本执行

Ansible Playbook 基础介绍

剧本(Playbook) 是 ansible 用于配置,部署,和管理被控节点的剧本。

  • playbook类似Linux的shell脚本,用于实现和管理大量的、规律的、复杂的操作任务
  • playbook方便代码和配置的重用、移植性好,同时也易于管理

Playbook格式

  1. # playbook文件由YMAL语言编写,需遵循yaml格式要求
  2. 1. 第一行以 "---" 开始,表明YMAL文件的开始(非playbook强制要求,没有也能通过语法检查)
  3. 2. 列表元素以”-”开头,后面带有一个空格,然后元素内容
  4. 3. 对象的键与值以":"和一个空格来分隔
  5. 4. 相同层次内容必须保持相同的缩进和对齐,否则会报错
  6. 5. 在同一行中,“#” 之后的内容表示注释
  7. 6. 文件名应该以.yml或.yaml结尾
  8. # 编写完成后可以通过 --syntax-check 子命令检查语法错误
  9. ansible-playbook --syntax-check sample.yaml

Playbook组成

  • 一个Playbook可以包括一个或多个Play。
  • 一个Play由Host的无序集合与Task的有序列表组成。
  • 每一个Task仅由一个模块构成。

  1. # play
  2. - 一个Playbook包括一个或多个Play
  3. - 一个PlayHost的无序集合与Task的有序列表组成
  4. # 目标定义部分:host
  5. - 执行playbook的主机信息
  6. # 变量定义部分:variable
  7. - 执行playbook需要的变量
  8. - 设置的ansible配置变量,例如gather_facts
  9. # 任务定义部分:tasks & module
  10. - 在目标主机执行的任务列表和调用的模块
  11. - Play的主体部分,Task列表中的各任务按次序逐个在Hosts中的指定主机上执行
  12. - 每一个Task仅由一个模块构成
  13. - 建议为每一个Task设置一个Name,便于在运行Playbook时从输出结果辨别task信息
  14. - Ansible的自带模块Command模块和Shell模块无需使用key=value格式,可以直接编写要执行的命令
  15. # 触发器定义部分:handlers
  16. - task执行完成后需要调用的任务,通常结合关键字notify
  17. - 由通知者进行的Notify,如果没有被Notify,则Handlers不会执行,如果被Notify了,则Handlers被执行
  18. - 不管有多少个通知者进行了Notify,等到Play中的所有Task都执行完成之后,Handlers也只会被执行一次
  19. - 实质上也是Task的列表

Ansible Playbook 示例

  1. [root@test01 ansible-test]# pwd
  2. /root/ansible-test
  3. [root@test01 ansible-test]#
  4. [root@test01 ansible-test]# ll
  5. total 4
  6. drwxr-xr-x 2 root root 24 Oct 17 09:47 conf
  7. -rw-r--r-- 1 root root 922 Oct 14 11:24 sample.yaml
  8. [root@test01 ansible-test]#
  9. [root@test01 ansible-test]# tree
  10. .
  11. ├── conf
  12. └── httpd.conf
  13. └── sample.yaml
  14. 1 directory, 2 files
  15. [root@test01 ansible-test]#
  16. [root@test01 ansible-test]# cat conf/httpd.conf
  17. MaxClients {{ maxClients }}
  18. Listen {{ httpd_port }}
  19. [root@test01 ansible-test]#
  20. [root@test01 ansible-test]# cat sample.yaml
  21. - hosts: ta
  22. remote_user: vipxf
  23. gather_facts: no
  24. vars:
  25. - package: vim
  26. tasks:
  27. - name: install vim
  28. yum: name={{ package }} state=latest
  29. - name: install configuration file
  30. become: yes
  31. become_method: su
  32. become_flags: "-"
  33. become_user: root
  34. template: src=/root/ansible-test/conf/httpd.conf dest=/root/test-template.conf
  35. notify:
  36. - check-hostname-date
  37. - name: copy file
  38. copy: src=/root/ansible-test/conf/httpd.conf dest=/home/vipxf/test-copy.conf
  39. handlers:
  40. - name: check-hostname-date
  41. shell: hostname && date
  42. ignore_errors: True
  43. - hosts: ta
  44. remote_user: vipxf
  45. gather_facts: no
  46. become: yes
  47. become_method: su
  48. become_flags: "-"
  49. become_user: root
  50. vars:
  51. - newgroup: testgroup
  52. - newuser: testuser
  53. tasks:
  54. - name: create new group
  55. group: name={{ newgroup }} system=yes
  56. - name: create new user
  57. user: name={{ newuser }} group=testgroup system=yes
  58. [root@test01 ansible-test]#
  59. [root@test01 ansible-test]# cat /etc/ansible/hosts
  60. [ta]
  61. 172.20.8.247 ansible_ssh_port=2222 ansible_ssh_user=vipxf ansible_ssh_pass=Anliven09!
  62. [ta:vars]
  63. httpd_port=80 maxClients=10
  64. [root@test01 ansible-test]#

Ansible playbook 示例说明

  1. - hosts: ta # 指定执行指定任务的主机,可以通过一个或多个由冒号分隔主机组
  2. remote_user: vipxf # 指定在远程主机执行任务的用户,也能用在task中
  3. gather_facts: no
  4. vars:
  5. - package: vim
  6. tasks: # 任务列表,在指定主机上按顺序执行各任务
  7. - name: install vim # 每个任务的名称,用于输出执行结果
  8. yum: name={{ package }} state=latest
  9. - name: install configuration file
  10. become: yes
  11. become_method: su
  12. become_flags: "-"
  13. become_user: root
  14. template: src=/root/ansible-test/conf/httpd.conf dest=/root/test-template.conf
  15. notify: # 此任务状态为changed时采取的操作,在handlers中定义
  16. - check-hostname-date
  17. - name: copy file
  18. copy: src=/root/ansible-test/conf/httpd.conf dest=/home/vipxf/test-copy.conf
  19. handlers: # 触发器,在被指定任务通知和所有任务完成的情况下只执行一次,实质上也是按序执行的任务列表
  20. - name: check-hostname-date
  21. shell: hostname && date
  22. ignore_errors: True # 如果命令或脚本的退出码不为零,使用ignore_errors来忽略错误信息
  23. - hosts: ta # playbook文件可以有多个play
  24. remote_user: vipxf
  25. gather_facts: no
  26. become: yes
  27. become_method: su
  28. become_flags: "-"
  29. become_user: root
  30. vars:
  31. - newgroup: testgroup
  32. - newuser: testuser
  33. tasks:
  34. - name: create new group
  35. group: name={{ newgroup }} system=yes
  36. - name: create new user
  37. user: name={{ newuser }} group=testgroup system=yes

相关命令

  1. # Ansible具有幂等性,会自动跳过没有变化的部分
  2. # 建议使用绝对路径来执行playbook的yaml文件
  3. # 语法检查 和 预测试 不能保证结果绝对正确,实际的运行测试是有必要的
  4. # 特别注意yml文件的内容格式(空格、缩进)、特殊字符等,必要时重写重建
  5. --------------------------------------------------------------------------------
  6. ## 列出主机列表、任务列表和标签列表
  7. ansible-playbook --list-hosts --list-tasks --list-tags sample.yaml
  8. --------------------------------------------------------------------------------
  9. ## 检查内容语法错误
  10. ansible-playbook --syntax-check sample.yaml
  11. ## 预测试(不改变目标主机的任何设置)
  12. ansible-playbook --check sample.yaml --ask-become-pass
  13. ansible-playbook -C sample.yaml --ask-become-pass
  14. --------------------------------------------------------------------------------
  15. ## 选择playbook开始执行的任务
  16. ansible-playbook sample.yaml --start-at-task="common" # 从名称为common的任务开始执行playbook
  17. ## 详细模式下执行playbook,根据提示输入root密码
  18. ansible-playbook -v sample.yaml --ask-become-pass
  19. ## verbose mode (-vvv for more, -vvvv to enable connection debugging)
  20. ansible-playbook -vvv sample.yaml --ask-become-pass

返回结果

  1. # 一般以红色、黄色、绿色来表示执行结果
  2. - 绿色:执行成功,未更改目标主机状态
  3. - 黄色:执行成功,对目标主机完成变更,目标主机状态有变化
  4. - 紫色:执行结果出现警告或提示信息
  5. - 红色:执行失败,结果出现异常
  6. # 在playbook执行后,会明确列出任务执行状态的汇总信息
  7. # 任务执行状态包括:ok、changed、unreachable、failed、skipped、rescued、ignored

结果示例

  1. [root@test02 ~]# ip addr show
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::1/128 scope host
  7. valid_lft forever preferred_lft forever
  8. 2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
  9. link/ether 00:50:56:a1:07:78 brd ff:ff:ff:ff:ff:ff
  10. inet 172.20.8.247/24 brd 172.20.8.255 scope global noprefixroute ens192
  11. valid_lft forever preferred_lft forever
  12. inet6 fe80::250:56ff:fea1:778/64 scope link
  13. valid_lft forever preferred_lft forever
  14. [root@test02 ~]#
  15. [root@test02 ~]# vim -h | head -n 1
  16. VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 14 2019 10:43:10)
  17. [root@test02 ~]#
  18. [root@test02 ~]# pwd
  19. /root
  20. [root@test02 ~]# ll test-template.conf
  21. -rw-r--r-- 1 root root 38 Oct 17 18:18 test-template.conf
  22. [root@test02 ~]#
  23. [root@test02 ~]# ll /home/vipxf/test-copy.conf
  24. -rw-rw-r-- 1 vipxf vipxf 66 Oct 17 18:18 /home/vipxf/test-copy.conf
  25. [root@test02 ~]#
  26. [root@test02 ~]# cat /etc/group |grep test
  27. testgroup:x:995:
  28. testuser:x:994:
  29. [root@test02 ~]# cat /etc/passwd |grep test
  30. testuser:x:997:995::/home/testuser:/bin/bash
  31. [root@test02 ~]#

Ansible Playbook 条件判断(When)

when语句可以将变量、facts或此前任务的执行结果作为指定task是否执行的前提条件,也可以判断变量是否被定义。

示例-1:when

  1. - hosts: ta
  2. remote_user: vipxf
  3. gather_facts: yes
  4. tasks:
  5. - name: test
  6. shell: echo "test"
  7. when: ansible_os_family == "RedHat" and ansible_distribution_version == "7.8" # 可以使用facts、playbook 或Inventory中定义的变量
  8. - name: test1
  9. shell: echo "step1"
  10. register: result # 将执行结果定义为变量
  11. - name: test2
  12. shell: echo "step2"
  13. when: result.rc == 0 # 基于先前任务的结果来执行
  14. - name: test3
  15. shell: echo "step3"
  16. when: result.stderr != ""
  17. - name: test4
  18. shell: echo "step4"
  19. when: result.changed == "true"

示例-2:结合fail语句

  1. test.sh
  2. [vipxf@test02 ~]$ pwd
  3. /home/vipxf
  4. [vipxf@test02 ~]$
  5. [vipxf@test02 ~]$ ll test.sh
  6. -rw-rw-r-- 1 vipxf vipxf 127 Oct 21 00:11 test.sh
  7. [vipxf@test02 ~]$
  8. [vipxf@test02 ~]$ cat test.sh
  9. #!/bin/bash
  10. if [ "$1" = "Anliven" ];then
  11. echo "Success"
  12. else
  13. echo "Failed"
  14. fi
  15. [vipxf@test02 ~]$

when2.yaml

  1. [root@test01 ansible-test]# cat when2.yaml
  2. - hosts: ta
  3. remote_user: vipxf
  4. gather_facts: yes
  5. vars:
  6. - teststring: Failed
  7. tasks:
  8. - name: test1
  9. shell: sh /home/vipxf/test.sh {{ testvar }}
  10. register: result
  11. - name: test2
  12. shell: echo "rc 0"
  13. when: result.rc == 0 # 基于先前任务的结果来执行
  14. - name: test3
  15. shell: echo "Success"
  16. when: '"Success" in result.stdout' # 对stdout结果进行判断
  17. - name: test4
  18. fail: msg="Check Failed" # 任务报错并抛出msg信息
  19. when: result.stdout == (( teststring )) # 在when使用playbook中定义的变量
  20. [root@test01 ansible-test]#
  21. [root@test01 ansible-test]# ansible-playbook -v when2.yaml -e testvar=Anliven
  22. Using /etc/ansible/ansible.cfg as config file
  23. PLAY [ta] *********************************************************************************************************************************************************************************************
  24. TASK [Gathering Facts] ********************************************************************************************************************************************************************************
  25. ok: [172.20.8.247]
  26. TASK [test1] ******************************************************************************************************************************************************************************************
  27. changed: [172.20.8.247] => {"changed": true, "cmd": "sh /home/vipxf/test.sh Anliven", "delta": "0:00:00.003638", "end": "2022-10-21 18:05:00.273596", "rc": 0, "start": "2022-10-21 18:05:00.269958", "stderr": "", "stderr_lines": [], "stdout": "Success", "stdout_lines": ["Success"]}
  28. TASK [test2] ******************************************************************************************************************************************************************************************
  29. changed: [172.20.8.247] => {"changed": true, "cmd": "echo \"rc 0\"", "delta": "0:00:00.002893", "end": "2022-10-21 18:05:00.722340", "rc": 0, "start": "2022-10-21 18:05:00.719447", "stderr": "", "stderr_lines": [], "stdout": "rc 0", "stdout_lines": ["rc 0"]}
  30. TASK [test3] ******************************************************************************************************************************************************************************************
  31. changed: [172.20.8.247] => {"changed": true, "cmd": "echo \"Success\"", "delta": "0:00:00.002632", "end": "2022-10-21 18:05:01.172659", "rc": 0, "start": "2022-10-21 18:05:01.170027", "stderr": "", "stderr_lines": [], "stdout": "Success", "stdout_lines": ["Success"]}
  32. TASK [test4] ******************************************************************************************************************************************************************************************
  33. skipping: [172.20.8.247] => {"changed": false, "skip_reason": "Conditional result was False"}
  34. PLAY RECAP ********************************************************************************************************************************************************************************************
  35. 172.20.8.247 : ok=4 changed=3 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
  36. [root@test01 ansible-test]#
  37. [root@test01 ansible-test]# ansible-playbook -v when2.yaml -e testvar="test"
  38. Using /etc/ansible/ansible.cfg as config file
  39. PLAY [ta] *********************************************************************************************************************************************************************************************
  40. TASK [Gathering Facts] ********************************************************************************************************************************************************************************
  41. ok: [172.20.8.247]
  42. TASK [test1] ******************************************************************************************************************************************************************************************
  43. changed: [172.20.8.247] => {"changed": true, "cmd": "sh /home/vipxf/test.sh test", "delta": "0:00:00.003612", "end": "2022-10-21 18:06:49.907767", "rc": 0, "start": "2022-10-21 18:06:49.904155", "stderr": "", "stderr_lines": [], "stdout": "Failed", "stdout_lines": ["Failed"]}
  44. TASK [test2] ******************************************************************************************************************************************************************************************
  45. changed: [172.20.8.247] => {"changed": true, "cmd": "echo \"rc 0\"", "delta": "0:00:00.002721", "end": "2022-10-21 18:06:50.338001", "rc": 0, "start": "2022-10-21 18:06:50.335280", "stderr": "", "stderr_lines": [], "stdout": "rc 0", "stdout_lines": ["rc 0"]}
  46. TASK [test3] ******************************************************************************************************************************************************************************************
  47. skipping: [172.20.8.247] => {"changed": false, "skip_reason": "Conditional result was False"}
  48. TASK [test4] ******************************************************************************************************************************************************************************************
  49. fatal: [172.20.8.247]: FAILED! => {"changed": false, "msg": "Check Failed"}
  50. PLAY RECAP ********************************************************************************************************************************************************************************************
  51. 172.20.8.247 : ok=3 changed=2 unreachable=0 failed=1 skipped=1 rescued=0 ignored=0
  52. [root@test01 ansible-test]#

changed_when  与 failed_when

  1. # changed_when
  2. # 在条件成立时,将对应任务的执行状态设置为changed
  3. # 先执行task,并对task返回的值进行判断,当满足changed_when指定的条件时说明是执行成功的
  4. # 默认情况下执行命令完成的主机状态都为changed
  5. - name: all host run this task
  6. shell: hostname
  7. register: info
  8. changed_when: '"webserver01" in info.stdout' # 输出包含某个特定字符才能将主机状态设为changed
  9. # failed_when
  10. # 在条件成立时,将对应任务的执行状态设置为失败
  11. # 当执行失败后会将信息存在register的stderr中,通过判断指定的字符是否在stderr中来确定是否真的失败
  12. # 其实是ansible的一种错误处理机制:由fail模块组合了when条件语句的效果
  13. - name: this command prints FAILED when it fails
  14. command: echo "FAILED"
  15. register: command_result
  16. failed_when: "'FAILED' in command_result.stdout"

Ansible Playbook 循环迭代(with_items)

用来在playbook中实现循环迭代的功能。

支持元素列表、文件名(with_fileglob)、复合(with_together)、步进(with_sequence)、随机(with_random_choice)、until等多种类型循环。

  1. - name: test with_items
  2. hosts: ta
  3. remote_user: vipxf
  4. gather_facts: yes
  5. tasks:
  6. - name: test1
  7. shell: echo {{ item }} # 通过引用item变量来迭代
  8. with_items:
  9. - one
  10. - two
  11. - three
  12. - name: test2
  13. shell: echo {{ item.name }} with {{ item.value }} # 通过字典来迭代
  14. with_items:
  15. - { name: 'one', value: '111'}
  16. - { name: 'two', value: '222'}
  17. - { name: 'three', value: '333'}
  18. - name: test3
  19. copy: src={{ item }} dest=~/ mode=664 owner=vipxf group=vipxf # 把文件名作为变量循环
  20. with_fileglob:
  21. - /playbook/files/*

Ansible Playbook 角色(Roles)

  • 角色(roles)用于层次性、结构化地组织playbook
  • 通过规范的目录存储结构将变量、文件、任务、模板以及触发器等放置于单独目录
  • 通过独立的role目录将不同的playbook任务单一化,从而实现高效的代码复用
  • 在playbook中调用roles,根据层次型结构自动转载roles的变量文件、tasks以及handlers等要素信息
  • 一般用于基于主机构建服务和进程的场景
  • 可以在 /etc/ansible/ansible.cfg 中设置 roles_path 来设置roles文件路径

创建role

  1. 1. 创建 roles 名称的目录
  2. 2. roles 目录中分别创建各角色命名的目录,如webserver
  3. 3. 在每个角色命名的目录中分别创建defaultsfileshandlersmetataskstemplatesvars等目录;如果为空目录则不被引用
  4. 4. roles的整体编排文件playbook中调用各角色

目录结构说明

  1. site.yml # playbook文件,roles的整体编排文件
  2. roles/ # 定义各角色的总目录
  3. common/ # 角色role模块名,在playbook中需要调用时使用的名称
  4. default/ # 默认变量文件目录(定义此角色的默认变量),至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来
  5. files/ # 存放由copy或script等模块调用的文件
  6. handlers/ # 触发器文件目录,至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来
  7. meta/ # 此角色的元数据(特殊设定及其依赖关系),至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来
  8. tasks/ # 任务文件目录,至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来
  9. templates/ # 模板文件目录,template模块会自动在此目录中寻找
  10. vars/ # 变量文件目录,至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来
  11. webserver/ # 角色 webserver 目录
  12. default/
  13. files/
  14. handlers/
  15. meta/
  16. tasks/
  17. templates/
  18. vars/

调用方式

在playbook中可以通过关键字 roles 来调用角色role。

  1. - hosts: webserver
  2. remote_user: anliven
  3. roles: # 使用关键字roles调用角色role
  4. - common # 调用role
  5. - webserver # 调研多个role
  6. - hosts: webserver
  7. remote_user: anliven
  8. roles:
  9. - common
  10. - { role: foo_app_instance, dir:'/opt/a',port:5000} # 可以向roles传递参数
  11. - { role: foo_app_instance, dir:'/opt/b',port:5001}
  12. - hostswebserver
  13. remote_user: anliven
  14. roles:
  15. - { role: some_role, when: "ansible_so_family == 'RedHat" } # 指定调用roles的条件

Ansible Playbook 标签(Tags)

  • 通过标签(tags)可以选择运行或跳过playbook中的指定任务
  • 在playbook为任务定义一个"标签",在通过ansible-playbook命令执行此playbook时使用 --tags 或 --skip-tags选项选择运行或跳过这个任务
  • 可以使用系统特殊标签,也可以自定义标签
  • 可以为同一个任务设定多个标签,也可以为不同的任务设定相同的标签

语法格式

  1. # 格式1
  2. tags:
  3. - testtag
  4. - t2
  5. # 格式2
  6. tags: testtag,t2
  7. # 格式3
  8. tags: ['testtag','t2']

特殊标签

  1. always 除非--skip-tags选项指定,否则 always 标签的task会一直执行
  2. never 除非--tags选项指定,否则 never 标签的task都不会执行
  3. tagged 不包括never的所有标签
  4. untagged 所有无标签和always标签
  5. all 包括非never标签和无标签

选项

  1. # 如果执行 ansible-playbook 时不指定标签,则会执行所有非 never 标签的任务
  2. --tags "tag1,tag2..." 执行指定标签和always标签的tasks
  3. --tags always  只执行always标签的tasks
  4. --tags all 执行所有非never标签和无标签的tasks
  5. --tags never 执行alwaysnever标签的tasks
  6. --tags tagged 执行所有标签的tasks,但不包括never标签的tasks
  7. --tags untagged 执行所有无标签和always标签的tasks
  8. --skip-tags "tag1,tag2..."  跳过指定标签的tasks
  9. --list-tags 查看playbook中哪些tags会被执行

tags示例

  1. tasks:
  2. - name: install package
  3. yum: name={{ packagename }} state=latest
  4. tags:
  5. - always
  6. - name: copy configuration file
  7. copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  8. tags: conf,http

命令示例

  1. ansible-playbook nginx_tags.yaml --tags "testtag,t2"

Ansible Playbook 调试(Debug)

  • Print statements during execution
  • 在Ansible Playbook中常使用debug模块,可以在Playbook执行过程打印调试信息
  • 结合when条件语句一起使用时,可以调试特定条件下的执行过程

注意:在setup模块中查询出来的变量,直接可以在debug中直接作为变量引用。

  1. # msg
  2. 输出自定义信息,如果不指定或不写msg的话,默认也会输出“null
  3. # var
  4. - 指定要打印的变量名,与msg参数互斥,二者只能有一个
  5. - var参数中的变量不需要使用{{}}表达式,而msg中需要
  6. # verbosity
  7. - debug的调试级别,默认0是全部显示,级别调整到3是忽略内容不显示
  8. - 在命令中使用-vvv参数,可以在设置为3情况下仍然显示debug内容

示例

  1. tasks:
  2. - name: Host run this task
  3. debug: 'msg="{{ ansible_fqdn }} and {{ ansible_default_ipv4.address }}"' # 打印必要信息
  4. when: ansible_memtotal_mb < 500 and ansible_processor_cores == 2 # 结合when使用
  5. - name: all host run this task
  6. shell: hostname
  7. register: info
  8. - name: Hostname is webserver01 Machie run this task
  9. debug: 'msg="{{ ansible_fqdn }}"'
  10. when: info['stdout'].startswith('Success')
  11. - name: Show debug info
  12. debug: var=info verbosity=1 # 打印var变量信息,调试级别为1

Ansilbe 加密解密

ansible-vault 用途

  • encryption/decryption utility for Ansible data files
  • 主要应用于包含敏感信息的场景,可以加密和解密敏感信息
  • See 'ansible-vault --help' for more information on a specific command.
  1. # ansible-vault -h
  2. usage: ansible-vault [-h] [--version] [-v]
  3. {create,decrypt,edit,view,encrypt,encrypt_string,rekey}
  4. ...
  5. encryption/decryption utility for Ansible data files
  6. positional arguments:
  7. {create,decrypt,edit,view,encrypt,encrypt_string,rekey}
  8. create Create new vault encrypted file
  9. decrypt Decrypt vault encrypted file
  10. edit Edit vault encrypted file
  11. view View vault encrypted file
  12. encrypt Encrypt YAML file
  13. encrypt_string Encrypt a string
  14. rekey Re-key a vault encrypted file
  15. optional arguments:
  16. --version show program's version number, config file location, configured module search path, module location, executable location and exit
  17. -h, --help show this help message and exit
  18. -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging)
  19. See 'ansible-vault <command> --help' for more information on a specific command.

ansible-vault 常用命令

  1. # 加密文件
  2. ansible-vault encrypt test-vault.yml
  3. ansible-vault encrypt test-vault.yml --vault-password-file pwdfile
  4. # 解密文件
  5. ansible-vault decrypt test-vault.yml
  6. ansible-vault decrypt test-vault.yml --vault-password-file pwdfile
  7. # 查看文件
  8. ansible-vault view test-vault.yml
  9. ansible-vault view test-vault.yml --vault-password-file pwdfile
  10. # 重置文件密码
  11. ansible-vault rekey test-vault.yml
  12. ansible-vault rekey test-vault.yml --vault-password-file pwdfile --new-vault-password-file pwdfilenew
  13. # 创建加密文件
  14. ansible-vault create test-vault.yml
  15. ansible-vault create test-vault.yml --vault-password-file pwdfile
  16. # 编辑加密文件
  17. ansible-vault edit test-vault.yml
  18. ansible-vault edit test-vault.yml --vault-password-file pwdfile
  19. # 加密字符串
  20. ansible-vault encrypt_string 'test123456'
  21. ansible-vault encrypt_string 'test123456' --name 'ansible_ssh_pass'
  22. ansible-vault encrypt_string 'test123456' --name 'ansible_ssh_pass' --vault-id anliven@pwdfile

ansible-vault "--vault-id"选项

  1. # 从ansible2.4版本开始,官方推荐使用"--vault-id"选项代替"--vault-password-file"选项指定密码文件
  2. # “--vault-id prompt”功能上等同于"--ask-vault-pass"选项
  3. # 支持同时使用多个密码文件进行解密,适用于“引用其他文件”的场景
  4. # 可以在被加密文件中包含特定字符“做记号”
  5. ansible-vault encrypt_string 'test123456' --name 'ansible_ssh_pass' --vault-id pwdfile # 加密字符串
  6. ansible-vault encrypt test-vault.yml --vault-id pwdfile # 加密文件
  7. ansible-vault encrypt test-vault.yml --vault-id anliven@pwdfile # 加密完成后的文件内容包含anliven字符
  8. ansible-vault decrypt test-vault.yml --vault-id pwdfile # 解密文件
  9. ansible-vault view test-vault.yml --vault-id pwdfile # 查看文件
  10. ansible-vault edit test-vault.yml --vault-id pwdfile # 编辑文件
  11. ansible-vault rekey test-vault.yml --vault-id pwdfile # 交互式密码重置
  12. ansible-vault rekey test-vault.yml --vault-id pwdfile --new-vault-id pwdfilenew # 通过新密码文件重置
  13. ansible-playbook test-vault.yml --vault-id pwdfile # 运行playbook
  14. ansible-playbook test-vault.yml --vault-id pwdfile1 --vault-id pwdfile2 # 提供多个密码文件来解密,test-vault.yml中引用其他vault加密文件
  15. ansible-playbook test-vault1.yml test-vault2.yml --vault-id pwdfile1 --vault-id pwdfile2 # 提供多个加密文件来解密多个文件

ansible-vault 示例

示例-1 交互式密码

  1. [root@test01 ansible-test]# cat test-vault.yml
  2. - hosts: ta
  3. gather_facts: no
  4. tasks:
  5. - debug:
  6. msg: "test ansible-vault"
  7. [root@test01 ansible-test]#
  8. [root@test01 ansible-test]# ansible-playbook test-vault.yml
  9. PLAY [ta] *********************************************************************************************************************************************************************************************
  10. TASK [debug] ******************************************************************************************************************************************************************************************
  11. ok: [172.20.8.247] => {
  12. "msg": "test ansible-vault"
  13. }
  14. PLAY RECAP ********************************************************************************************************************************************************************************************
  15. 172.20.8.247 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  16. [root@test01 ansible-test]#
  17. [root@test01 ansible-test]# ansible-vault encrypt test-vault.yml
  18. New Vault password:
  19. Confirm New Vault password:
  20. Encryption successful
  21. [root@test01 ansible-test]#
  22. [root@test01 ansible-test]# cat test-vault.yml
  23. $ANSIBLE_VAULT;1.1;AES256
  24. 32656239643632646139633938613430326139636636333235346361643161393131396661366534
  25. 6636386331316239616632316137316266316266646432360a366366643232313033343835346638
  26. 38616331636639643731633766333335613763623636333363336238353931616263313637313834
  27. 3135656632343034340a316238656238336432386638373236653738306530383232626231333438
  28. 38666338346130333561316535353637616230633634346162303730393166396230616533396435
  29. 38346536306433653566373438303565373036663138366330313836356666656639393438396134
  30. 35333465623365636531653562363366323065316238333333353863376236373362373832633636
  31. 62613732666263306531653231353931326635303533623934633235396239613838613230323862
  32. 3134
  33. [root@test01 ansible-test]#
  34. [root@test01 ansible-test]# ansible-vault view test-vault.yml
  35. Vault password:
  36. - hosts: ta
  37. gather_facts: no
  38. tasks:
  39. - debug:
  40. msg: "test ansible-vault"
  41. [root@test01 ansible-test]#
  42. [root@test01 ansible-test]# ansible-playbook --ask-vault-pass test-vault.yml
  43. Vault password:
  44. PLAY [ta] *********************************************************************************************************************************************************************************************
  45. TASK [debug] ******************************************************************************************************************************************************************************************
  46. ok: [172.20.8.247] => {
  47. "msg": "test ansible-vault"
  48. }
  49. PLAY RECAP ********************************************************************************************************************************************************************************************
  50. 172.20.8.247 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  51. [root@test01 ansible-test]#
  52. [root@test01 ansible-test]# ansible-vault decrypt test-vault.yml
  53. Vault password:
  54. Decryption successful
  55. [root@test01 ansible-test]#
  56. [root@test01 ansible-test]# cat test-vault.yml
  57. - hosts: ta
  58. gather_facts: no
  59. tasks:
  60. - debug:
  61. msg: "test ansible-vault"
  62. [root@test01 ansible-test]#

示例-2 密码文件

  1. [root@test01 ansible-test]# echo "This-is_a#Test!2o22" > pwdfile
  2. echo "This-is_a#Testhistoryo22" > pwdfile
  3. [root@test01 ansible-test]#
  4. [root@test01 ansible-test]# cat pwdfile
  5. This-is_a#Testhistoryo22
  6. [root@test01 ansible-test]#
  7. [root@test01 ansible-test]# ansible-vault encrypt test-vault.yml --vault-password-file pwdfile
  8. Encryption successful
  9. [root@test01 ansible-test]#
  10. [root@test01 ansible-test]# cat test-vault.yml
  11. $ANSIBLE_VAULT;1.1;AES256
  12. 63343030376661643237653266366133313735363630353564363631376563613236383863346264
  13. 6163303562643831636237633038373265616334343234630a613466663138396334303463623665
  14. 30353632396236306435633062383864646466616261393064313633373635353633656161393266
  15. 3234326635323438610a376631323634316663313130356466306238306638613261663138333663
  16. 30363461616433643530656562313139303831346365346531303530666236373038306435636338
  17. 39666432326465313834613164356436653366656138613634303339346130353033313330303733
  18. 30643934383363333261646366396330343164393236633138383137316166643966393838396464
  19. 64323863306539333534663938393962326231373137613630623635313534356163363261626262
  20. 3765
  21. [root@test01 ansible-test]#
  22. [root@test01 ansible-test]# ansible-vault view test-vault.yml --vault-password-file pwdfile
  23. - hosts: ta
  24. gather_facts: no
  25. tasks:
  26. - debug:
  27. msg: "test ansible-vault"
  28. [root@test01 ansible-test]#
  29. [root@test01 ansible-test]# ansible-playbook test-vault.yml --vault-password-file pwdfile
  30. PLAY [ta] *********************************************************************************************************************************************************************************************
  31. TASK [debug] ******************************************************************************************************************************************************************************************
  32. ok: [172.20.8.247] => {
  33. "msg": "test ansible-vault"
  34. }
  35. PLAY RECAP ********************************************************************************************************************************************************************************************
  36. 172.20.8.247 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  37. [root@test01 ansible-test]#
  38. [root@test01 ansible-test]# ansible-vault decrypt test-vault.yml --vault-password-file pwdfile
  39. Decryption successful
  40. [root@test01 ansible-test]#
  41. [root@test01 ansible-test]# cat test-vault.yml
  42. - hosts: ta
  43. gather_facts: no
  44. tasks:
  45. - debug:
  46. msg: "test ansible-vault"
  47. [root@test01 ansible-test]#

示例-3 加密字符串

  1. [root@test01 ansible-test]# ansible-vault encrypt_string "test123456"
  2. New Vault password:
  3. Confirm New Vault password:
  4. !vault |
  5. $ANSIBLE_VAULT;1.1;AES256
  6. 33383336353737346430653165326665393430346539376334396335336530613330643764313962
  7. 3438366538366262316666353962663564666532393333300a333934633664393262653065343864
  8. 63653361666133363862353061323238376335666165313130393664623761393033343136343265
  9. 6166663630353038380a666164643565343336373062323135643038363436343938383363303632
  10. 6230
  11. Encryption successful
  12. [root@test01 ansible-test]#
  13. [root@test01 ansible-test]# vim test-encrypt_string.yaml
  14. [root@test01 ansible-test]#
  15. [root@test01 ansible-test]# cat test-encrypt_string.yaml
  16. - hosts: ta
  17. gather_facts: no
  18. vars:
  19. test_user: "testuser"
  20. test_passwd: !vault |
  21. $ANSIBLE_VAULT;1.1;AES256
  22. 33383336353737346430653165326665393430346539376334396335336530613330643764313962
  23. 3438366538366262316666353962663564666532393333300a333934633664393262653065343864
  24. 63653361666133363862353061323238376335666165313130393664623761393033343136343265
  25. 6166663630353038380a666164643565343336373062323135643038363436343938383363303632
  26. 6230
  27. tasks:
  28. - debug:
  29. msg: "{{test_user}}"
  30. - debug:
  31. msg: "{{test_passwd}}"
  32. [root@test01 ansible-test]#
  33. [root@test01 ansible-test]# ansible-playbook test-encrypt_string.yaml --ask-vault-pass
  34. Vault password:
  35. PLAY [ta] *********************************************************************************************************************************************************************************************
  36. TASK [debug] ******************************************************************************************************************************************************************************************
  37. ok: [172.20.8.247] => {
  38. "msg": "testuser"
  39. }
  40. TASK [debug] ******************************************************************************************************************************************************************************************
  41. ok: [172.20.8.247] => {
  42. "msg": "test123456"
  43. }
  44. PLAY RECAP ********************************************************************************************************************************************************************************************
  45. 172.20.8.247 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  46. [root@test01 ansible-test]#

示例-4 通过密码文件加密字符串

  1. [root@test01 ansible-test]# ansible-vault encrypt_string "test123456" --name "test_passwd" --vault-id anliven@pwdfile
  2. test_passwd: !vault |
  3. $ANSIBLE_VAULT;1.2;AES256;anliven
  4. 61646130623833333634646632393432326431383864663134356530323536663165303061313661
  5. 3365343837623564343037663236316635666565613730350a393731646238376638363365363561
  6. 35383465336137313134306363363139386537633839393363653465333161303634313832383136
  7. 3038326464613935350a383565343261363833333631663862336464303538323561363237326637
  8. 3431
  9. Encryption successful
  10. [root@test01 ansible-test]#
  11. [root@test01 ansible-test]# vim test-encrypt_string.yaml
  12. [root@test01 ansible-test]# cat test-encrypt_string.yaml
  13. - hosts: ta
  14. gather_facts: no
  15. vars:
  16. test_user: "testuser"
  17. test_passwd: !vault |
  18. $ANSIBLE_VAULT;1.2;AES256;anliven
  19. 61646130623833333634646632393432326431383864663134356530323536663165303061313661
  20. 3365343837623564343037663236316635666565613730350a393731646238376638363365363561
  21. 35383465336137313134306363363139386537633839393363653465333161303634313832383136
  22. 3038326464613935350a383565343261363833333631663862336464303538323561363237326637
  23. 3431
  24. tasks:
  25. - debug:
  26. msg: "{{test_user}}"
  27. - debug:
  28. msg: "{{test_passwd}}"
  29. [root@test01 ansible-test]#
  30. [root@test01 ansible-test]# ansible-playbook test-encrypt_string.yaml --vault-id pwdfile
  31. PLAY [ta] *********************************************************************************************************************************************************************************************
  32. TASK [debug] ******************************************************************************************************************************************************************************************
  33. ok: [172.20.8.247] => {
  34. "msg": "testuser"
  35. }
  36. TASK [debug] ******************************************************************************************************************************************************************************************
  37. ok: [172.20.8.247] => {
  38. "msg": "test123456"
  39. }
  40. PLAY RECAP ********************************************************************************************************************************************************************************************
  41. 172.20.8.247 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  42. [root@test01 ansible-test]#

Ansible 性能优化

在默认设置的情况下,Ansible的执行效率已经可以满足大多数场景。

面对巨量目标主机时,可以通过一些配置优化去再提高ansible的执行效率。

Ansible 基本设置

  1. # 通过 time 命令统计执行时间
  2. time <ansible-command>
  3. # 关闭SSH密钥检测
  4. - SSH登录远程设备时,默认该设备会检查远程主机的公钥,并且将该公钥记录在~/.ssh/known_hosts文件中
  5. - 当下次该主机访问时会核对公钥,如果公钥不同则会发出警告,如果公钥相同,则会提示输入密码
  6. - 对主机公钥的检查是根据StrictHostKeyChecking变量的检查级别确定:no(不检查)、ask(是否检查要询问)、yes(每次都检查)、False(关闭检查)
  7. - 设置 /etc/ansible/ansible.cfg 中参数 host_key_checking = False
  8. # 并发数forks
  9. - Ansible默认只会创建5个进程并发执行任务,所以在任务中只能同时控制5台主机执行
  10. - forks是线程数,受限于CPU的核心数,加大forks值能让CPU尽量提升并发数量,一定程度上提高执行效率
  11. - 设置 /etc/ansible/ansible.cfg forks 参数,默认值为5
  12. - 在执行命令时通过 -f 参数指定并发数
  13. # 关闭 gather_facts
  14. - playbook默认执行第一个tasksgather_facts,用于收集主机信息
  15. - 如果任务并不需要调用主机信息变量,建议关闭可以减少Ansible在收集客户端信息的时间,提高运行速度
  16. - 可以在playbook文件中设置gather_facts参数为falseno(不区分大小写)
  17. gather_facts: False
  18. gather_facts: no
  19. - 也可以设置 /etc/ansible/ansible.cfg 中参数
  20. gather_facts: no
  21. # 设置 facts缓存
  22. - 不过禁用facts,可以采用facts缓存保证一定的运行效率来使用facts信息
  23. - ansible.cfg中可以配置多种facts缓存的方式:json文件,redismemcache
  24. - 使用redis存储facts文件需安装redis和响应的python
  25. - json文件方式为例
  26. gathering=smart
  27. fact_caching_timeout=86400
  28. fact_caching=jsonfile
  29. fact_caching_connection=/path/to/ansible_fact_cache
  30. # serial滚动更新
  31. - 并发可以在ansible.cfg里修改配置,也可以在playbook中限制服务端的并发数量
  32. - Ansible默认将尝试并行管理playbook中所有的机器,可以使用serial关键字定义一次应管理多少主机
  33. - 常应用与负载均衡环境下,不能一次性停止所有主机的场景
  34. - play或者task下都可以设置serial参数,但其值对应的主机数不应大于forks
  35. serial: "30%" # 按百分比执行
  36. serial: 2 # 指定单次执行数量
  37. # OpenSSH链接优化(非必要,不建议)
  38. - 默认情况下,使用OpenSSH时,服务器端会根据客户端的IP地址进行DNS反向解析,然后根据获取到的主机名再次进行DNS查询得到IP地址,比较这两个IP地址是否一致
  39. - 可以在一定程度上提高安全性,但会花费更多时间,可以关闭这一特性来实现加速SSH链接速度
  40. - 设置 /etc/ssh/sshd_config 中参数 UseDNS no
  41. # 开启pipeling
  42. - 发送执行命令代替命令临时文件(针对不使用sudo的场景,建议以单独ansible.cfg文件方式开启)
  43. - 设置 /etc/ansible/ansible.cfg 中参数 pipelining = True

Ansible 异步async与轮询polling特性

  1. # Ansible的异步async与轮询polling特性
  2. # 适合使用到ansible的polling特性的场景
  3. # - task需要运行很长的时间,这个task很可能会达到timeout
  4. # - 任务需要在大量的机器上面运行
  5. # - 任务是不需要等待它完成的
  6. # 不适合使用polling特性的场景
  7. # - task任务是需要运行完后才能继续另外的任务的
  8. # - task任务能很快的完成
  9. # 注意:需在ansible服务端的/etc/ansible/ansible.cfg文件里配置"host_key_checking = False"
  10. - hosts: all
  11. max_fail_percentage: 30 # 主机数最大失败百分比,只有在大于时中止tasks的执行,结合serial参数则以serial值为基准
  12. serial: 7 # 定义同时执行操作的主机数,一般要小于forks的值,否则会按forks值进行“分片”执行任务
  13. tasks:
  14. - name: test-1
  15. shell: sleep 5 && echo "test-1 done" && hostname && date
  16. async: 9 # 任务执行时间的上限值,超时则任务失败,建议设置为略大于任务正常实际执行时长,设置为0时表示一直等待任务结束
  17. poll: 2 # 检查任务结果的间隔时长,建议设置为小于任务实际执行时长,设置为0表示不用等待结果继续执行后续任务
  18. register: script_result
  19. - name: test-2
  20. async_status: jid={{ script_result.ansible_job_id }} # 通过模块async_status查看轮询结果
  21. register: job_result
  22. until: job_result.finished #
  23. retries: 10 # 重试10次
  24. - name: test-3 # 将在所有主机执行完成后一次性返回结果
  25. shell: echo "test-3 done" && hostname && date

Ansible 图形界面

Ansible Web UI目前主要有官方商业版Tower、官方开源版AWX 和 开源免费版semaphore。

Ansible Tower

Ansible AWX

semaphore


Ansible 技巧提示

1 - Ansible 免密登录

  1. # 通过秘钥方式连接
  2. ssh-keygen -t rsa
  3. ssh-copy-id -i /vipxf/.ssh/id_rsa.pub root@192.168.56.101
  4. ssh-copy-id -i /vipxf/.ssh/id_rsa.pub root@127.0.0.1

2 - Ansible playbook输入root密码

  1. [root@test01 ansible-test]# cat test-temp.yaml
  2. ---
  3. - name: test-root
  4. hosts: ta
  5. remote_user: vipxf
  6. gather_facts: no
  7. become: yes
  8. become_user: root
  9. become_method: su
  10. become_flags: "-"
  11. vars:
  12. ansible_become_pass: "{{ root_pass_input }}"
  13. tasks:
  14. - name: test
  15. shell: date && sleep 3
  16. ignore_errors: True
  17. [root@test01 ansible-test]#
  18. [root@test01 ansible-test]# ansible-playbook test-temp.yaml -e root_pass_input=redhat
  19. PLAY [test-root] **************************************************************************************************************************************************************************************************************
  20. TASK [test] *******************************************************************************************************************************************************************************************************************
  21. changed: [172.20.8.247]
  22. PLAY RECAP ********************************************************************************************************************************************************************************************************************
  23. 172.20.8.247 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  24. [root@test01 ansible-test]#

3 - Ansible 简单的复用方式

通过关键字include可以实现简单的代码复用。

  1. # 在playbook中,Include 指令可以跟task 混合在一起使用
  2. - tasks:
  3. - include: tasks/foo.yml # 引用配置文件
  4. # 参数化的include
  5. - tasks:
  6. - include: aaa.yml user=anliven # 引用配置文件的同时传入变量
  7. - include: bbb.yml pwd=P@ssw0rd

4 - Ansible task通知多个handlers任务

通过关键字listen为handlers中的一个或多个触发器任务指定主题,task就可以按主题名进行通知。

触发顺序按照handler定义的先后顺序执行。

  1. ---
  2. - hosts: ta
  3. remote_user: vipxf
  4. gather_facts: no
  5. vars:
  6. - package: vim
  7. tasks:
  8. - name: test-step one
  9. shell: echo "111"
  10. notify: "test listen" # task通知handlers主题
  11. - name: test-step two
  12. shell: echo "222"
  13. handlers:
  14. - name: check-hostname-date
  15. shell: hostname && date
  16. ignore_errors: True
  17. listen: "test listen" # 按照定义顺序被触发
  18. - name: who-am-i
  19. shell: whoami && date
  20. ignore_errors: True
  21. listen: "test listen" # 按照定义顺序被触发

独立章节索引


自动化利器 Ansible - 从了解到应用的更多相关文章

  1. 安全运维中基线检查的自动化之ansible工具巧用

    i春秋作家:yanzm 原文来自:安全运维中基线检查的自动化之ansible工具巧用 前几周斗哥分享了基线检查获取数据的脚本,但是在面对上百台的服务器,每台服务器上都跑一遍脚本那工作量可想而知,而且都 ...

  2. 运维自动化神器ansible之user模块

    运维自动化神器ansible之user模块 一.概述   user模块 可管理远程主机上的 用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 二.参数介绍   name: 用于指定操作 ...

  3. 运维自动化之ansible的安装与使用 转

    运维自动化之ansible的安装与使用 随着服务器数量的增长,我们需要一个批量工具去提高工作效率,之前用的是puppet,ansible的简单,适用让我眼前一亮,决定写一篇ansible从安装到基本配 ...

  4. 自动化运维利器Ansible要点汇总

    由于大部分互联网公司服务器环境复杂,线上线下环境.测试正式环境.分区环境.客户项目环境等造成每个应用都要重新部署,而且服务器数量少则几十台,多则千台,若手工一台台部署效率低下,且容易出错,不利后期运维 ...

  5. 在 CentOS 7 中安装并使用自动化工具 Ansible

    Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于Chef和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端.它使用SSH来和节点进 ...

  6. 在Debian 8 上安装自动化工具Ansible

    如果你是新手,就不要犹豫了,ansible是你最好的选择,本人菜鸟一个.废话少说,开始安装! 实验环境: 192.168.3.190 192.168.3.191 192.168.3.192 192.1 ...

  7. 自动化工具-ansible服务部署与使用

    1.前言 1.1ansible软件介绍 python 语言是运维人员必须会的语言 ansible 是一个基于python 开发的自动化运维工具 其功能实现基于ssh远程连接服务 ansible 可以实 ...

  8. 运维自动化工具ansible

    企业级自动化运维工具应用实战ansible 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出 ...

  9. 运维之利器--Ansible

    一.简介 Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署. ...

随机推荐

  1. 一个监控工具monit

    最近看了一个问题,monit监控在读取配置文件之后,访问的文件是残留在容器中的,导致认为服务异常,其实一开始容器启动,并没有对应的服务. [root@10-36-235-119.fin-wealth- ...

  2. QQ高级功能

    本篇文章为微信公众号:酿俗 教学内容请跟着小编一起探索吧! 第一步解锁微信豆影藏内容 随后下载需要的材料,注意!手机可能会提示有病毒!这里使用这些功能报病毒很正常 其实并没有病毒只是手机厂商的安全系统 ...

  3. 第五十三篇:Vue安装Element ui

    好家伙,之前写的一篇过时了,用不了了,更新一波 (已新建一个vue项目) 1. 在项目目录下执行:npm i element-ui -S 2. 在main.js中写入 import ElementUI ...

  4. 第七章 完成kubernetes集群部署并验证

    在其中一运算个节点上操作就行 创建nginx资源配置清单的yaml文件 [root@hdss7-21 ~]# vim /opt/kubernetes/conf/nginx-ds.yaml apiVer ...

  5. Dubbo本地调试

    dubbo 启动标志 Dubbo service server started <dubbo:reference id="transferTimingUploadHisRPCServi ...

  6. 手写tomcat——编写一个echo http服务器

    核心代码如下: public class DiyTomcat1 { public void run() throws IOException { ServerSocket serverSocket = ...

  7. Vben Admin 源码学习:状态管理-角色权限

    前言 本文将对 Vue-Vben-Admin 角色权限的状态管理进行源码解读,耐心读完,相信您一定会有所收获! 更多系列文章详见专栏   Vben Admin 项目分析&实践 . 本文涉及到角 ...

  8. Centos7.6内核升级

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483766&idx=1&sn=4750fd4e ...

  9. gitlab添加新用户

    添加用户的时候没法给用户设置密码,可以等用户添加后,编辑用户的时候给用户设置密码 新用户首次登陆后需要重置密码 新用户登陆后是英文界面,设置成中文界面

  10. Readsh中文版初始设置

    B站视频教程网址:https://space.bilibili.com/630285695/video 安装成功后,打开浏览器输入http://ip:5000如果出现如下画面,即告安装成功. 初始设置 ...