Ansible - 具有相同变量的多个语句

Tom*_*Tom 3 ansible

我是 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一遍又一遍地重复使用。理想情况下,我想将它存储在一个包含我可能使用的所有字段的外部文件中。

这可能吗?我应该从哪里开始寻找?

塔……汤姆

udo*_*dan 9

我是 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所有主机都可以访问的位置。