Ansible에서 awk 명령 실행에 대한 조언이 필요합니다.

Ansible에서 awk 명령 실행에 대한 조언이 필요합니다.

동일한 명명 규칙을 사용하는 일부 SQL 스크립트 파일이 있습니다.

pole15432-pole15435.sql 
pole15435-pole15447.sql 
pole15447-pole15453.sql 
pole15453-pole15454.sql

다음보다 큰 파일만 필터링하고 싶습니다 pole15435-pole15447.sql. 다음을 통해 터미널에서 직접 이 작업을 수행할 수 있습니다.

ls -1 pole* | awk '$1 > "pole15435-pole15447.sql"'

결과:

pole15447-pole15453.sql
pole15453-pole15454.sql

그러나 ansible에서 동일한 작업을 수행하면 결과가 나오지 않습니다.

    - name: Find upgrade scripts that need to be executed
      shell: ls -1 pole* | awk '$1 > "pole15392-pole15402.sql\"'
      #shell: "ls -1 | sed -n /pole15392-pole15402.sql/,//p"
      args:
       chdir: /data/releases/Upgrade Scripts
      delegate_to: localhost 
      register: scripts
    
    - debug:
       msg: "{{scripts}}"
result:
changed: [10.101.96.176] => {"changed": true, "cmd": "ls -1 pole* | awk '$1 > \"pole15392-pole15402.sql\"'", "delta": "0:00:00.010166", "end": "2022-10-15 18:01:04.441383", "rc": 0, "start": "2022-10-15 18:01:04.431217", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

누구든지 도와줄 수 있나요?

답변1

묻다:"pole15435-pole15447.sql보다 큰 파일만 필터링합니다."

답: 주어진 파일

  file: pole15435-pole15447.sql

및 파일 목록

  files:
    - pole15453-pole15454.sql
    - pole15432-pole15435.sql 
    - pole15435-pole15447.sql 
    - pole15447-pole15453.sql 

목록을 정렬하고, 파일의 인덱스를 가져오고, 조각을 만듭니다.

files_sort: "{{ files|sort }}"
file_index: "{{ files_sort.index(file) }}"
files_select: "{{ files_sort[file_index|int + 1:] }}"

주어진

  files_select:
  - pole15447-pole15453.sql
  - pole15453-pole15454.sql

테스트를 위한 완전한 플레이북 예시

- hosts: localhost

  vars:

    files:
      - pole15432-pole15435.sql 
      - pole15435-pole15447.sql 
      - pole15447-pole15453.sql 
      - pole15453-pole15454.sql

    files_sort: "{{ files|sort }}"
    file: pole15435-pole15447.sql
    file_index: "{{ files_sort.index(file) }}"
    files_select: "{{ files_sort[file_index|int + 1:] }}"

  tasks:

    - debug:
        var: files_sort
    - debug:
        var: file_index
    - debug:
        var: files_select

사용하고 싶다면파일 이름을 변수에 넣습니다. 예를 들어, 나무가 주어지면

shell> tree sql/
sql/
├── pole15432-pole15435.sql
├── pole15435-pole15447.sql
├── pole15447-pole15453.sql
└── pole15453-pole15454.sql

아래 스크립트

- hosts: localhost

  vars:

    file: pole15435-pole15447.sql

  tasks:

    - shell:
        cmd: ls -1 pole* | awk '$1 > "{{ file }}"'
        chdir: "{{ playbook_dir }}/sql"
      register: scripts
    
    - debug:
       var: scripts.stdout_lines

주어진 (요약된)

  scripts.stdout_lines:
  - pole15447-pole15453.sql
  - pole15453-pole15454.sql

답변2

ls -1 polly* | awk '$1 > "{{ file}}"'에서 문제를 발견했습니다. -1 매개변수는 파일 이름 이상의 것을 추출하며 awk는 Ansible을 통해 이를 처리할 수 없습니다. -1(one)을 사용하여 수정하세요.

관련 정보