5

我正在编写一个剧本,我需要在其中执行 mysql 查询并以 json 格式传递输出。剧本代码工作正常,只是我想在字符串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是我的剧本中已经设置的变量,其中包含{'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

4 回答 4

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 }}"
于 2015-03-26T15:03:42.793 回答
1

这会做

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

它会生成一个类似的文件

{'colors':
    {
        'blue',
        'red',
        'green',
        }
}
于 2014-03-13T02:17:15.377 回答
1

像这样试试。

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

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

于 2020-07-28T11:57:56.977 回答
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 字符串包含在单引号中。

于 2019-03-21T15:33:04.097 回答