04-invertory

作者: 洛神鬼道 | 来源:发表于2018-08-27 11:03 被阅读0次

    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=<connector>,可以更改连接类型。下列非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

        本文链接:https://www.haomeiwen.com/subject/seeziftx.html