『运维备忘录』之 Ansible 自动化运维工具

一、简介

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中文权威指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/253800.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07:Kubectl 命令详解|K8S资源对象管理|K8S集群管理(重难点)

Kubectl 命令详解&#xff5c;K8S资源对象管理&#xff5c;K8S集群管理 kubectl管理命令kubectl get 查询资源常用的排错命令kubectl run 创建容器 POD原理pod的生命周期 k8s资源对象管理资源文件使用资源文件管理对象Pod资源文件deploy资源文件 集群调度的规则扩容与缩减集群更…

计算机网络-无线通信技术与原理

一般我们网络工程师接触比较多的是交换机、路由器&#xff0c;很少涉及到WiFi和无线设置&#xff0c;但是呢在实际工作中一般企业也是有这些需求的&#xff0c;这就需要我们对于无线的一些基本配置也要有独立部署能力&#xff0c;今天来简单了解一下。 一、无线网络基础 1.1 无…

Linux(三)--文件系统

Linux命令简介 [rootlocalhost ~]# 表示 Linux 系统的命令提示符。 []&#xff1a;这是提示符的分隔符号&#xff0c;没有特殊含义。 root&#xff1a;显示的是当前的登录用户&#xff0c;笔者现在使用的是 root 用户登录。 &#xff1a;分隔符号&#xff0c;没有特殊含义。 l…

PyTorch 2.2 中文官方教程(四)

torch.nn 到底是什么&#xff1f; 原文&#xff1a;pytorch.org/tutorials/beginner/nn_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 作者&#xff1a; Jeremy Howard&#xff0c;fast.ai。感谢 Rachel Thomas 和 Fr…

Vue.js设计与实现(霍春阳)

Vue.js设计与实现 (霍春阳) 电子版获取链接&#xff1a;Vue.js设计与实现(霍春阳) 编辑推荐 适读人群 &#xff1a;1.对Vue.js 2/3具有上手经验&#xff0c;且希望进一步理解Vue.js框架设计原理的开发人员&#xff1b; 2.没有使用过Vue.js&#xff0c;但对Vue.js框架设计感兴趣…

深度学习系列56:使用whisper进行语音转文字

1. openai-whisper 这应该是最快的使用方式了。安装pip install -U openai-whisper&#xff0c;接着安装ffmpeg&#xff0c;随后就可以使用了。模型清单如下&#xff1a; 第一种方式&#xff0c;使用命令行&#xff1a; whisper japanese.wav --language Japanese --model…

算法随想录第五十二天打卡|300.最长递增子序列 , 674. 最长连续递增序列 , 718. 最长重复子数组

300.最长递增子序列 今天开始正式子序列系列&#xff0c;本题是比较简单的&#xff0c;感受感受一下子序列题目的思路。 视频讲解&#xff1a;动态规划之子序列问题&#xff0c;元素不连续&#xff01;| LeetCode&#xff1a;300.最长递增子序列_哔哩哔哩_bilibili 代码随想录…

SpringBoot3整合Mybatis-Plus,自定义动态数据源starter

文章目录 前言正文一、项目总览二、核心代码展示2.1 自定义AbstractRoutingDataSource2.2 动态数据源DynamicDataSource2.3 动态数据源自动配置2.4 动态数据源上下文DynamicDataSourceContextHolder2.5 动态数据源修改注解定义2.6 修改切面DynamicDataSourceAspect2.7 动态数据…

【RT-DETR有效改进】计算训练好权重文件对应的FPS、推理每张图片的平均时间(科研必备)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用我们训练好的权重文件计算FPS,同时打印每张图片所利用的平均时间,模型大小(以MB为单位),同时支持batch_size功能的选择,对于轻量化模型的读者来说,本文的内容对你一定有…

GEE数据集——全球保护价值的地区数据集

具有全球保护价值的地区 自然地图项目提供了一系列全球价值保护图层。这些地图是通过共同优化生物多样性和碳和/或水等国家保护目标绘制的。它们以连续的比例描述了对扩大保护工作具有最大潜在价值的土地面积。前言 – 人工智能教程 注释 此处的 "保护 "不应被理解为…

【Flink入门修炼】1-3 Flink WordCount 入门实现

本篇文章将带大家运行 Flink 最简单的程序 WordCount。先实践后理论&#xff0c;对其基本输入输出、编程代码有初步了解&#xff0c;后续篇章再对 Flink 的各种概念和架构进行介绍。 下面将从创建项目开始&#xff0c;介绍如何创建出一个 Flink 项目&#xff1b;然后从 DataStr…

春运也要“信号升格”:中兴通讯助运营商打造高铁精品网

一年一度的春运&#xff0c;承载了游子的思乡情。据官方预计&#xff0c;今年春运跨区域人员流动量将达到90亿人次&#xff0c;创下历史新高&#xff0c;铁路、公路、水路、民航等营业性客运量全面回升&#xff0c;其中铁路预计发送旅客4.8亿人次&#xff0c;日均1200万人次&am…

使用yolo训练自己的模型

YOLO&#xff08;You Only Look Once&#xff09;是一种用于目标检测的深度学习模型&#xff0c;旨在实时检测图像或视频中的多个对象。与传统的目标检测方法不同&#xff0c;YOLO一次性处理整个图像&#xff0c;而不是通过滑动窗口或区域提议进行多次检测。这种方法使得YOLO在…

使用虚拟主机部署多站点

网站目录权限的管理和虚拟主机的配置。 目录权限控制

基于hadoop+spark的大规模日志的一种处理方案

概述: CDN服务平台上有为客户提供访问日志下载的功能,主要是为了满足在给CDN客户提供服务的过程中,要对所有的记录访问日志,按照客户定制的格式化需求以小时为粒度(或者其他任意时间粒度)进行排序、压缩、打包,供客户进行下载,以便进行后续的核对和分析的诉求。而且CDN…

C++实现鼠标点击和获取鼠标位置(编译环境visual studio 2022)

1环境说明 2获取鼠标位置的接口 void GetMouseCurPoint() {POINT mypoint;for (int i 0; i < 100; i){GetCursorPos(&mypoint);//获取鼠标当前所在位置printf("% ld, % ld \n", mypoint.x, mypoint.y);Sleep(1000);} } 3操作鼠标左键和右键的接口 void Mo…

BVH动画绑骨蒙皮并在Unity上展示

文章目录 Blender绑定骨骼Blender蒙皮Blender中导入bvh文件将FBX导入Unity Blender绑定骨骼 先左上角红框进入model模式&#xff0c;选中要绑定的模型&#xff0c;然后进入Edit模式把骨骼和关节对齐。 &#xff08;选中骨骼&#xff0c;G移动&#xff0c;R旋转&#xff09; 为…

跟着pink老师前端入门教程-day21+22

5.4 常见flex布局思路 5.5 背景线性渐变 语法&#xff1a; background: linear-gradient( 起始方向 , 颜色 1, 颜色 2, ...); background: -webkit-linear-gradient(left, red , blue); background: -webkit-linear-gradient(left top, red , blue); 背景渐变必须添加浏览…

asp.net core 依赖注入 实例化对象实例

在面向对象编程中&#xff0c;推荐使用面向接口编程&#xff0c;这样我们的代码就依赖于服务接口&#xff0c;而不是依赖于实现类&#xff0c;可以实现代码解耦。 名称解释&#xff1a; 我们把负责提供对象的注册和 获取功能的框架叫作“容器”&#xff0c; 注册到容器中的对象…

【RT-DETR进阶实战】利用RT-DETR进行视频划定区域目标统计计数

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 Hello,各位读者,最近会给大家发一些进阶实战的讲解,如何利用RT-DETR现有的一些功能进行一些实战, 让我们不仅会改进RT-DETR,也能够利用RT-DETR去做一些简单的小工作,后面我也会将这些功能利用PyQt或者是…