Я пытаюсь скопировать файлы (скрипты и RPM), хранящиеся локально на набор серверов. Я могу копировать файлы, когда имена жестко запрограммированы, но не когда я использую переменную.

Ansible-lint возвращается без ошибок.

При использовании замены переменных я получаю ошибку:

TASK [Copy cpu_gov.sh] 
***************************************************************************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: AttributeError: 'dict' object has no attribute 'endswith'
fatal: [ceph3]: FAILED! => {"msg": "Unexpected failure during module execution.", "stdout": ""}

В режиме отладки я вижу, что это ошибка Python в конце "/". Все остальные варианты использования переменной работают нормально, но только когда она находится в поле "" src: ", происходит сбой.

The full traceback is:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 145, in run
    res = self._execute()
  File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 650, in _execute
    result = self._handler.run(task_vars=variables)
  File "/usr/lib/python2.7/site-packages/ansible/plugins/action/copy.py", line 461, in run
    trailing_slash = source.endswith(os.path.sep)
AttributeError: 'dict' object has no attribute 'endswith'

fatal: [ceph3]: FAILED! => {
    "msg": "Unexpected failure during module execution.",
    "stdout": ""
}
---
### Test
#

- hosts: all

  vars:
   #isdct_rpm: foobar.txt
   isdct_rpm: isdct-3.0.16-1.x86_64.rpm
   cpu_gov: cpu_gov.sh
   irq_bal: irq_balance.sh
   root_dir: /root
   bin_dir: /root/bin
   files_dir: /root/projects/ansible/bootstrap/files

  remote_user: root
  tasks:

Они работают просто отлично -


  - name: ISDCT rpm exists?
    stat:
      path: "{{ root_dir }}/{{ isdct_rpm }}"
    register: isdct_rpm
    tags:
       - tools

  - name: cpu_gov exists?
    stat:
      path: "{{ bin_dir }}/{{ cpu_gov }}"
    register: cpu_gov
    tags:
       - tools

  - name: irq_balance exists?
    stat:
      path: "{{ bin_dir }}/{{ irq_bal }}"
    register: irq_bal
    tags:
       - tools

Первая задача - неудачная:

  - name:  Copy ISDCT rpm
    copy:
      remote_src: no
      src: "{{ isdct_rpm }}"
      dest: "{{ root_dir }}"
    when: not isdct_rpm.stat.exists

Они работают нормально:

  - name:  Copy rpm
    copy:
      remote_src: no
      src: isdct-3.0.16-1.x86_64.rpm
      dest: /root
    when: not isdct_rpm.stat.exists

  - name:  Copy cpu_gov.sh
    copy:
      remote_src: no
      src: cpu_gov.sh
      # - fails - src: "{{ cpu_gov }}"
      dest: "{{ bin_dir }}"
    when: not cpu_gov.stat.exists

  - name:  Copy irq_balance.sh
    copy:
      remote_src: no
      src: irq_balance.sh
      dest: /root
    when: not irq_bal.stat.exists
The full traceback is:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 145, in run
    res = self._execute()
  File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 650, in _execute
    result = self._handler.run(task_vars=variables)
  File "/usr/lib/python2.7/site-packages/ansible/plugins/action/copy.py", line 461, in run
    trailing_slash = source.endswith(os.path.sep)
AttributeError: 'dict' object has no attribute 'endswith'

fatal: [ceph3]: FAILED! => {
    "msg": "Unexpected failure during module execution.",
    "stdout": ""
}
0
Karl Vietmeier 18 Авг 2019 в 01:38

2 ответа

Лучший ответ

В вашем vars разделе есть переменная с именем isdct_rpm, которая является строкой, но вы регистрируете переменную словаря с тем же именем в своей задаче ISDCT rpm exists?. Это переопределяет строковое значение.

Перестаньте пытаться использовать одно и то же имя переменной для двух разных целей, и я подозреваю, что все будет работать как положено.

0
larsks 18 Авг 2019 в 01:50

@larsks ответил на мой вопрос. Я использовал одно и то же имя для моей переменной и значения регистра. Это работает:

   #
  ###--- Copy the scripts over if needed
  #

  - name:  Copy ISDCT rpm
    copy:
      remote_src: no
      src: "{{ isdct_rpm }}"
      dest: "{{ root_dir }}"
    when: not isdctrpm.stat.exists

  - name:  Copy cpu_gov.sh
    copy:
      remote_src: no
      #src: cpu_gov.sh
      src: "{{ cpu_gov }}"
      dest: "{{ bin_dir }}"
    when: not cpugov.stat.exists

  - name:  Copy irq_balance.sh
    copy:
      remote_src: no
      src: "{{ irq_bal }}"
      dest: "{{ bin_dir }}"
    when: not irqbal.stat.exists
0
Karl Vietmeier 18 Авг 2019 в 06:55