我是 Ansible 的新手,所以我可能会遗漏一些明显的东西。我有一个剧本执行以下操作:
- name: Create real users
user: name="{{item.user_name}}" comment="{{item.user_description}}" home="/home/{{item.user_name}}" shell="/bin/bash" uid="{{item.user_id}}"
with_items:
- { user_name: "user1", user_description: "user 1", user_id: "2000" }
- { user_name: "user2", user_description: "user 2", user_id: "2001" }
- name: Copy SSH keys
copy:
src: "keys/{{ item.user_name }}.key"
dest: "/home/{{ item.user_name }}/.ssh/authorized_keys"
owner: "{{ item.user_name }}"
group: "{{ item.user_name }}"
mode: 0600
with_items:
- { user_name: "user1", user_description: "user 1", user_id: "2000" }
- { user_name: "user2", user_description: "user 2", user_id: "2001" }
Run Code Online (Sandbox Code Playgroud)
基本上with_items一遍又一遍地重复使用。理想情况下,我想将它存储在一个包含我可能使用的所有字段的外部文件中。
这可能吗?我应该从哪里开始寻找?
塔……汤姆
我是 ansible 的新手
我在这里列出了一些不同的选项,因此您可以学到的不仅仅是理想的解决方案(选项 5)
选项 1:使用 YAML 锚点和引用
这与 Ansible 完全无关,但由于文件采用 YAML 格式,因此您可以执行以下操作:
- name: Create real users
user: name="{{item.user_name}}" comment="{{item.user_description}}" home="/home/{{item.user_name}}" shell="/bin/bash" uid="{{item.user_id}}"
with_items: &my_items
- user_name: user1
user_description: user 1
user_id: 2000
- user_name: user2
user_description: user 2
user_id: 2001
- name: Copy SSH keys
copy:
src: "keys/{{ item.user_name }}.key"
dest: "/home/{{ item.user_name }}/.ssh/authorized_keys"
owner: "{{ item.user_name }}"
group: "{{ item.user_name }}"
mode: 0600
with_items: *my_items
Run Code Online (Sandbox Code Playgroud)
选项 2:块中的变量
块是 Ansible 2 中引入的功能。您可以为块定义变量并在包含的任务中使用它们
- vars:
userlist:
- user_name: user1
user_description: user 1
user_id: 2000
- user_name: user2
user_description: user 2
user_id: 2001
block:
- name: Create real users
user: name="{{item.user_name}}" comment="{{item.user_description}}" home="/home/{{item.user_name}}" shell="/bin/bash" uid="{{item.user_id}}"
with_items: "{{ userlist }}"
- name: Copy SSH keys
copy:
src: "keys/{{ item.user_name }}.key"
dest: "/home/{{ item.user_name }}/.ssh/authorized_keys"
owner: "{{ item.user_name }}"
group: "{{ item.user_name }}"
mode: 0600
with_items: "{{ userlist }}"
Run Code Online (Sandbox Code Playgroud)
选项 3:将循环应用于include任务并将您的任务包含在包含的文件中
- include: other_file.yml
with_items:
- user_name: user1
user_description: user 1
user_id: 2000
- user_name: user2
user_description: user 2
user_id: 2001
Run Code Online (Sandbox Code Playgroud)
在包含的文件中,您将能够访问该项目及其属性,例如item.user_name,就像您已经拥有它一样:
- name: Create real users
user: name="{{item.user_name}}" comment="{{item.user_description}}" home="/home/{{item.user_name}}" shell="/bin/bash" uid="{{item.user_id}}"
- name: Copy SSH keys
copy:
src: "keys/{{ item.user_name }}.key"
dest: "/home/{{ item.user_name }}/.ssh/authorized_keys"
owner: "{{ item.user_name }}"
group: "{{ item.user_name }}"
mode: 0600
Run Code Online (Sandbox Code Playgroud)
选项 4:在单独的任务中设置包含您的用户列表的事实
- set_fact:
userlist:
- user_name: user1
user_description: user 1
user_id: 2000
- user_name: user2
user_description: user 2
user_id: 2001
- name: Create real users
user: name="{{item.user_name}}" comment="{{item.user_description}}" home="/home/{{item.user_name}}" shell="/bin/bash" uid="{{item.user_id}}"
with_items: "{{ userlist }}"
- name: Copy SSH keys
copy:
src: "keys/{{ item.user_name }}.key"
dest: "/home/{{ item.user_name }}/.ssh/authorized_keys"
owner: "{{ item.user_name }}"
group: "{{ item.user_name }}"
mode: 0600
with_items: "{{ userlist }}"
Run Code Online (Sandbox Code Playgroud)
选项 5:使用 group_vars
group_vars在这里可能最有意义。我猜您的主机在您的清单文件中的某个组中,我们称之为foo.
创建一个group_vars/foo与您的剧本相关的文件,内容如下:
userlist:
- user_name: user1
user_description: user 1
user_id: 2000
- user_name: user2
user_description: user 2
user_id: 2001
Run Code Online (Sandbox Code Playgroud)
属于该组的所有主机foo现在将自动有权访问该userlist变量。你可以在你的任务中使用它:
- name: Create real users
user: name="{{item.user_name}}" comment="{{item.user_description}}" home="/home/{{item.user_name}}" shell="/bin/bash" uid="{{item.user_id}}"
with_items: "{{ userlist }}"
- name: Copy SSH keys
copy:
src: "keys/{{ item.user_name }}.key"
dest: "/home/{{ item.user_name }}/.ssh/authorized_keys"
owner: "{{ item.user_name }}"
group: "{{ item.user_name }}"
mode: 0600
with_items: "{{ userlist }}"
Run Code Online (Sandbox Code Playgroud)
如果您没有组或不想将其限制为某些组,则可以将 vars 文件存储为group_vars/all所有主机都可以访问的位置。
| 归档时间: |
|
| 查看次数: |
13216 次 |
| 最近记录: |