Làm thế nào tôi có thể đăng ký một biến có tên động trong một nhiệm vụ Ansible?


11

Tôi đang cố truy xuất ID nhóm của hai nhóm ( syslogutmp) bằng tên bằng cách sử dụng tác vụ Ansible. Đối với mục đích thử nghiệm, tôi đã tạo một playbook để lấy thông tin từ chính máy chủ Ansible.

---
- name: My playbook
  hosts: enabled
  sudo: True
  connection: local
  gather_facts: False
  tasks:
    - name: Determine GIDs
      shell: "getent group {{ item }} | cut -d : -f 3"
      register: gid_{{item}}
      failed_when: gid_{{item}}.rc != 0
      changed_when: false
      with_items:
        - syslog
        - utmp

Thật không may, tôi gặp lỗi sau khi chạy Playbook:

fatal: [hostname] => error while evaluating conditional: gid_syslog.rc != 0

Làm cách nào tôi có thể hợp nhất một tác vụ như thế này thành một dạng tham số hóa trong khi đăng ký các biến riêng biệt , một biến cho mỗi mục để sử dụng sau này? Vì vậy, mục tiêu là có các biến dựa trên tên nhóm mà sau đó có thể được sử dụng trong các nhiệm vụ sau.

Tôi đang sử dụng intbộ lọc trên gid_syslog.stdoutgid_utmp.stdoutthực hiện một số tính toán dựa trên GID trong các tác vụ sau.


Tôi cũng đã thử sử dụng gid.{{item}}gid[item]thay vì gid_{{item}}vô ích.


Sau đây hoạt động tốt tương phản với ở trên:

---
- name: My playbook
  hosts: enabled
  sudo: True
  connection: local
  gather_facts: False
  tasks:
    - name: Determine syslog GID
      shell: "getent group syslog | cut -d : -f 3"
      register: gid_syslog
      failed_when: gid_syslog.rc != 0
      changed_when: false
    - name: Determine utmp GID
      shell: "getent group utmp | cut -d : -f 3"
      register: gid_utmp
      failed_when: gid_utmp.rc != 0
      changed_when: false

Câu trả lời:


8

Tôi cho rằng không có cách nào dễ dàng cho việc đó. Và registervới with_itemsvòng lặp chỉ cần đặt tất cả các kết quả của chúng vào một mảng variable.results. Hãy thử các nhiệm vụ sau:

  tasks:
    - name: Determine GIDs
      shell: "getent group {{ item }} | cut -d : -f 3"
      register: gids
      changed_when: false
      with_items:
        - syslog
        - utmp
    - debug:
        var: gids
    - assert:
        that:
          - item.rc == 0
      with_items: gids.results
    - set_fact:
        gid_syslog: "{{gids.results[0]}}"
        gid_utmp: "{{gids.results[1]}}"
    - debug:
        msg: "{{gid_syslog.stdout}} {{gid_utmp.stdout}}"

Bạn không thể sử dụng mở rộng biến trong set_factcác khóa như thế này:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results

Cảm ơn, tôi sẽ dùng thử, nhưng không chắc là tôi đã đưa ra giải pháp đó vì nó dài hơn và phức tạp hơn cả những gì tôi đã sao chép mọi thứ (ở cuối câu hỏi của tôi). Khả năng đọc là một trong những điểm mạnh của Ansible nếu không, vì vậy làm việc xung quanh sẽ quay lại cắn tôi :)
0xC0000022L

1

Đặt thực tế hỗ trợ các biến, trái ngược với tuyên bố của giải pháp trước đó

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.