首页 > 其他分享 >现代 IT 人一定要知道的 Ansible系列教程:Ansiable配置

现代 IT 人一定要知道的 Ansible系列教程:Ansiable配置

时间:2024-01-12 16:33:16浏览次数:34  
标签:Ansiable 教程 变量 主机 ansible host Ansible 清单

现代 IT 人一定要知道的 Ansible系列教程:Ansiable配置

现代 IT 人一定要知道的 Ansible系列教程:Ansiable配置_Ansible

配置文件

Ansible 中的某些设置可通过配置文件 (ansible.cfg) 进行调整。 库存配置对于大多数用户来说应该足够了,但您可能出于某些原因想要更改它们。

可以在配置文件中进行更改并使用该更改,该文件将按以下顺序搜索:

  • ANSIBLE_CONFIG(如果设置了环境变量)
  • ansible.cfg(在当前目录中)
  • ~/.ansible.cfg(在主目录中)
  • /etc/ansible/ansible.cfg

获取最新配置

如果从软件包管理器安装 Ansible,则最新的 ansible.cfg 文件可能会出现在 /etc/ansible 中 作为 .rpmnew 文件(或其他文件)(视更新情况而定)。

如果您从 pip 或源安装 Ansible,您可能需要创建此文件来覆盖 Ansible 中的默认设置。

您可以生成 Ansible 配置文件ansible.cfg,其中列出了所有默认设置,如下所示:

$ ansible-config init --disabled > ansible.cfg

包含可用插件以创建更完整的 Ansible 配置,如下所示:

$ ansible-config init --disabled -t all > ansible.cfg

更多配置请参考:https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-configuration-settings

构建 Ansiable inventories

Ansible 使用称为清单的列表或列表组自动执行基础架构中的托管节点或“主机”上的任务。可以在命令行传递主机名,但大多数 Ansible 用户都会创建清单文件。清单文件定义了自动化的托管节点,并带有组,以便我们可以同时在多个主机上运行自动化任务。 定义清单后,我们可以使用模式来选择我们希望 Ansible 运行的主机或组。

最简单的清单是包含主机和组列表的单个文件。此文件的默认位置是 /etc/ansible/hosts。 我们可以在命令行中使用 选项指定不同的清单文件,或在配置中使用 指定不同的清单文件。-i <path> inventory

Ansible 库存插件支持多种格式和来源,使我们的库存灵活且可定制。随着我们的库存扩展,可能需要多个文件来组织主机和组。以下是 /etc/ansible/hosts 文件之外的三个选项:

  • 可以创建一个包含多个清单文件的目录。它们可以使用不同的格式(YAML、ini 等)。
  • 可以动态提取库存。例如,您可以使用动态库存插件来列出一个或多个云提供商中的资源。
  • 可以使用多个清单源,包括动态清单和静态文件。

inventories 基础知识

清单将托管节点组织在集中式文件中,为 Ansible 提供系统信息和网络位置。使用清单文件,Ansible 可以通过单个命令管理大量主机。

INI 或 YAML 格式的清单

您可以在 INI 文件或 中创建 YAML 清单。在大多数情况下,例如前面步骤中的示例,对于少量受管节点来说, INI 文件是简单明了且易于阅读的。

随着托管节点数量的增加,以 YAML 格式创建清单成为明智的选择。例如,以下内容等 inventory.ini 效于声明受管节点的唯一名称并使用该 ansible_host 字段:

myhosts:
   hosts:
     my_host_01:
       ansible_host: 192.168.2.129
     my_host_02:
       ansible_host: 192.168.2.130

我们在创建一个目录/root/ansible_quickstart并创建文件 inventory.ini ,将新 [myhosts] 组添加到该文件中 inventory.ini ,并指定每个主机系统的 IP 地址。

[myhosts]                                                                                                     192.168.2.129                                                                                                 192.168.2.130

使用以下命令来验证 inventory.ini

ansiable-inventory -i inventory.ini --list
 root@master:~/ansible_quickstart# ansible-inventory -i inventory.ini --list
 {
     "_meta": {
         "hostvars": {}
     },
     "all": {
         "children": [
             "ungrouped",
             "myhosts"
         ]
     },
     "myhosts": {
         "hosts": [
             "192.168.2.129",
             "192.168.2.130"
         ]
     }
 }

对清单中的 myhosts 组执行 Ping 操作。

如果控制节点和受管节点上的用户名不同,则通过 ansible 命令传递该 -u 选项。

root@master:~/ansible_quickstart# ansible myhosts -m ping -i inventory.ini 
 192.168.2.129 | SUCCESS => {
     "ansible_facts": {
         "discovered_interpreter_python": "/usr/bin/python3"
     },
     "changed": false,
     "ping": "pong"
 }
 192.168.2.130 | SUCCESS => {
     "ansible_facts": {
         "discovered_interpreter_python": "/usr/bin/python3"
     },
     "changed": false,
     "ping": "pong"
 }

我们可以看到已经成功建立 inventory 。通过创建 playbook 继续开始使用 Ansible。

上面已经提到过构建清单 inventory 可以使用 ini 格式的文件,同时也是可以使用 yml 文件的。我们可以区分场景使用,如果构建的清单是比较复杂的,那么建议使用 yml文件构建,因为yml文件的语义更强,不过需要以下几点:

  • 确保组名称有意义且唯一。组名称也区分大小写。
  • 在组名称中避免使用空格、连字符和前面的数字(use floor_19 、not 19th_floor )。
  • 根据清单中的主机的内容、位置和时间对主机进行逻辑分组。
  • 根据拓扑对主机进行分组,例如:db、web、leaf、spine。
  • 按地理位置对主机进行分组,例如:数据中心、区域、楼层、建筑物。
  • 按阶段对主机进行分组,例如:开发、测试、暂存、生产。

yml 文件示例:

root@master:~/ansible_quickstart# cat inventory.yml 
 myhosts:
   hosts:
     node129:
       ansiable_host: 192.168.2.129
     node130:
       ansiable_host: 192.168.2.130
root@master:~/ansible_quickstart# ansible myhosts -m ping -i inventory.yml 
 node130 | SUCCESS => {
     "ansible_facts": {
         "discovered_interpreter_python": "/usr/bin/python3"
     },
     "changed": false,
     "ping": "pong"
 }
 node129 | SUCCESS => {
     "ansible_facts": {
         "discovered_interpreter_python": "/usr/bin/python3"
     },
     "changed": false,
     "ping": "pong"
 }

使用 metagroups

创建一个元组,使用以下语法组织清单中的多个组:

metagroupname:
  children:

以下清单说明了数据中心的基本结构。此示例清单包含一个 network 包含所有网络设备的元组和一个包含该 network 组和所有 Web 服务器的 datacenter 元组。

leafs:
  hosts:
    leaf01:
      ansible_host: 192.0.2.100
    leaf02:
      ansible_host: 192.0.2.110

spines:
  hosts:
    spine01:
      ansible_host: 192.0.2.120
    spine02:
      ansible_host: 192.0.2.130

network:
  children:
    leafs:
    spines:

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
    webserver02:
      ansible_host: 192.0.2.150

datacenter:
  children:
    network:
    webservers:

以上示例仅仅演示

创建变量

变量设置受管节点的值,例如 IP 地址、操作系统和 SSH 用户以及端口,因此我们在运行 Ansible 命令时无需传递它们。

变量可以应用于特定主机。

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443

变量还可以应用于组中的所有主机。

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443
  vars:
    ansible_user: root

Inventory 别名

还可以使用主机变量在清单中定义别名

In INI: 在 INI 中:

jumper ansible_port=5555 ansible_host=192.168.2.129

In YAML: 在 YAML 中:

...
  hosts:
    jumper:
      ansible_port: 5555
      ansible_host: 192.168.2.129

在此示例中,针对主机别名 jumper 运行 Ansible 将连接到端口 5555 上的 192.168.2.129。

将变量分配给多台计算机:组变量

如果组中的所有主机共享一个变量值,则可以一次将该变量应用于整个组。

In INI: 在 INI 中:

[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com

In YAML: 在 YAML 中:

atlanta:
  hosts:
    host1:
    host2:
  vars:
    ntp_server: ntp.atlanta.example.com
    proxy: proxy.atlanta.example.com

组变量是一次将变量应用于多个主机的便捷方法。但是,在执行之前,Ansible 始终将变量(包括清单变量)展平到主机级别。如果主机是多个组的成员,则 Ansible 会从所有这些组中读取变量值。如果为不同组中的同一变量分配不同的值,Ansible 会根据内部合并规则选择要使用的值。

继承变量值:组的组变量

您可以将变量应用于父组(嵌套组或组组)以及子组。

语法相同: :vars 对于 INI 格式和 vars: YAML 格式:

In INI: 在 INI 中:

[atlanta]
host1
host2

[raleigh]
host2
host3

[southeast:children]
atlanta
raleigh

[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2

[usa:children]
southeast
northeast
southwest
northwest

In YAML: 在 YAML 中:

usa:
  children:
    southeast:
      children:
        atlanta:
          hosts:
            host1:
            host2:
        raleigh:
          hosts:
            host2:
            host3:
      vars:
        some_server: foo.southeast.example.com
        halon_system_timeout: 30
        self_destruct_countdown: 60
        escape_pods: 2
    northeast:
    northwest:
    southwest:

子组的变量将比父组的变量具有更高的优先级(覆盖)

变量如何合并

默认情况下,在运行播放之前,变量会合并/展平到特定主机。这使 Ansible 专注于主机和任务,因此组无法在清单和主机匹配之外生存。默认情况下,Ansible 会覆盖变量,包括为组和/或主机定义的变量(参见 DEFAULT_HASH_BEHAVIOUR)。顺序/优先级为(从低到高):

  • all group
  • parent group
  • child group
  • host

默认情况下,Ansible 会按 ASCII 顺序合并同一父/子级别的组,并且加载的最后一个组中的变量会覆盖前一个组中的变量。例如,将合并 b_groupb_group 匹配的变量将 a_group 覆盖 a_group 中的变量。

可以通过设置组变量 ansible_group_priority 来更改同一级别的组的合并顺序(在解析父/子顺序后)来更改此行为。数字越大,合并时间越晚,优先级越高。此变量默认为 1 if un set。

例如:

a_group:
  vars:
    testvar: a
    ansible_group_priority: 10
b_group:
  vars:
    testvar: b

在此示例中,如果两个组具有相同的优先级,则结果通常为 testvar == b ,但由于我们赋予了 a_group 更高的优先级,因此结果将是 testvar == a


原文链接:https://fm126.top/devops/ansible/2%E9%85%8D%E7%BD%AE-ansiable/

标签:Ansiable,教程,变量,主机,ansible,host,Ansible,清单
From: https://blog.51cto.com/demo007x/9219144

相关文章

  • 无涯教程-JUnit - 使用断言
    所有的断言都在Assert类中。publicclassAssertextendsjava.lang.Object此类提供了一组断言方法,可用于编写测试。Assert类的一些重要方法如下-Sr.No.Methods&Remark1voidassertEquals(booleanexpected,booleanactual)检查两个primitives/object是否相等。2......
  • BCLinux 8.2安装配置图解教程--龙蜥社区国产移动云系统
    社区镜像下载地址:https://openanolis.cn/download安装参考地址:https://www.osyunwei.com/archives/13017.html1安装系统界面说明:InstallBigCloudEnterpriseLinux8  #安装Testthismedia&installBigCloudEnterprise Linux8#测试安装文件并安装Troubleshooti......
  • 无涯教程-JUnit - 编写测试
    在这里,无涯教程将看到一个使用POJO类,业务逻辑类和一个测试类进行JUnit测试的完整示例,该类将由测试运行程序运行。在C:\>JUNIT_WORKSPACE中创建EmployeeDetails.java,这是一个POJO类。publicclassEmployeeDetails{privateStringname;privatedoublemonthlySalary......
  • 无涯教程-JUnit - 测试框架
    JUnit是回归测试框架,开发人员可以使用它来用Java实施单元测试,从而加快编程速度并提高代码质量。 JUnit函数JUnit测试框架提供以下重要函数-FixturesTestsuitesTestrunnersJUnitclassesFixturesFixtures是一组对象的固定状态,目的是确保在固定环境中运行测试,以便结果可......
  • 无涯教程-JUnit - 环境设置
    JUnit是Java的框架,因此最首要的要求是在计算机上安装JDK。步骤1-验证Java安装首先,打开控制台并根据您正在使用的操作系统执行Java命令。OSTaskCommandWindowsOpenCommandConsolec:\>java-versionLinuxOpenCommandTerminal$java-versionMacOpenTerminalma......
  • QQ的POP、IMAP和SMTP设置教程,简单好用
    在当今数字化社会中,电子邮件已经成为人们生活和工作中不可或缺的一部分。而对于众多QQ邮箱用户而言,了解如何正确设置邮箱的POP、IMAP和SMTP是十分重要的一项技能。在本文中,我们将为您详细介绍QQ邮箱的这些设置,以便让您更加便捷地使用QQ邮箱进行邮件的收发和管理。1.什么是POP、IMA......
  • QQ的POP、IMAP和SMTP设置教程,简单好用
    在当今数字化社会中,电子邮件已经成为人们生活和工作中不可或缺的一部分。而对于众多QQ邮箱用户而言,了解如何正确设置邮箱的POP、IMAP和SMTP是十分重要的一项技能。在本文中,我们将为您详细介绍QQ邮箱的这些设置,以便让您更加便捷地使用QQ邮箱进行邮件的收发和管理。1.什么是POP、IMA......
  • 通过腾讯网页快捷登录协议截取 QQ邮箱 的 QQClientkey / QQKey 教程
    最近发现之前的老代码已经不能获取QQ邮箱的Clientkey,经过一番调试后发现QQ邮箱更新了获取的流程,所以决定重新发布一篇文章,废话不多,直接上教程,喜欢的朋友记得点赞加关注。step1首先需要获取到Qrsig的值(流程已更改)RequestURL:https://ssl.ptlogin2.qq.com/ptqrshow?appid......
  • Outlook 的POP、IMAP 和SMTP 设置教程,简单好用
    MicrosoftOutlook作为一款强大的邮件客户端,广泛应用于个人和商业场景。为了更好地使用Outlook,合理设置POP、IMAP和SMTP是至关重要的。在本教程中,我们将深入探讨如何简单而有效地配置Outlook,以充分利用其强大的邮件功能。1.OutlookSMTP设置简介在开始之前,让我们先了解SMTP(Simple......
  • Gmail 的POP、IMAP 和SMTP 设置教程,简单好用
    在数字化时代,电子邮件已经成为人们生活中不可或缺的一部分。而Gmail作为全球最大的电子邮件服务提供商之一,其强大的功能和稳定性备受用户青睐。为了更好地使用Gmail,了解和正确配置其POP、IMAP和SMTP设置是至关重要的。本文将为您提供一份简单而实用的Gmail设置教程,助您更便捷地管理......