在哪里我可以将常见变量放在剧本之外的ansible中

时间:2018-05-18 09:28:48

标签: variables ansible

我正在使用playboook来运行我的模块。我有一个疑问,我是否可以将我的常见变量放在playbook之外,原因如下

  1. 用户名和密码等安全原因
  2. 通过在公共场所和剧本的位置使用全局变量来减少重复代码。
  3. 现在我的剧本看起来像下面的一些东西:

          - hosts: localhost
            tasks:
              - name: Get all Storage Service Levels
                StorageServiceLevelModule: host=<ip> port=<port> user=admin password=<password>
                   action=get name='my_ssl'
                register: jsonResultforSSLs
    
              - name: print the SSL key
                debug: msg="{{ jsonResultforSSLs.meta.result.records[0].key}}"
    
    
              - name: Get all Storage VMs
                StorageVMModule: host=<ip> port=<port> user=admin password=<password>
                   action=get name=my_svm
                register: jsonResultforSVMs
    

    我想提出

       host=<ip> port=<port> user=admin password=<password> 
    

    在剧本之外,并在我的剧本的所有任务中使用它。我怎么能这样做?

    如果需要澄清,请告诉我。

3 个答案:

答案 0 :(得分:2)

您可以为Inventory文件中或与其相关的子目录中的所有或某些主机指定您自己的变量(如./group_vars)。 Go to this webpage。在那里,您可以看到该目录中的文件示例,该文件必须具有组的名称并以yaml编写。 ./group_vars目录必须位于hosts文件的同一目录中。例如,如果您的hosts文件位于./inventory/hosts,则包含变量的文件应为./inventory/group_vars/<group_name>。请记住,这些文件中定义的变量仅适用于组的成员。该目录中文件内容的示例:

---
ip=1.1.1.1
port=420
password='password1'            # should be encrypted with Ansible Vault
...

然后你会像往常一样使用它们:

- name: Get all Storage VMs
  StorageVMModule: host='{{ip}}' port='{{port}}' user=admin action=get name=my_svm
  register: jsonResultforSVMs

答案 1 :(得分:0)

variables可以以不同方式加载。您可以在all目录中定义名为vars/的文件,这些文件可通过整个剧本获得。

此外,您可以在文件中定义它并在执行带有-e @filename的剧本时提供它。我找到了这种最方便的方式。

从文档中查看此link,我认为您可能会发现它非常有用

我强烈建议您使用角色。在那里,每个角色都有一个vars文件夹,您可以在其中将相关变量放入角色中。然后,您可以使用OS环境变量提供它们的值。

答案 2 :(得分:0)

第二个温尼 -

角色。角色,角色,角色。

角色的默认结构包括defaults目录,您可以在其中定义defaults/main.yml中的默认值。这是关于您可以使用的最低优先级设置,所以我比vars/main.yml更喜欢设置在运行时可以轻松覆盖的合理值,但只要您选择一致的结构就可以了。

我个人并不喜欢所有变量使用的“常见”角色的想法,但如果你的设计运行良好,你应该确保用“虚拟命名空间”字符串作为所有变量名称的前缀。例如,如果可以,请不要将其称为repo,将其称为common_git_repocommon_artifactory,或更具体的内容。

在剧本中包含该角色后,请确保在调用值之前静态加载默认文件,但如果是,则不必担心这么多。只需在您需要的地方使用{{ common_git_repo }}即可。它将存在......这就是为什么你想使用虚拟命名空间来避免与有效全局名称冲突的原因。

当您需要覆盖值时,可以相应地暂存它们。我们在剧本的vars:部分编写特定于剧本的角色默认值覆盖,然后将最后一分钟覆盖动态写入Custom.yml部分加载的vars_files:文件中。注意你的安全,但它非常灵活。

我们还将变量写入库存。如果您使用dynamic inventory,则可以在那里嵌入特定于主机和/或组的变量。这非常有效。为了记录,您可以使用YAML输出而不是JSON。这是一个简单的模板 - 我们有时使用运行ansible的shell脚本作为库存:

case $# in
0) # execute the playbook
   ansible-playbook -i Jenkins.sh -vv site.yml
;;
*) case $1 in
   # ansible-playbook will call the script with --list for hosts
   --list)
     printf "%s\n\n" ---
     for group in someGroup otherGroup admin managed each all
     do  printf "\n$group:\n  hosts:\n"
         for s in $Servers
         do printf "    - $s\n"
         done
         printf "  vars:\n"
         printf "    ansible_ssh_user: \"$USER\"\n"
         printf "    ansible_ssh_pass: \"$PSWD\"\n\n"
     done
   ;;
   esac
;;
esac

您还可以使用--extra-vars作为最后一分钟,优先级最高的覆盖。