Ansible – 具有相同variables的多个语句

我是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" } 

基本上重复使用with_items一遍又一遍。 理想情况下,我想将这个存储在一个外部文件中,包含所有可能使用的字段。

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

Ta …汤姆

我是新来的人

我在这里列出了一些不同的选项,所以你可以学习一点,而不仅仅是理想的解决scheme(选项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 

选项2:块中的variables

块是Ansible 2中引入的一个function。您可以为块定义variables,并在包含的任务中使用它们

 - 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 }}" 

选项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 

在包含的文件中,您将能够访问项目及其属性,例如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 

选项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 }}" 

选项5:使用group_vars

group_vars可能在这里最有意义。 我想你的主机在你的库存文件中的一些组中,我们称之为foo

创build一个文件group_vars/foo相对于你的手册的内容:

 userlist: - user_name: user1 user_description: user 1 user_id: 2000 - user_name: user2 user_description: user 2 user_id: 2001 

属于组foo所有主机现在将自动访问userlistvariables。 你可以在你的任务中使用它:

 - 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 }}" 

如果您没有组或者不想将其限制到某些组,则可以将variables文件存储为所有主机都可以访问的group_vars/all

感谢这样一个完整的答案。 最后我发现我可以像这样使用with_dict:

1)创build一个vars.yml文件(在同一个目录下)

 --- usersxxx: user1: description: User1 user_id: 2001 shell: /bin/bash ...other options here user2: description: User2 user_id: 2002 shell: /bin/bash ...other options here 

2)创build新的手册:

 --- - hosts: home vars_files: - vars.yml become: yes tasks: - name: Create real users user: name="{{item.key}}" comment="{{item.value.description}}" home="/home/{{item.key}}" uid="{{item.value.user_id}}" with_dict: "{{usersxxx}}" 

看起来像完美的作品。

我只是把它改为usersxxx,以确保我没有碰到任何python / ansible原始图片。

希望这可以帮助别人!