如何在YAML中连接字符串?

时间:2014-03-12 11:00:50

标签: yaml ansible ansible-playbook

我正在写一本我需要执行mysql查询并传递的剧本 以json格式输出。 playbook代码工作得很好我只想在字符串concatenate部分中遇到错误。如果我传递样本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_lines是我的playbook中设置的变量,其中包含{'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

那么如何在output.stdout_lines中连接'{"stdout_lines": {{output.stdout_lines}} }'变量?任何建议

4 个答案:

答案 0 :(得分:3)

stdout_lines是为方便起见而创建的。回到那天我们只有stdout。我想,这就是你想要的:

command:  php -f /path/to/php/test.php '{"stdout_lines": {{output.stdout}} }'

如果你想真正自己连接,比如因为你有自己的字符串列表,那么你可以使用Jinja2内置过滤器join

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

答案 1 :(得分:1)

这样做

  - name: Generate JSON output based on template
    template: src=colors.json.j2 dest=/tmp/colors.json
    with_items: colors

它会生成一个像

这样的文件
{'colors':
    {
        'blue',
        'red',
        'green',
        }
}

答案 2 :(得分:1)

尝试这样。

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

其中实例名称是另一个变量

答案 3 :(得分:0)

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引用。例如如果我的JSON字符串包含双引号,则quote会将整个JSON字符串包装在单引号中。