如何在YAML中连接字符串?

如何在YAML中连接字符串?,yaml,ansible,ansible-playbook,Yaml,Ansible,Ansible Playbook,我正在写一个剧本,其中我需要执行mysql查询并传递 以json格式输出。playbook代码运行良好,只是我想面对字符串连接部分中的错误。如果我传递的是示例json字符串,它就可以正常工作 - name: Execute php script with json parameter command: php -f /path/to/php/test.php "{'colors':{'red','blue','yellow'}}" register: php_output outpu

我正在写一个剧本,其中我需要执行mysql查询并传递 以json格式输出。playbook代码运行良好,只是我想面对字符串
连接部分中的错误。如果我传递的是示例json字符串,它就可以正常工作

- name: Execute php script with json parameter
  command:  php -f /path/to/php/test.php "{'colors':{'red','blue','yellow'}}"
  register: php_output
output.stdout\u line
是我的剧本中已经设置的变量,其中包含
{'red'、'blue'、'yellow'}
格式的输出

- name: Execute php script with json parameter
  command:  php -f /path/to/php/test.php '{"stdout_lines": {{output.stdout_lines}} }'
  register: php_output
那么,如何将
输出.stdout_行
变量连接到
'{“stdout_行”:{{output.stdout_行}}}'
?任何建议都可以

  - name: Generate JSON output based on template
    template: src=colors.json.j2 dest=/tmp/colors.json
    with_items: colors
它将生成一个文件,如

{'colors':
    {
        'blue',
        'red',
        'green',
        }
}

stdout\u行
是为了方便而创建的。以前我们只有
stdout
。这就是你想要的,我想:

command:  php -f /path/to/php/test.php '{"stdout_lines": {{output.stdout}} }'
如果你真的想自己连接,比如说因为你有自己的字符串列表,那么你可以使用Jinja2内置的过滤器
连接

- hosts: localhost
  gather_facts: False
  tags: so9
  vars:
    - str_list: ['Hello', 'world', '!', ]
  tasks:
    - debug: msg="orig list={{ str_list }}"
    - debug: msg="concated = {{ str_list | join(' ') }}"
    - set_fact: concated_str="{{ str_list | join(' ') }}"
    - debug: msg="assigned to a variable concated_str = {{ concated_str }}"

to_json
过滤器就是您想要的

Ansible不将变量存储为JSON字符串,而是将它们存储为Python对象。当您调试时,例如使用
-vvv
,Ansible将这些Python对象显示为JSON字符串,但这是为了您的方便

要生成所需的命令,请执行以下操作:

- name: Execute php script with json parameter
  vars:
    # define my desired object
    my_object:
      colors: "{{ output.stdout_lines }}"
    # my_object contains a dict with a single key 
    #  "colors" who's value is the list contained 
    #  in output.stdoutlines
  command: "php -f /path/to/php/test.php {{ my_object | to_json | quote }}"
  register: php_output
to_json
获取存储在
my_object
中的对象并输出json字符串

quote
自动处理JSON字符串可能需要的任何shell引用。e、 g.如果我的JSON字符串包含双引号,
quote
将把整个JSON字符串用单引号括起来。

尝试这样做

  vars:
- img_path: "/var/lib/libvirt/images/{{ instance_name }}-disk2.img"

如果实例名称是另一个变量

当您在Ansible任务上传递数组时,它将针对数组上的每个条目执行一次。它不会像您所设想的那样在执行过程中连接这些值。看看