04-invertory

Ansible

Ansible version : 2.6.2

inventory

Ansible可以同时处理基础架构中的多个系统。通过选择inventory中不同的部分,inventory默认存放在/etc/ansible/hosts。在命令行下面,可以使用-i选项指定不同的inventory文件。

这个inventory不仅可以配置,而且还可以同时使用多个inventory文件和从动态或云源文件或不同格式(YAML,ini等)中提取inventory,就像在使用动态inventory描述的那样。Ansible在2.4版本中引入了库存插件,使其具有灵活性和可定制性。

主机和组

inventory文件可以采用多种格式之一,这取决于你有何种的inventory插件。

ini格式(Ansible默认格式)

[]里面是组名,ansible通过选不同的组来操作不同的服务器。

mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

YAML格式

all:
  hosts:
    mail.example.com:
  children:
    webservers:
      hosts:
        foo.example.com:
        bar.example.com:
    dbservers:
      hosts:
        one.example.com:
        two.example.com:
        three.example.com:

可以将系统放在多个组中,例如服务器可以是Web服务器和dbserver。如果这样做,请注意变量将来自它们所属的所有组。

如果您拥有在非标准SSH端口上运行的主机,则可以在主机名后面添加带冒号的端口号。 SSH配置文件中列出的端口不会与paramiko连接一起使用,但会与openssh连接一起使用。

为了明确,ansible建议,如果没有使用默认的端口,则设置。

badwolf.example.com:5309

假设您只有静态IP,并且想要设置一些存在于主机文件中的别名,或者通过隧道连接,你可以通过变量来描述主机。这是使用了inventory文件的特性来定义特殊变量,一般来说,这不是最好的方法。

ini格式

jumper ansible_port=5555 ansible_host=192.0.2.50

yaml格式

...
  hosts:
    jumper:
      ansible_port: 5555
      ansible_host: 192.0.2.50

使用key = value语法以INI格式传递的值不会被解释为Python文字结构(字符串,数字,元组,列表,字符串,布尔值,None),而是作为字符串。不要依赖于定义期间设置的类型,在使用变量时,请务必确保在需要时使用过滤器指定类型。

如果要添加大量遵循类似模式的主机,则可以执行此操作而不是列出每个主机名:

[webservers]
www[01:50].example.com

对于数字模式,可以根据需要包含或删除前导零。范围包括在内。您还可以定义字母范围:

[databases]
db-[a:f].example.com

根据主机选择连接类型和用户

[targets]

localhost              ansible_connection=local
other1.example.com     ansible_connection=ssh        ansible_user=mpdehaan
other2.example.com     ansible_connection=ssh        ansible_user=mdehaan

主机变量

很容易将变量分配给主机在playbook中使用。

[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909

组变量

变量也可以应用于整个组

ini格式

[atlanta]
host1
host2

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

yaml格式

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

群组、组变量

群组通过ini格式:children或者yaml格式children:,可以使用:vars或者vars:获取变量。

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

yaml格式

all:
  children:
    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:

如果需要存储列表或哈希数据,或者希望将主机和组特定变量与库存文件分开.

子组有以下几个注意点:

  • 任何子组的成员自动成为父组的成员。
  • 子组的变量将具有更高的优先级(覆盖)父组的变量。
  • 群组可以有多个父组和子组,但不是循环关系。
  • 主机也可以存在多个组里面,但是只有一个主机实例,合并来自多个组的数据。

默认组

有两个默认组,分别是allungroupedall包含了所有主机。ungrouped包含来自all组之内没有分配组的所有主机。每个主机始终属于至少2个组。尽管allungrouped始终存在,但它们可以是隐式的,而不会出现在group_names等组列表中。

拆分主机和组特定数据

在ansible中,首选做法不在主要的inventory文件里面存放变量。

此外直接在inventory存放变量,主机和组变量可以存储在相对于inventory文件的单个文件中(只能是文件,不能是目录)

这些变量文件采用YAML格式。有效的文件扩展名为.yml.yaml、'.json'或者没有扩展名。

如果主机名为“foosball”,并且在“raleigh”和“webservers”组中,则以下位置的YAML文件中的变量将可供主机使用:

/etc/ansible/group_vars/raleigh # 可以以'.yml', '.yaml', or '.json'扩展名结尾
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball

作为高级用例,您可以创建以组或主机命名的目录,Ansible将按字典顺序读取这些目录中的所有文件。

“raleigh”组中的所有主机都将具有这些文件中定义的变量,当单个文件变的太大或者想要在组的变量的一部分使用Ansible Vault时,这对于保持变量条理性非常有用。

/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings

知识点:

group_vars/host_vars/目录可以存在于playbook目录或inventory目录中.如果两个路径都存在,则playbook目录中的变量将覆盖inventory目录中设置的变量。

将inventory文件和变量保存在git仓库(或其他版本控制)中是跟踪库存和主机变量更改的绝佳方法。

如何合并变量

默认情况下,在运行播放之前将变量合并/展平到特定主机。这使得Ansible专注于主机和任务。因此组不会存在于匹配inventory和主机之外。默认情况下,Ansible会覆盖为组和(或)主机定义的变量。

顺序/优先级是(从最低到最高):

  • all group(因为它是所有其他组的“父”)
  • parent group
  • child group
  • host

当合并相同父/子级别的组时,它将按字母顺序执行。并且加载的最后一个组将覆盖以前的组。例如,a_group将与b_group合并,匹配的b_group变量将覆盖a_group中的变量。

从Ansible 2.4版开始,用户可以通过ansible_group_priority更改同一级别的组的合并顺序。在父/子顺序解决之后。数字越大,合并越晚,优先级越高。如果未设置,此变量默认为1。例如:

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

在这个例子中,如果两个组具有相同的优先级,结果通常是testvar == b,但由于我们给a_group一个更高的优先级,结果将是testvar == a

inventory行为参数列表

设置变量来控制Ansible与远程主机的交互方式。

主机连接:

注意:Ansible不会公开一个通道,允许用户和ssh进程之间的通信在使用ssh连接插件时手动接受密码来解密ssh密钥(这是默认设置)。最好是使用ssh-agent

ansible_connection

与主机的连接类型。它可以是任何ansible的连接插件的名称。SSH协议类型是smart, ssh or paramiko

默认是smart。

所有连接的一般设置
主机
ansible_host ansible_port ansible_user
特定的ssh连接设置
ansible_ssh_pass ansible_ssh_private_key_file ansible_ssh_common_args
ansible_ssh_extra_args ansible_sftp_extra_args ansible_scp_extra_args
ansible_ssh_pipelining ansible_ssh_executable(#此设置将覆盖使用系统ssh的默认行为这可以覆盖ansible.cfg中的ssh_executable设置。)
提权设置
命令 作用
ansible_become 等同于 ansible_sudo 或者ansible_su,允许强制权限升级
ansible_become_method 提权方法
ansible_become_user 等同于 ansible_sudo_useransible_su_user
ansible_become_pass 等同于 ansible_sudo_pass or ansible_su_pass
ansible_become_exe 等同于 ansible_sudo_exe or ansible_su_exe,
ansible_become_flags 等同于 ansible_sudo_flags or ansible_su_flags,可以在ansible.cfg里面设置选项sudo_flags`
远程主机环境参数
ansible_shell_type ansible_python_interpreter
ansible__interpreter* ansible_shell_executable
非SSH连接类型

ansible在SSH上执行脚本,但不限于这种连接类型。使用主机特定参数ansible_connection=,可以更改连接类型。下列非SSH连接器是可用的:

local

这个可以用来部署playbook控制本身。

docker

此连接器使用本地Docker客户端将playbook直接部署到Docker容器中。 此连接器处理以下参数:

命令 作用
ansible_host
ansible_user
ansible_become 如果设置为true,则将使用become_user在容器内操作。
ansible_docker_extra_args
- name: create jenkins container
  docker_container:
    docker_host: myserver.net:4243
    name: my_jenkins
    image: jenkins

- name: add container to inventory
  add_host:
    name: my_jenkins
    ansible_connection: docker
    ansible_docker_extra_args: "--tlsverify --tlscacert=/path/to/ca.pem --tlscert=/path/to/client-cert.pem --tlskey=/path/to/client-key.pem -H=tcp://myserver.net:4243"
    ansible_user: jenkins
  changed_when: false

- name: create directory for ssh keys
  delegate_to: my_jenkins
  file:
    path: "/var/jenkins_home/.ssh/jupiter"
    state: directory

你可能感兴趣的:(04-invertory)