一、简介
Ansible是基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能的自动化运维工具,广泛用于配置管理、应用部署以及任务协调等领域。
Ansible是基于模块工作的,架构图如上图所示,主要包括:
- connection plugins:负责和被监控端实现通信;
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
- 各种模块核心模块、command模块、自定义模块;
- 借助于插件完成记录日志邮件等功能;
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible优点:
- 部署较为简单, 只需要在控制主机上部署ansible环境,并做好SSH免密登陆
- 被管控节点无需安装Agent
- 无服务端,使用是直接调用控制端命令或者脚本
- 基于模块工作, 可以使用任意语言开发模块
- 基于yaml语法编写playbook
Ansible缺点:
- 需要学习Ansible自定义的脚本语法规则,语法规则较为严格
- ansible只适用于Linux系统
二、Ansible 命令帮助
基本语法:
$ ansible <host-pattern> [options]
参数 | 说明 |
-a MODULE_ARGS, --args=MODULE_ARGS | 模块参数 |
--ask-vault-pass | 询问保险库密码 |
-B SECONDS, --background=SECONDS | 异步运行,X 秒后失败 (默认=N/A) |
-C, --check | 不要做任何改变;相反,尝试预测可能发生的一些变化 |
-D, --diff | 更改(小)文件和模板时,显示这些文件中的差异; 与 --check 配合使用效果很好 |
-e EXTRA_VARS, --extra-vars=EXTRA_VARS | 将附加变量设置为 key=value 或 YAML/JSON |
-f FORKS, --forks=FORKS | 指定要使用的并行进程数 (default=5) |
-h, --help | 显示此帮助信息并退出 |
-i INVENTORY, --inventory-file=INVENTORY | 指定清单主机路径(默认=/etc/ansible/hosts)或逗号分隔的主机列表 |
-l SUBSET, --limit=SUBSET | 进一步将选定主机限制为其他模式 |
--list-hosts | 输出匹配主机列表;不执行任何其他操作 |
-m MODULE_NAME, --module-name=MODULE_NAME | 要执行的模块名称 (default=command) |
-M MODULE_PATH, --module-path=MODULE_PATH | 指定模块库的路径 (default=None) |
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE | 用于重新生成密钥的新保管库密码文件 |
-o, --one-line | 压缩输出 |
--output=OUTPUT_FILE | 用于加密或解密的输出文件名; 使用 - 用于标准输出 |
-P POLL_INTERVAL, --poll=POLL_INTERVAL | 如果使用 -B 则设置轮询间隔(default=15) |
--syntax-check | 对 playbook 执行语法检查,但不要执行它 |
-t TREE, --tree=TREE | 将输出记录到此目录 |
--vault-password-file=VAULT_PASSWORD_FILE | 保险库密码文件 |
-v, --verbose | 详细模式(-vvv 更多,-vvvv 启用连接调试) |
--version | 显示程序的版本号并退出 |
-k, --ask-pass | 询问连接密码 |
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE | 使用此文件来验证连接 |
-u REMOTE_USER, --user=REMOTE_USER | 以此用户身份连接(default=None) |
-c CONNECTION, --connection=CONNECTION | 要使用的连接类型 (default=smart) |
-T TIMEOUT, --timeout=TIMEOUT | 以秒为单位覆盖连接超时 (default=10) |
--ssh-common-args=SSH_COMMON_ARGS | 指定要传递给 sftp/scp/ssh 的常用参数 |
--sftp-extra-args=SFTP_EXTRA_ARGS | 指定仅传递给 sftp 的额外参数 |
--scp-extra-args=SCP_EXTRA_ARGS | 指定仅传递给 scp 的额外参数 |
--ssh-extra-args=SSH_EXTRA_ARGS | 指定仅传递给 ssh 的额外参数 |
-s, --sudo | 使用 sudo (nopasswd) 运行操作(已弃用,使用 become) |
-U SUDO_USER, --sudo-user=SUDO_USER | 所需的 sudo 用户(默认=root)(已弃用,使用 become) |
-S, --su | 使用 su 运行操作(已弃用,使用 become) |
-R SU_USER, --su-user=SU_USER | 以该用户身份使用 su 运行操作(默认 = root)(已弃用,使用 become) |
-b, --become | 使用 become 运行操作(不暗示密码提示) |
--become-method=BECOME_METHOD | 要使用的权限提升方法(默认=sudo),有效选择:[ sudo |
--become-user=BECOME_USER | 以该用户身份运行操作(默认=root) |
--ask-sudo-pass | 询问 sudo 密码(已弃用,使用 become) |
--ask-su-pass | 询问 su 密码(已弃用,使用 become) |
-K, --ask-become-pass | 要求提权密码 |
2.1. 实例说明
$ ansible all --list-hosts # 检查Inventory是否生效
$ ansible all -m ping # ping所有目标
$ ansible all -i localhost, -e '{"ansible_connection": "local"}' -m ping # ping本地(不使用SSH连接)
$ ansible all -i localhost, -e '{"ansible_connection": "local"}' -a 'hostname' # 本地执行命令
$ ansible all -i localhost, -e '{"ansible_connection": "local"}' -m setup # 获取本地主机的信息
$ ansible target -m fetch -a "src=/tmp/seq dest=/tmp/seq" # 获取远程到本地
$ ansible target -m copy -a "src=/tmp/seq dest=/tmp/seq" # 拷贝本地到远程
三、Ansible Galaxy
Ansible Galaxy 是 Ansible 的官方社区中心,用于共享 Ansible 角色。一个角色是 Ansible 构建自动化内容的方式以及让它可复用。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。Ansible Galaxy 指的是一个网站共享和下载 Ansible 角色,也可以是帮助 roles 更好的工作的命令行工具。
基本语法:
$ ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
实例说明:
$ ansible-galaxy search --author <AUTHOR>
$ ansible-galaxy search --platforms <PLATFORM>
$ ansible-galaxy search --galaxy-tags <TAG>
$ ansible-galaxy info <ROLE>
$ ansible-galaxy install <ROLE> -p <ROLE_DIRECTORY>
$ ansible-galaxy install -r <ROLE1> <ROLE2> <ROLE3> ...
$ ansible-galaxy list
$ ansible-galaxy remove <ROLE>
$ ansible-galaxy init <ROLE>
$ ansible-galaxy init --offline <ROLE>
四、Ansible-Doc
Ansible-Doc是一个用于查看Ansible模块文档的命令行工具。它允许你在终端中查看Ansible模块的文档,包括模块的参数、返回值和示例。使用ansible-doc可以帮助您更好地理解Ansible模块的功能和用法,从而更有效地编写Ansible Playbooks。
基本语法:
$ ansible-doc [options] [module...]
参数说明:
-h, --help:显示此帮助信息并退出
-l, --list:列出可用模块
-M MODULE_PATH, --module-path=MODULE_PATH:指定模块库的路径 (default=None)
-s, --snippet:显示指定模块的剧本片段
-v, --verbose:详细模式(-vvv 更多,-vvvv 启用连接调试)
--version:显示程序的版本号并退出
五、Ansible-Vault
通过ansible-vault可以对任务进行加密和解密操作,比较适合一些数据敏感的场景。
基本语法:
$ ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] vaultfile.yml
参数说明:
--ask-vault-pass:询问保险库密码
-h, --help:显示此帮助信息并退出
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE:用于重新生成密钥的新保管库密码文件
--output=OUTPUT_FILE:用于加密或解密的输出文件名; 使用 - 用于标准输出
--vault-password-file=VAULT_PASSWORD_FILE:保险库密码文件
-v, --verbose:详细模式(-vvv 更多,-vvvv 启用连接调试)
--version:显示程序的版本号并退出
六、Ansible-Playbook
Ansible Playbooks 提供了一个可重复、可重用、简单的配置管理和多机部署系统,非常适合部署复杂的应用程序。Ansible Playbook 是自动化任务的蓝图,这些任务是复杂的 IT 操作,在有限或没有人为参与的情况下执行。Ansible Playbook 在一组、组或分类的主机上执行,它们共同构成一个 Ansible 清单。
Playbooks的格式是YAML,如下图:
---
- hosts: webserversvars:http_port: 80max_clients: 200remote_user: roottasks:- name: ensure apache is at the latest versionyum: pkg=httpd state=latest- name: write the apache config filetemplate: src=/srv/httpd.j2 dest=/etc/httpd.confnotify:- restart apache- name: ensure apache is runningservice: name=httpd state=startedhandlers:- name: restart apacheservice: name=httpd state=restarted
基本语法:
$ ansible-playbook playbook.yml
参数说明:
--ask-vault-pass:询问保险库密码
-C, --check:不要做任何改变;相反,尝试预测可能发生的一些变化
-D, --diff:更改(小)文件和模板时,显示这些文件中的差异;与 --check 配合使用效果很好
-e EXTRA_VARS, --extra-vars=EXTRA_VARS:将附加变量设置为 key=value 或 YAML/JSON
--flush-cache:清除事实缓存
--force-handlers:即使任务失败也运行处理程序
-f FORKS, --forks=FORKS:指定要使用的并行进程数(默认值=5)
-h, --help:显示此帮助信息并退出
-i INVENTORY, --inventory-file=INVENTORY:指定清单主机路径(默认=/etc/ansible/hosts)或逗号分隔的主机列表
-l SUBSET, --limit=SUBSET:进一步将选定主机限制为其他模式
--list-hosts:输出匹配主机列表;不执行任何其他操作
--list-tags:列出所有可用的标签
--list-tasks:列出所有将要执行的任务
-M MODULE_PATH, --module-path=MODULE_PATH:指定模块库的路径(默认=无)
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE:用于重新生成密钥的新保管库密码文件
--output=OUTPUT_FILE:用于加密或解密的输出文件名;使用 - 用于标准输出
--skip-tags=SKIP_TAGS:只运行标签与这些值不匹配的播放和任务
--start-at-task=START_AT_TASK:在匹配此名称的任务处启动剧本
--step:一步一步:在运行前确认每个任务
--syntax-check:对 playbook 执行语法检查,但不要执行它
-t TAGS, --tags=TAGS:只运行带有这些值标记的播放和任务
--vault-password-file=VAULT_PASSWORD_FILE:保险库密码文件
-v, --verbose:详细模式(-vvv 更多,-vvvv 启用连接调试)
--version:显示程序的版本号并退出
-k, --ask-pass:询问连接密码
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE:使用此文件来验证连接
-u REMOTE_USER, --user=REMOTE_USER:以此用户身份连接(默认=None)
-c CONNECTION, --connection=CONNECTION:要使用的连接类型(默认=smart)
-T TIMEOUT, --timeout=TIMEOUT:以秒为单位覆盖连接超时(默认值 = 10)
--ssh-common-args=SSH_COMMON_ARGS:指定要传递给 sftp/scp/ssh 的常用参数(例如 ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS:指定仅传递给 sftp 的额外参数(例如 -f、-l)
--scp-extra-args=SCP_EXTRA_ARGS:指定仅传递给 scp 的额外参数(例如 -l)
--ssh-extra-args=SSH_EXTRA_ARGS:指定仅传递给 ssh 的额外参数(例如 -R)
-s, --sudo:使用 sudo (nopasswd) 运行操作(已弃用,使用 become)
-U SUDO_USER, --sudo-user=SUDO_USER:所需的 sudo 用户(默认=root)(已弃用,使用become)
-R SU_USER, --su-user=SU_USER:以该用户身份使用 su 运行操作(默认 = root)(已弃用,使用become)
-b, --become:使用 become 运行操作(不暗示密码提示)
--become-method=BECOME_METHOD:要使用的权限提升方法(默认=sudo),有效选择:[ sudo | su | pbrun | pfexec | runas | doas | dzdo ]
--become-user=BECOME_USER:以该用户身份运行操作(默认=root)
-K, --ask-become-pass:要求提权密码
七、Ansible-Pull
Ansible有两种工作模式,push和pull,默认使用push工作模式,pull模式使用较少。
基本语法:
ansible-pull [-h] [--version] [-v] [--private-key PRIVATE_KEY_FILE][-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT][--ssh-common-args SSH_COMMON_ARGS][--sftp-extra-args SFTP_EXTRA_ARGS][--scp-extra-args SCP_EXTRA_ARGS][--ssh-extra-args SSH_EXTRA_ARGS][-k | --connection-password-file CONNECTION_PASSWORD_FILE][--vault-id VAULT_IDS][-J | --vault-password-file VAULT_PASSWORD_FILES][-e EXTRA_VARS] [-t TAGS] [--skip-tags SKIP_TAGS][-i INVENTORY] [--list-hosts] [-l SUBSET] [-M MODULE_PATH][-K | --become-password-file BECOME_PASSWORD_FILE][--purge] [-o] [-s SLEEP] [-f] [-d DEST] [-U URL] [--full][-C CHECKOUT] [--accept-host-key] [-m MODULE_NAME][--verify-commit] [--clean] [--track-subs] [--check][--diff][playbook.yml ...]
参数说明:
--accept-host-key:如果尚未添加,则添加 repo url 的主机密钥
--ask-vault-pass:询问保险库密码
-C CHECKOUT, --checkout=CHECKOUT:分支/标签/提交结帐。默认为存储库模块的行为。
-d DEST, --directory=DEST:签出存储库的目录
-e EXTRA_VARS, --extra-vars=EXTRA_VARS:将附加变量设置为 key=value 或 YAML/JSON
-f, --force:即使无法更新存储库也运行 playbook
--full:做一个完整的克隆,而不是一个浅的
-h, --help:显示此帮助信息并退出
-i INVENTORY, --inventory-file=INVENTORY:指定清单主机路径(默认=/etc/ansible/hosts)或逗号分隔的主机列表
-l SUBSET, --limit=SUBSET:进一步将选定主机限制为其他模式
--list-hosts:输出匹配主机列表;不执行任何其他操作
-m MODULE_NAME, --module-name=MODULE_NAME:存储库模块名称,ansible 将使用它来签出 repo。默认是 git
-M MODULE_PATH, --module-path=MODULE_PATH:指定模块库的路径(默认=无)
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE:用于重新生成密钥的新保管库密码文件
-o, --only-if-changed:仅在存储库已更新时才运行 playbook
--output=OUTPUT_FILE:用于加密或解密的输出文件名;使用 - 用于标准输出
--purge:剧本运行后清除结帐
--skip-tags=SKIP_TAGS:只运行标签与这些值不匹配的播放和任务
-s SLEEP, --sleep=SLEEP:在开始之前休眠随机间隔(在 0 到 n 秒之间)。这是分散 git 请求的有用方法
-t TAGS, --tags=TAGS:只运行带有这些值标记的播放和任务
-U URL, --url=URL:剧本存储库的 URL
--vault-password-file=VAULT_PASSWORD_FILE:保险库密码文件
-v, --verbose:详细模式(-vvv 更多,-vvvv 启用连接调试)
--verify-commit:验证签出提交的 GPG 签名,如果失败则中止运行 playbook。这就需要对应的VCS模块来支持这样的操作
--version:显示程序的版本号并退出
-k, --ask-pass:询问连接密码
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE:使用此文件来验证连接
-u REMOTE_USER, --user=REMOTE_USER:以此用户身份连接(默认=无)
-c CONNECTION, --connection=CONNECTION:要使用的连接类型(默认=智能)
-T TIMEOUT, --timeout=TIMEOUT:以秒为单位覆盖连接超时(默认值 = 10)
--ssh-common-args=SSH_COMMON_ARGS:指定要传递给 sftp/scp/ssh 的常用参数
--sftp-extra-args=SFTP_EXTRA_ARGS:指定仅传递给 sftp 的额外参数
--scp-extra-args=SCP_EXTRA_ARGS:指定仅传递给 scp 的额外参数
--ssh-extra-args=SSH_EXTRA_ARGS:指定仅传递给 ssh 的额外参数
八、术语
动作(Action)
一个动作属于一个任务的一部分,指定运行的模块,然后传递参数给此模块。每个任务之一一个动作,但是它可以有不同的参数。
Ad Hoc
指的是使用 /usr/bin/ansible 运行 Ansible 直接执行一些命令,而不是使用 /usr/bin/ansible-playbook 执行剧本。一个 ad-hoc 命令例子,可以是在你的基础设施里面重启50台机器。任何你可以做的东西, ad-hoc 都可以实现通过写一个剧本, 剧本肯定也组合了其它的一些操作。
Async
指的是一个任务配置为运行在后台,而不是等它完成。如果你有一个很长的任务要执行,而且时长可能超出 SSH 登录时长, 那么运行那个任务在 async 方式比较有意义。Async 方式可以每隔一段时间 poll 一次,等待此任务完成。它可以调整为把任务踢出去,然后不再理会它,以便后来使用。Async方式可以在 /usr/bin/ansible 和 /usr/bin/ansible-playbook下面。
Callback Plugin
指一些用户编写的代码可以从 Ansible 运行结果获取数据,并做出一些处理。 一些提供的在 Github 项目上的事例实现了自定义日志,发邮件,甚至播放声音效果。
Check Mode
指的是运行 Ansible 使用 --ckeck 选项,但是系统本身却不作出任何改变,仅仅输出可能发生的改变。这就像在其它系统上叫做 “dry run”的方式, 用户应该被警告因为这个方式没考虑到命令失败的问题,或者冲突影响。使用这个可以知道哪些东西可能会发生,但是这不是一个好的替代 staging 环境。
Connection Type, Connection Plugin
Ansible 默认用可插拨的库和远端系统通信。 Ansible 支持天然的 OpenSSH (‘ssh’) 或者 Python 实现的 ‘paramiko’ 库。如果你在使用最近的 Ansible 版本,最好使用 OpenSSH ,同时支持 Kerberos 和 jump hosts。这在文档开始部分就有提到。也有一些加速方式的连接类型,但是必须 bootstrapped 基于SSH类型的连接,但是它非常快,就像在本地系统上运行一样。用户也可以写他们自己的连接类型插件。
Conditionals
一个条件式是根据一个表达式正确或错误判断是否在一个机器上执行给定的任务。 Ansible 的条件表达式由 ‘when’ 提供,在playbook文档里面有讨论。
Diff Mode
--diff``标识可以传递给 Ansible 来展示模板文件如何改变的,或者使用 ``--check 模式时它们可能发生的改变 。这些 diffs 统一为diff格式。
Facts
Facts 是发现远端节点的信息。当它们被用在模板的时候, facts只能被引用,而不能被设置。Facts是当运行 plays 时候执行内部的’setup’模块自动收集的。你不需要明确的调用 setup 模块,它自己运行,但是当你想节省时间的时候你可以禁止它。为了方便用户转向其他系统配置工具, fact 模块可以拉取 facts 从 Chef的’ohai’ 和 Puppet的’facter’工具。
Filter Plugin
过滤插件式大多数用户从来不需要了解的东西。这允许创在新的 Jinja2 过滤,而这只对那些知道什么是 Jinja2 过滤的人有帮助。如果你需要他们,你可以从 API docs 部分学习如何写他们。
Forks
Ansible 与远端节点交流是通过并行的机制,并行机制的方式可以通过传递 ``–forks``参数设置,或者在配置文件里面编辑。默认是保守的5个线程。如果你有足够的内存,你可以很容易的设置为50或者更多值。
Gather Facts (Boolean)
上面已经提到了Facts。有时候在运行多个 playbook ,可能不想收集一些fact ,而且以后也不会用到这些值。在playbook里面设置 gather_facts:False 指示跳过收集 facts。
Globbing
Globbing 是一个一种基于通配符的方式挑选许多主机,而不是明确指定主机的名字,或者它们的组名。例如 ,使用 “www*”,来匹配所有以 “www” 开头的所有主机。这个理念直接被吸收进 Func 。除此之外,不同的 set 操作也可以通过 globbing 实现。
Group
组由几个主机组成,可以方便的当做一个目标看待,同时可以共享变量。
Group Vars
group_vars 文件位于一个目录下面,同时在 inventory 旁边,有一个可选的文件名在每个组后面。这是一个方便的位置来存放变量,提供给每个组,由其是复杂的数据结构,因此这些变量不需要嵌入在 inventory 文件或 playbook 文件里面。
Handlers
Handler 仅仅是普通的任务在Ansible playbook里面(请参考tasks)。但是仅仅当任务包含 “notify” 指令和指示它改变了一些东西的时候才运行。例如,如果一个配置文件改变了,然后任务引用这个配置文件模板通知服务器重启 handler 。这意味着服务可以被反弹仅仅他们需要重启的时候。Handler 不仅仅可以用于重启服务,但是重启服务是最通用的用法。
Host
一个host 只是简单的 Ansible 管理的远端机器。它们可以被分配私有的变量,可以被组织为一个组。所有的组有可以访问一个名字,也可以是IP地址,如果他们在默认的SSH端口不能访问,可以指定一个一个可选的端口号
Host Vars
就像”Group Vars”,一个名称为 “host_vars/” 的目录在 inventory 文件旁,可以在 invetory 文件的主机名后面包含这个文件,使用 YAML 格式。这提供一个方便的位置分配变量给这个主机而不要在 inventory 文件里面嵌入太多变量。Host Vars 文件还可以用于定义复杂的在 inventory 文件里面不断出现的数据结构。
Lazy Evaluation
总的来说, Ansible 评估任何变量在 playbook 内容在最新的可能的时间里,也就是意味着如果你定义了一个数据结构,这个数据结构自身也可以定义变量值在里面,然后每件事情就像你期望的那样工作。 这也意味着 变量字符串可以包含其它的变量在字符串里面。
Lookup Plugin
一个查询插件是从外界得到数据进入 Ansible 。这些东西就像 “with_items” ,一个基础的循环插件,但是也有其它的查询插件就像 “with_file”, 从文件加载数据,甚至有一些逡巡环境变量, DNS 文本记录,或者键值存储。 查询插件也可以被 templates 访问 ,{{ lookup('file','/path/to/file') }}.
Multi-Tier
IT 系统不是一次在同一时间只管理一个系统,而是在多个系统之间交互,一组系统,在一个定义好的顺序里面。例如,一个 web server 可能需要在数据库服务器之前更新,web server的部分内容又要在 THAT 数据库服务之后更新,同时不同的负载均衡器和监控服务器也需要被联系到。 Ansible 看待系统为整个工作流和拓扑,而不是简单的一次一个系统。
Idempotency
改变类的命令仅仅在他们需要使用的时候才被使用,最好描述系统的状态而不是如何到达系统某个状态的过程。打个比方,从美国的卡罗莱纳州到加利福尼亚州包括驾驶很长一段距离的车,但是如果我是在阿拉斯加州,则需要乘坐地铁。 Ansible的资源就像你说,“把我放到加利福尼亚”然后决定如何到达那里。如果你已经在加利福尼亚,没有什么会发生,然后他会让你知道什么都没有发生,不需要改变什么东西。
Includes
Playbook 文件可以包含其它的 plays,任务列表也可以扩展在其它文件的外部任务,就像处理器。 Include 可以被参数化的,也就是装载文件可以传递变量。例如,一个Include 表演设置Wordpress 博客站点,需要传递”user”参数,然后这个表演(play)可以 include 多于一次的博客站点,例如叫做 “alice” 和 “bob”
Inventory
一个描述主机和组的 Ansible 文件。Inventory 可以通过 “Inventory Script” 提供,有时也叫做 “External Inventory Script”
Inventory Script
一个简单的从外部资源寻找主机,主机组的成员,和变量信息的程序 – 可以是个 SQL 数据库,一个 CMDB 解决方案,或者是 LDAP。这个概念来自 Puppet (叫”External Nodes Classifier”),工作方式也是类似的。
Jinja2
Jinja2 是 Ansible 模板的首选语言。它非常简单,很容易阅读和书写。
JSON
Ansible 从远端机器上返回的数据使用 JSON 类型。这使得模块可以使用任何语言编写,而不仅仅是Python。
Library
许多模块的集合供 /usr/bin/ansible 或 Ansible Playbook 使用。
Limit Groups
通过传递 --limit somegroup 参数给 ansible 或 ansible-playbook ,命令可以限制为一些主机的子集 。例如这可以使目标为全部的服务器到只允许一个服务器运行 playbook 。
Local Connection
通过在 playbook 中使用 “connection:local” ,或者传递 “-c local” 给 /usr/bin/ansible ,这指明了我们正在管理本地主机而不是远端机器。
Local Action
local_action 指令在 playbook 意味着给予的步骤仅仅会在本地机器上运行, 但是这变量 ‘{{ ansible_hostname }}’可以被传递到远端机器引用。这可以被用于触发器,例如,rsync 操作。
Loops
通常来说, Ansible 不是一个编程语言。它跟喜欢声明,尽管不同的结果像 “with_items” 使得指定的任务重复的实验多个 items 在一个列表里面。特定的模块,例如 yum 和 apt ,对这更喜欢,可以安装多个包,然后加速了配置的总时间。
Modules
Module 是 Ansible 运行远端机器的单元。模块可以使用通过 /usr/bin/ansible 或者 /usr/bin/ansible-playbook 。模块可以通过任何语言编写包括 Perl,Bash,Ruby,但是使用Python 可以利用一些有用的社区库代码。模块仅仅返回一些 JSON 格式数据或简单的 key=value 集合。一旦模块在远端执行之后,他们就被移除了,隐私不需 daemon 长时间运行。Ansible 把模块的集合看做 ‘library’
Notify
等级改变的事件和通知处理任务需要在 play 的最后运行。如果一个 handler 被多个任务通知,它会仍然仅仅运行一次。 Handler仅仅按照列表运行一次,而不是他们被notified 的顺序。
Orchestration
一些软件自动化系统使用这个单词意味着不同的事情。 Ansible使用它作为一个导演执导一个曲子。一个数据中心或云架构充满多个系统,表演很多角色 – web servers,database servers,负载均衡器,监控系统, 持续集成系统等。在具体表演过程中,必须要安排好特定的步骤。一些系统执行一些步骤,然后其它系统,然后先前的系统执行更多的步骤。同时,发送邮件也可能是需要的到 web service 联系人。 Ansible 编排了所有过程的模型。
Paramiko
默认, Ansible 管理机器使用 SSH。而 Ansible 默认使用的 python 提供的库叫 paramiko。 paramiko库非常的快和很容易管理,渴望支持 Kerberos 或 jump Host 的用户转向使用 SSH 作为连接类型了。在他们的 playbook里面使用 “-c ssh” 选项即可。
Playbooks
Playbooks 是一种语言,Ansible 用于编排,配置,管理和部署吸引。他们被叫做 Playbooks 的部分原因是依据它行为的类比,使用它应该是一件有趣的事情。他们不是 工作书。
Plays
一个 playbook 就是一系列的 plays。一个 play 就是在一些主机中挑选指定的主机和主机组,然后运行任务在这些主机上,定义这些主机的角色和他们会怎么样表演。
Pull Mode
Pull 模式是节点每隔 N 分钟检查特定的主机。它使用 ansible-pull 程序,pull模式有很多选择性。Ansible-pull 在任务计划中检查配置指令熟悉怒,使用连接插件,在本地管理机器。不常用。
Push Mode
push 模式是 Ansible 的默认模式。事实上,这也不算是个模式 – 你不去想它的时候 ansible 就是这么工作的。Push 方式通过复杂的编排进程,而不要等到节点检查,对节点有个很好的粒度控制。
Register Variable
Ansible 运行的结果可以存储在一个变量里面以便模板或条件语句使用,用于定义这个变量的关键字叫做 ‘register’。你可以定义无限制的变量名用于 registertion.
Resource Model
Ansible 模块工作在资源上。例如,file 模块会挑选指定的文件然后确保资源的属性匹配指定的模型。例如,我们想改变 /etc/motd 的属主为 ‘root’,如果它还没设置为 root,或者设置权限为‘0644’,如果还没有设置为 0644 。资源模型是幂等性( ‘idemotent’ )意味着改变命令不会运行除非需要的时候,Ansible会把系统变为期望的状态而不管当前的状态是什么。
Roles
一个 Role 可以包含特定的变量值,特定的任务,特定的触发器等东西。因为 Role 的文件结构,roles 可以是再次利用的单元,可以让你在其它 playbooks 中共享一些行为。
Rolling Update
一次处理某组主机的 N 个节点,避免一次全部更新导致系统离线。 例如,在一个 500 节点的 web 拓扑里,最好一次更新 10~20 台机器一次。Ansible 中的 ‘seria’ 关键字控制 rolling updtae的池。默认是一次全部处理。OS 配置可以不使用 rolling update 模型,但是可以这么做。
Runner
Ansible 核心的组件是 /usr/bin/ansible 指令,它背后有强大的力量,激发 playbook 中的每个任务。 Runner 一般是 Ansible 开发者经常谈论的,但是它对用户来说不是经常用到的词汇。
Sudo
Ansible 不要求一定用 root 登录,它是无守护进程模式的(这可能是个安全问题,在敏感的环境里面)。 Ansible可以记录一些运行 sudo 命令的操作,可以运行无密码的和有密码的 sudo。 一些操作不需要使用 sudo (像 scp 文件传输)可以通过 Ansible 的 copy,template,和 fetch 模块实现。
SSH (Native)
OpenSSH 作为 Ansible 的传输被指定使用 “-c ssh”,这可以很有用当你想登陆通过 Kerberized SSH 或者 SSH jump hosts 等待。在 1.2.1版本,ssh被用作默认,之前使用 ‘paramiko’ 作为默认。使用一个客户端 支持 ControlMaster 和 ControlPersist 是被推荐的对于管理大量主机。如果你不需要使用 Kerbers,jump hosts或者其它的特性, 选择 paramiko 是不错的选择。Ansible 会发出警告,如果它没有检测到 ControlMaster/ControlPersist 兼容性。
Tags
Ansible 允许给playbook里面的资源通过自定义的关键字打上标签,然后只运行与关键字一致的部分代码。 例如,可能有个完成的 OS 配置,然后特定的步骤标记为 “ntp” ,然后运行 “ntp” 步骤来重新配置时间服务器信息。
Tasks
Playbooks 包含 Tasks, Tasks 结合一个动作使用一个名称和一些可选的关键字。处理器也是 tasks,但是他们是特殊的 tasks 不运行,除非他们被通知一个 tasks 报道的远端吸引变化。
Templates
Ansible 很容易的传输文件到远端系统上面,但是它经常需要替换一些变量在其它的文件里面。变量可以来自 清单文件,Host Vars, Group Vars,或者 Facts。Templates 使用 Jinja2 模板引擎同样可以包含逻辑控制像循环和 if 语句。
Transport
Ansible 使用 “Connection Plugins” 定义可用的传输类型。这只是 Ansible 如何到达管理的系统。Rransports 包括 paramiko, SSH (using OpenSSH), 和 local。
When
一个可选的关键字来决定这个任务是不是应该指向,如果再 “when:” 关键字这里的表达式是是不正确的,这个任务会被忽略。
Van Halen
没有其它的原因,Michael 真的很喜欢他们,所有的 Ansible 版本代号都是以 Van Halen 的歌曲命名。
Vars (Variables)
和 Facts 相反, 变量是一些值,或字典,列表的名称(可以是标量值–整数,布尔型,或字符串,字典,列表),然后变量可以应用在模板和剧本里面。他们是声明的东西,不是获取远程系统的当前状态或性质(这是Facts)。
YAML
Ansible 不想强迫人们编写编程语言的代码实现自动化基础设施部署,所以 Ansible 使用YAML来定义剧本还配置语言和变量文件。YAML很棒因为它有很少的语法,然后非常干净,容易浏览。对人来说,这是一个很好的数据格式的配置文件,机器也可读。YAML非常流行在动态语言社区,编程语言也有库可用来序列化这种语言。
参考资料:
Getting started with Ansible
Ansible中文权威指南