Как мы можем гарантировать, что ansible зарегистрированная переменная имеет определенный атрибут - PullRequest
0 голосов
/ 18 января 2020

У меня есть книга с запросом ниже SQL:

  - name: "Search for Front"
    command: >
      mysql --user="{{ DBUSER }}" --password="{{ DBPASS }}" deployment
      --host=localhost --batch --skip-column-names
      --execute="SELECT * FROM mytable WHERE num LIKE '{{ Number }}'"
    register: result_front
    when: Layer == 'Front'

  - name: "Search for Back"
    command: >
      mysql --user="{{ DBUSER }}" --password="{{ DBPASS }}" deployment
      --host=localhost --batch --skip-column-names
      --execute="SELECT * FROM mytable WHERE num LIKE '{{ Number }}'"
    register: result_back
    when: Layer == 'Back'

Я запускаю эту книгу, как показано ниже:

ansible-playbook test.yml -e "Layer=Front" -e "Number=1234" -e "DBUSER=root" -e "DBPASS=password"

Обратите внимание, что одновременно может быть только один из два sql запроса будут выполняться в зависимости от переданного параметра "Layer".

I wi sh для set_fact "reqnum" для строки "Deploy", если какой-либо из указанных выше двух SQL запросов возвращает найденные записи ,

Вот что я сделал:

   - set_fact:
       reqnum: "Deploy"
     when: result_back.stdout_lines | default([]) | length != ""  and result_back.skipped == False

   - set_fact:
       reqnum: "Deploy"
     when: result_front.stdout_lines |  default([]) | length != ""  and result_front.skipped == False

Однако я получаю следующую ошибку:

TASK [set_fact] ****************************************************************
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'result_back.stdout_lines == \"\"  and result_back.skipped == False' failed. The error was: error while evaluating conditional (result_back.stdout_lines == \"\"  and result_back.skipped == False): 'dict object' has no attribute 'stdout_lines'\n\nThe error appears to be in '/app/deploy.yml': line 149, column 6, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n   - set_fact:\n     ^ here\n"}

Как правильно проверить такие условия, когда один переменная пропускается, а другая получает сбой или успех в результате?

1 Ответ

0 голосов
/ 20 января 2020

Как правильно проверить такие условия, когда одна переменная пропускается, а другая получает сбой или успех в результате?

Это изменение порядка when:, поэтому сначала он проверяет проверку is skipped, а затем не пытается взорвать ссылку на переменную; например:

- command: date
  register: alpha
  when: doit == 'alpha'

- command: uptime
  register: beta
  when: doit == 'beta'

- set_fact:
    reqnum: Deploy Alpha
  when: alpha is not skipped and (alpha.stdout_lines|length) > 0

- set_fact:
    reqnum: Deploy Beta
  when: beta is not skipped and (beta.stdout_lines|length) > 0

- debug: var=reqnum

Все это именно то, что @Zeitounator пытался вам сказать, но просто упаковал в один рабочий пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...