我是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原始图片。
希望这可以帮助别人!