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:
如果需要存储列表或哈希数据,或者希望将主机和组特定变量与库存文件分开.
子组有以下几个注意点:
- 任何子组的成员自动成为父组的成员。
- 子组的变量将具有更高的优先级(覆盖)父组的变量。
- 群组可以有多个父组和子组,但不是循环关系。
- 主机也可以存在多个组里面,但是只有一个主机实例,合并来自多个组的数据。
默认组
有两个默认组,分别是all
和ungrouped
。all
包含了所有主机。ungrouped
包含来自all
组之内没有分配组的所有主机。每个主机始终属于至少2个组。尽管all
和ungrouped
始终存在,但它们可以是隐式的,而不会出现在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_user 或 ansible_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