Ansible 플레이북 - 조건부 변수 연결

Ansible 플레이북 - 조건부 변수 연결

내 homedir의 특정 부분을 마이그레이션(복사)하는 작업이 있습니다(마지막 두 번째 줄이 중요합니다).

- name: "Migrate my-pc module home files"
  copy:
    src: "{{ migration_source_path }}{{ item }}"
    dest: "{{ migration_destination_path }}{{ item }}"
  loop: "{{ migration_paths_my_pc }}"
  when:
    - not is_migrating_all
    - "'{{ migration_source_path }}{{ item }}' is exists"
    - m_my_pc | bool

두 변수 모두 ..._path항상 슬래시( /)로 끝납니다.

설명:에서 파일 경로 목록을 가져와서 ) 에 migration_paths_my_pc복사합니다 . 이는 다음과 같은 경우에만 발생합니다: 해당 모듈에 대한 플래그가 설정되었습니다( ). 경로는 소스에 존재합니다. 어쨌든 아직 homedir의 모든 파일을 마이그레이션하지는 않습니다( ).migration_source_pathmigration_destination_pathm_my_pcis_migrating_all

현재 작업 중인 솔루션(위)에서는 다음과 같은 경고를 표시합니다.

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: '{{ migration_source_path }}{{ item }}' is exists

나는 내가해야한다는 것을 이해합니다제거하다그만큼중괄호 {{when:조건문이 있기 때문에 섹션 에서암시된어쨌든 그들 주위에 중괄호가 있습니다. 문제는 그것을 작동시키는 방법을 알 수 없다는 것입니다. 많은 것 중 일부실패하다시도는 다음과 같습니다

    - vars["" + migrate_source_path + item] is exists
    - vars[migrate_source_path + item] is exists
    - vars[migrate_source_path ~ item] is exists
    - vars[migrate_source_path]vars[item] is exists
    - '' + migrate_source_path + item is exists
    - lookup('/home/k/test/test2/' + item) is exists
    - "{{ lookup('vars', 'migrate_source_path' + 'item') is exists }}"
    - "{{ lookup('vars', 'migrate_source_path') + lookup('vars', 'item') is exists }}"
    - lookup('vars', 'migrate_source_path')lookup('vars', 'item') is exists

배경:

저는 실용적인 이유로 개인 PC 설정을 자동화하고 Ansible 및 Ansible 플레이북에 대해 자세히 알아보고 있습니다.

다른 권장 사항이나 조언도 환영합니다(댓글을 통해).

업데이트:

마이그레이션에 대한 나의 설계 목표(기능적 열망)는 다음과 같습니다.

  • 유지 관리 비용을 낮게 유지하고 싶지만 필요할 경우 어떤 경로가 복사되었는지, 어떤 경로를 건너뛰었는지 정보를 알고 싶습니다. 그래서 경로에 소스가 누락되어도 스크립트가 중단되거나 오류가 발생하지 않고 소스에 존재하는 경로를 복사해야 한다고 생각했습니다. 경고나 기타 일반 메시지가 있으면 좋습니다. 내 현재 스크립트는 이를 허용합니다.
  • 복사 시도가 가능한 경로와 그렇지 않은 경로를 쉽게 전환할 수 있으면 좋을 것입니다(예: 마이그레이션과 관련하여 변경될 수 있음). 이 작업을 수행하는 것은 project/vars/직관적인 것처럼 보이므로 작업 내에서 전환하는 것보다 더 나은 디자인일 수 있습니다. 주석 처리되거나 변경될 가능성이 더 높은 다른 변수도 있습니다 project/vars/. 무언가에 주석을 달거나 주석을 제거하는 것은 대부분의 텍스트 편집기와 IDE에서 단일 단축키입니다. 매우 편리합니다.

답변1

귀하의 시도는 지나치게 복잡합니다. Jinja 구분 기호는 이미 Jinja 표현식으로 해석되는 항목에 있으므로 조건에 사용하면 안 됩니다. 따라서 원하는 결과를 제공하는 항목으로 대체하면 됩니다.

이 경우 두 변수를 연결한 문자열을 생성하므로 이를 연결로 바꿔야 합니다.

    - (migration_source_path ~ item) is exists

귀하는 귀하의 예에서 migrate_source_path및 를 모두 사용했기 때문에 임의로 올바른 것을 migration_source_path선택했습니다 .migration_source_path

당신은 다음과 가까운 사이였습니다:

    - '' + migration_source_path + item is exists

그러나 YAML 파서가 좋아하지 않는 불필요한 선행 빈 문자열이 있으며 이를 올바르게 인용하거나 불필요한 문자열을 제거하여 이를 수정했습니다.

    - "'' + migration_source_path + item is exists"
    - migration_source_path + item is exists

괄호를 사용하여 올바른 순서를 강제로 적용하지 않았기 때문에 migration_source_pathand 를 추가하려고 합니다 .item is exists

답변2

조금 다르게 다시 작성해 보세요. 를 사용하여 배열을 반복하는 대신 또는 loop에서 복사하려는 디렉토리를 지정하십시오 . 한 대상에서 다른 대상으로 복사하려는 파일 목록을 정말로 갖고 싶다면 해당 부분에 목록을 작성할 수 있습니다. 모듈은 소스 파일이 존재하는지 테스트하고 오류를 표시합니다. 이 경우에는 좋은 일입니다. 그렇지 않으면 마이그레이션에 결함이 있을 수 있기 때문입니다.withwith_fileglobwith

when작업 자체나 해당 동작을 제어하는 ​​것이 아니라 작업을 실행할지 여부를 Ansible에 알려주는 데 사용된다는 점을 기억하세요 . 이를 달성하기 위해 핸들러, 레지스터 및 기타 리소스를 사용합니다.

친애하는.

관련 정보