Удалить последние n символов из строки в Ansible - PullRequest
0 голосов
/ 02 марта 2020

Ниже моя книга игр, которая создает строку.

   - name: Construct command for all paths on a particular IP
     set_fact:
       allcmd: "{{ allcmd | default('') + '\"ls -lrt ' + item.path + ' | tail -57 &&' }}"
     loop: "{{ user1[inventory_hostname] }}"

   - debug:
       msg: "allcmd is:{{ allcmd }}"

Вывод:

ok: [10.9.9.11] => (item={u'path': u'/tmp/scripts', u'name': u'SCRIPT'}) => {
    "ansible_facts": {
        "allcmd": "ls -lrt /tmp/scripts | tail -57 &&"
    },
    "ansible_loop_var": "item",
    "changed": false,
    "item": {
        "name": "SCRIPT",
        "path": "/tmp/scripts"
    }
}
ok: [10.9.9.11] => (item={u'path': u'/tmp/MON', u'name': u'MON'}) => {
    "ansible_facts": {
        "allcmd": " ls -lrt /tmp/scripts | tail -57 && ls -lrt /tmp/MON | tail -57 &&"
    },
    "ansible_loop_var": "item",
    "changed": false,
    "item": {
        "name": "MON",
        "path": "/tmp/MON"
    }
}

После завершения l oop я получаю желаемую строку, за исключением того факта, что я ' м осталось с завершающим && в конце то есть "allcmd": " ls -lrt /tmp/scripts | tail -57 && ls -lrt /tmp/MON | tail -57 &&".

I sh, чтобы удалить последние 3 символа, т.е. && из переменной allcmd. Желаемый результат:

"allcmd": " ls -lrt /tmp/scripts | tail -57 && ls -lrt /tmp/MON | tail -57"

Не удалось найти фильтры или функции для удаления последних n символов в ansible.

Можете ли вы предложить?

1 Ответ

1 голос
/ 03 марта 2020
- hosts: localhost
  vars:
    foo:
      - {"name": "SCRIPT", "path": "/tmp/scripts"}
      - {"name": "MON", "path": "/tmp/MON"}
  tasks:
    - debug:
        var: foo

    - set_fact:
        cmds: "{{ [ 'ls -lrt ' + item.path + ' | tail -57' ] + cmds | default([]) }}"
      loop: "{{ foo }}"

    - set_fact:
        allcmd: "{{ cmds | join(' && ')}}"

    - debug:
        var: allcmd

вывод:

ok: [localhost] => {
    "allcmd": "ls -lrt /tmp/MON | tail -57 && ls -lrt /tmp/scripts | tail -57"
}
...