如何在Ansible Playbook中使用文件行作为变量并按行号赋值?
解决方案:在Ansible Playbook中读取文件行作为变量
没问题,我来帮你简化变量传递的流程!根据你的需求,我们可以通过读取variables.txt文件的内容,拆分后直接映射到Playbook的变量中,完全不用手动传递一堆参数。
步骤1:读取并解析变量文件
首先,我们用Ansible的slurp模块读取文件内容(它会返回base64编码的内容,所以需要解码),再通过split过滤器把一行内容拆分成一个列表,这样就能按索引调用每个字段了。
步骤2:修改Playbook引用解析后的变量
把你的Playbook调整成下面这样,直接用解析后的列表元素赋值:
--- - hosts: tomcat_server tasks: # 读取variables.txt文件内容 - name: 读取变量文件 slurp: src: "/绝对路径/variables.txt" # 替换成你的variables.txt实际路径 register: vars_raw_content # 解码并拆分内容到列表变量 - name: 解析变量行到列表 set_fact: tomcat_config: "{{ vars_raw_content.content | b64decode | split }}" vars: tomcat_instances: - name: "{{ tomcat_config[0] }}" # 对应Tomcat8 user: "{{ tomcat_config[0] | lower }}" # 转成小写tomcat8 group: "{{ tomcat_config[0] | lower }}" path: "/srv/{{ tomcat_config[0] | lower }}" home: "/home/{{ tomcat_config[0] | lower }}" service_name: "{{ tomcat_config[0] | lower }}@tomcat" service_file: "{{ tomcat_config[0] | lower }}@.service" port_ajp: "{{ tomcat_config[2] }}" # 对应8080 port_connector: "{{ tomcat_config[3] }}" # 对应8081 port_redirect: "{{ tomcat_config[4] }}" # 对应8082 port_shutdown: "{{ tomcat_config[5] }}" # 对应8084 # 如果需要用到IP,可添加:host_ip: "{{ tomcat_config[1] }}"
关键说明
slurp模块确保我们能正确读取文件内容,即使文件有权限限制也能处理;b64decode是必须的,因为slurp返回的内容是base64编码的;split默认按空格拆分内容,所以你的variables.txt里的空格分隔字段会被自动拆分成列表元素,索引从0开始;- 如果后续需要调整字段顺序,只需要修改
tomcat_config[n]中的索引n即可; - 用
lower过滤器把Tomcat8转成小写的tomcat8,适配你的路径、用户名等命名规范。
如果你的variables.txt后续有多行配置(比如多个Tomcat实例),我们还可以扩展成循环读取每行内容,生成多个实例配置,有需要的话可以再调整!
内容的提问来源于stack exchange,提问作者Himanshu Khandelwal
相关产品推荐
相关产品推荐

