จะต้องการสถานะเกลือที่สร้างขึ้นแบบไดนามิกจากภายในลูปที่สร้างสถานะเกลือแบบไดนามิกได้อย่างไร

นี่คือสิ่งที่ฉันพยายามทำให้สำเร็จ

ฉันมีสถานะเกลือที่จัดการผู้ใช้และกลุ่มใน linux, เทมเพลต /etc/skel และจะจัดการเทมเพลตอื่น ๆ ที่เกี่ยวข้องกับผู้ใช้อีกมากมายในภายหลัง

ในระยะสั้น:

บางสถานะถูกสร้างขึ้นจากการอ่านเสาหลักที่มีผู้ใช้และคุณสมบัติอยู่ใน for loop

บางรัฐถูกสร้างขึ้นจากการอ่านเสาหลักที่มีกลุ่มและคุณสมบัติ

จะมีกลุ่มที่เป็นกลุ่มหลักสำหรับผู้ใช้ ไม่ใช่ทุกกลุ่มที่จะมีผู้ใช้หลัก และผู้ใช้ที่สร้างขึ้นทั้งหมดจะมีกลุ่มหลักที่สร้างขึ้นซึ่งตั้งชื่อตามผู้ใช้ ดูเหมือนว่าจะต้องสร้างกลุ่มด้วยเกลือก่อนที่จะสร้างผู้ใช้ ดังนั้น สำหรับแต่ละสถานะของผู้ใช้ โดยที่สถานะถูกสร้างขึ้นโดยลูป และผู้ใช้ถูกสร้างโดยสถานะนั้น จำเป็นต้องมีกลุ่มที่เกี่ยวข้อง อย่างไรก็ตาม สถานะของกลุ่มไม่มีอยู่แบบคงที่ แต่สถานะกลุ่มก็ถูกสร้างขึ้นแบบไดนามิกจากเสาหลักของกลุ่มด้วย ดังนั้นเกลือไม่จำเป็นต้องแสดงทุกสถานะในลำดับเดียวกันในแต่ละครั้งเนื่องจากการเรียงลำดับตามตัวอักษร แต่ลำดับจะถูกกำหนดหลังจากแก้ไขข้อกำหนดทั้งหมดแล้ว (BTW ฉันพยายามทำให้บทสรุปของการจัดเรียงนี้สั้นและไม่ลงหลุมกระต่ายที่นี่ในหัวข้อการเรนเดอร์เกลือ)

ฉันคิดว่าปัญหาที่ฉันมีคือสถานะกลุ่มไม่ได้ถูกสร้างขึ้นในขณะที่สร้างสถานะผู้ใช้

ฉันได้โพสต์ไว้ด้านล่างสถานะพร้อมกับการกำหนดค่าที่ต้องการซึ่งทำให้เกิดข้อผิดพลาด เมื่อข้อกำหนดมีอยู่ จะไม่สร้างผู้ใช้แต่จะสร้างกลุ่ม เมื่อข้อกำหนดถูกลบออก ก็จะสร้างกลุ่มและผู้ใช้

หากฉันลบบรรทัดที่ต้องการออก ขณะนี้ฉันได้รับผลลัพธ์ที่คาดหวังไว้ แต่ไม่แน่ใจว่าฉันจะได้รับผลลัพธ์ที่คาดหวังในระยะยาวเมื่อสิ่งนี้เติบโตขึ้น

นอกจากนี้ ฉันสนใจอย่างมากในการหาวิธีที่จะต้องการบางสิ่งจากสถานะที่สร้างขึ้นแบบไดนามิกภายในสถานะอื่นที่สร้างขึ้นแบบไดนามิก

แนวคิดใด ๆ ที่นี่เพื่อแก้ไขสิ่งนี้เพื่อแก้ไขปัญหานั้นจะได้รับการชื่นชมเช่นเคยที่นี่ :)

นี่คือไฟล์สถานะ:

/etc/skel:
  file.directory:
    - name: /etc/skel
    - user: root
    - group: root
    - dir_mode: 755
/etc/skel/.bash_logout:
  file.managed:
    - name: /etc/skel/.bash_logout
    - user: root
    - group: root
    - mode: 644
    - source: salt://user_management/templates/etc/skel/bash_logout.sls
/etc/skel/.bash_profile:
  file.managed:
    - name: /etc/skel/.bash_profile
    - user: root
    - group: root
    - mode: 644
    - source: salt://user_management/templates/etc/skel/bash_profile.sls
/etc/skel/.bashrc:
  file.managed:
    - name: /etc/skel/.bashrc
    - user: root
    - group: root
    - mode: 644
    - source: salt://user_management/templates/etc/skel/bashrc.sls
{% for group in pillar['user_management']['groups'] %}
{{- group }}:
  group.present:
    - name: "{{ pillar['user_management']['groups'][group]['name'] }}"
    - gid: "{{ pillar['user_management']['groups'][group]['gid'] }}"
    - system: "{{ pillar['user_management']['groups'][group]['system'] }}"
  {%- if pillar['user_management']['groups'][group]['addusers'] %}
    - addusers:
    {%- for add_user_name in pillar['user_management']['groups'][group]['addusers'] %}
      - {{ add_user_name }}
    {%- endfor %}
  {%- endif %}
  {%- if pillar['user_management']['groups'][group]['delusers'] %}
    - delusers:
    {%- for del_user_name in pillar['user_management']['groups'][group]['delusers'] %}
      - {{ del_user_name }}
    {%- endfor %}
  {%- endif %}
  {%- if pillar['user_management']['groups'][group]['members'] %}
    - members:
    {%- for member_name in pillar['user_management']['groups'][user]['members'] %}
      - {{ member_name }}
    {%- endfor %}
  {%- endif %}
{% endfor %}
{% for user in pillar['user_management']['users'] %}
{{- user }}:
  user.present:
    - name: "{{ pillar['user_management']['users'][user]['name'] }}"
    - uid: "{{ pillar['user_management']['users'][user]['uid'] }}"
    - gid: "{{ pillar['user_management']['users'][user]['gid'] }}"
    - gid_from_name: "{{ pillar['user_management']['users'][user]['gid_from_name'] }}"
  {%- if pillar['user_management']['users'][user]['groups'] %}
    - groups:
    {%- for group_name in pillar['user_management']['users'][user]['groups'] %}
      - {{ group_name }}
    {%- endfor %}
  {%- endif %}
  {%- if pillar['user_management']['users'][user]['optional_groups'] %}
    - optional_groups:
    {%- for optional_group_name in pillar['user_management']['users'][user]['optional_groups'] %}
      - {{ optional_group_name }}
    {%- endfor %}
  {%- endif %}
  {%- if pillar['user_management']['users'][user]['remove_groups'] %}
    - remove_groups:
    {%- for remove_group_name in pillar['user_management']['users'][user]['remove_groups'] %}
      - {{ remove_group_name }}
    {%- endfor %}
  {%- endif %}
    - home: "{{ pillar['user_management']['users'][user]['home'] }}"
    - createhome: "{{ pillar['user_management']['users'][user]['createhome'] }}"
    - password: "{{ pillar['user_management']['users'][user]['password'] }}"
    - enforce_password: "{{ pillar['user_management']['users'][user]['enforce_password'] }}"
    - empty_password: "{{ pillar['user_management']['users'][user]['empty_password'] }}"
    - shell: "{{ pillar['user_management']['users'][user]['shell'] }}"
    - unique: "{{ pillar['user_management']['users'][user]['unique'] }}"
    - system: "{{ pillar['user_management']['users'][user]['system'] }}"
    - fullname: "{{ pillar['user_management']['users'][user]['fullname'] }}"
    - require:
      - group: {{ user|replace("user", "group") }}
{% endfor %}

นี่คือไฟล์เสาหลักของผู้ใช้:

user_management:
  users:
    user_mdresden:
      name: mdresden
      uid: 10000
      gid: 10000
      gid_from_name: True
      groups:
        - wheel
      optional_groups:
        - users
      remove_groups:
        # - list
      home: /home/mdresden
      createhome: True
      password: '$6$wBMXk1u6Jxapb5GR$o4YckBYhVjZZ28vyOkcPwBLMH2tcgWAPqdqzLLOGGY5DCM1aaz/rNfnjpMdcmE4GFt/5dzwu8z3YXViptLTMT/'
      enforce_password: True
      empty_password: False
      shell: "/bin/bash"
      unique: True
      system: False
      fullname: "Matthew Dresden"
    user_csunderarajulu:
      name: csunderarajulu
      uid: 10001
      gid: 10001
      gid_from_name: True
      groups:
        # - list
      optional_groups:
        - users
      remove_groups:
        # - list
      home: /home/csunderarajulu
      createhome: True
      password: '$6$wBMXk1u6Jxapb5GR$o4YckBYhVjZZ28vyOkcPwBLMH2tcgWAPqdqzLLOGGY5DCM1aaz/rNfnjpMdcmE4GFt/5dzwu8z3YXViptLTMT/'
      enforce_password: True
      empty_password: False
      shell: "/bin/bash"
      unique: True
      system: False
      fullname: "Chandrasekaran Sunderarajulu"

นี่คือไฟล์เสาหลักของกลุ่ม:

user_management:
  groups:
    group_mdresden:
      name: mdresden
      gid: 10000
      system: False
      addusers:
        # - list
        # - list
      delusers:
        # - list
        # - list
      members:
    group_csunderarajulu:
      name: csunderarajulu
      gid: 10001
      system: False
      addusers:
        # - list
        # - list
      delusers:
        # - list
        # - list
      members:

ดูเหมือนว่าข้อผิดพลาดจะเกิดขึ้นในการใช้งานจริงเท่านั้น ไม่ใช่เมื่อเปิดใช้งานการทดสอบ นี่คือข้อผิดพลาดสำหรับผู้ใช้:

user_|-user_csunderarajulu_|-csunderarajulu_|-present:
    ----------
    __run_num__:
        7
    __sls__:
        user_management.users.manage
    changes:
        ----------
    comment:
        One or more requisite failed: user_management.users.manage.group_csunderarajulu
    result:
        False
user_|-user_mdresden_|-mdresden_|-present:
    ----------
    __run_num__:
        6
    __sls__:
        user_management.users.manage
    changes:
        ----------
    comment:
        One or more requisite failed: user_management.users.manage.group_mdresden
    result:
        False

นี่คือผลลัพธ์เมื่อฉันลบข้อกำหนด:

user_|-user_csunderarajulu_|-csunderarajulu_|-present:
    ----------
    __run_num__:
        7
    changes:
        ----------
        fullname:
            Chandrasekaran Sunderarajulu
        gid:
            10001
        groups:
            - csunderarajulu
            - users
        home:
            /home/csunderarajulu
        homephone:
        name:
            csunderarajulu
        passwd:
            x
        roomnumber:
        shell:
            /bin/bash
        uid:
            10001
        workphone:
    comment:
        New user csunderarajulu created
    duration:
        106.136
    name:
        csunderarajulu
    result:
        True
    start_time:
        20:55:32.687433
user_|-user_mdresden_|-mdresden_|-present:
    ----------
    __run_num__:
        6
    changes:
        ----------
        fullname:
            Matthew Dresden
        gid:
            10000
        groups:
            - mdresden
            - users
            - wheel
        home:
            /home/mdresden
        homephone:
        name:
            mdresden
        passwd:
            x
        roomnumber:
        shell:
            /bin/bash
        uid:
            10000
        workphone:
    comment:
        New user mdresden created
    duration:
        153.671
    name:
        mdresden
    result:
        True
    start_time:
        20:55:32.532969

แม้ว่ากลุ่มจะถูกสร้างขึ้นได้สำเร็จ แต่ผลลัพธ์จากการสร้างกลุ่มก็แสดงข้อผิดพลาดเช่นกัน

นี่คือผลลัพธ์สำหรับกลุ่มที่แสดงข้อผิดพลาด:

group_|-group_csunderarajulu_|-csunderarajulu_|-present:
        ----------
        __run_num__:
            5
        changes:
            ----------
            Failed:
                ----------
                gid:
                    10001
        comment:
            Group {0} has been created but, some changes could not be applied
        duration:
            34.491
        name:
            csunderarajulu
        result:
            False
        start_time:
            13:40:14.615013
    group_|-group_mdresden_|-mdresden_|-present:
        ----------
        __run_num__:
            4
        changes:
            ----------
            Failed:
                ----------
                gid:
                    10000
        comment:
            Group {0} has been created but, some changes could not be applied
        duration:
            168.642
        name:
            mdresden
        result:
            False
        start_time:
            13:40:14.445528

นี่คือผลลัพธ์ของ: salt-call --local state.show_sls user_management.users.manage

local:
    ----------
    /etc/skel:
        ----------
        __env__:
            base
        __sls__:
            user_management.users.manage
        file:
            |_
              ----------
              name:
                  /etc/skel
            |_
              ----------
              user:
                  root
            |_
              ----------
              group:
                  root
            |_
              ----------
              dir_mode:
                  755
            - directory
            |_
              ----------
              order:
                  10000
    /etc/skel/.bash_logout:
        ----------
        __env__:
            base
        __sls__:
            user_management.users.manage
        file:
            |_
              ----------
              name:
                  /etc/skel/.bash_logout
            |_
              ----------
              user:
                  root
            |_
              ----------
              group:
                  root
            |_
              ----------
              mode:
                  644
            |_
              ----------
              source:
                  salt://user_management/templates/etc/skel/bash_logout.sls
            - managed
            |_
              ----------
              order:
                  10001
    /etc/skel/.bash_profile:
        ----------
        __env__:
            base
        __sls__:
            user_management.users.manage
        file:
            |_
              ----------
              name:
                  /etc/skel/.bash_profile
            |_
              ----------
              user:
                  root
            |_
              ----------
              group:
                  root
            |_
              ----------
              mode:
                  644
            |_
              ----------
              source:
                  salt://user_management/templates/etc/skel/bash_profile.sls
            - managed
            |_
              ----------
              order:
                  10002
    /etc/skel/.bashrc:
        ----------
        __env__:
            base
        __sls__:
            user_management.users.manage
        file:
            |_
              ----------
              name:
                  /etc/skel/.bashrc
            |_
              ----------
              user:
                  root
            |_
              ----------
              group:
                  root
            |_
              ----------
              mode:
                  644
            |_
              ----------
              source:
                  salt://user_management/templates/etc/skel/bashrc.sls
            - managed
            |_
              ----------
              order:
                  10003
    group_csunderarajulu:
        ----------
        __env__:
            base
        __sls__:
            user_management.users.manage
        group:
            |_
              ----------
              name:
                  csunderarajulu
            |_
              ----------
              gid:
                  10001
            |_
              ----------
              system:
                  False
            - present
            |_
              ----------
              order:
                  10005
    group_mdresden:
        ----------
        __env__:
            base
        __sls__:
            user_management.users.manage
        group:
            |_
              ----------
              name:
                  mdresden
            |_
              ----------
              gid:
                  10000
            |_
              ----------
              system:
                  False
            - present
            |_
              ----------
              order:
                  10004
    user_csunderarajulu:
        ----------
        __env__:
            base
        __sls__:
            user_management.users.manage
        user:
            |_
              ----------
              name:
                  csunderarajulu
            |_
              ----------
              uid:
                  10001
            |_
              ----------
              gid:
                  10001
            |_
              ----------
              gid_from_name:
                  True
            |_
              ----------
              optional_groups:
                  - users
            |_
              ----------
              home:
                  /home/csunderarajulu
            |_
              ----------
              createhome:
                  True
            |_
              ----------
              password:
                  $6$wBMXk1u6Jxapb5GR$o4YckBYhVjZZ28vyOkcPwBLMH2tcgWAPqdqzLLOGGY5DCM1aaz/rNfnjpMdcmE4GFt/5dzwu8z3YXViptLTMT/
            |_
              ----------
              enforce_password:
                  True
            |_
              ----------
              empty_password:
                  False
            |_
              ----------
              shell:
                  /bin/bash
            |_
              ----------
              unique:
                  True
            |_
              ----------
              system:
                  False
            |_
              ----------
              fullname:
                  Chandrasekaran Sunderarajulu
            |_
              ----------
              require:
                  |_
                    ----------
                    group:
                        group_csunderarajulu
            - present
            |_
              ----------
              order:
                  10007
    user_mdresden:
        ----------
        __env__:
            base
        __sls__:
            user_management.users.manage
        user:
            |_
              ----------
              name:
                  mdresden
            |_
              ----------
              uid:
                  10000
            |_
              ----------
              gid:
                  10000
            |_
              ----------
              gid_from_name:
                  True
            |_
              ----------
              groups:
                  - wheel
            |_
              ----------
              optional_groups:
                  - users
            |_
              ----------
              home:
                  /home/mdresden
            |_
              ----------
              createhome:
                  True
            |_
              ----------
              password:
                  $6$wrBLmNvzyQcHsunt$N6qAv4QR/9A4oPb07zeBbdMQTG7dhxMt.5nXUYY3STwqyRlYvGi5G/GmItOu2M.wLzAOz0ClhEsQIUXMGwIwp1
            |_
              ----------
              enforce_password:
                  True
            |_
              ----------
              empty_password:
                  False
            |_
              ----------
              shell:
                  /bin/bash
            |_
              ----------
              unique:
                  True
            |_
              ----------
              system:
                  False
            |_
              ----------
              fullname:
                  Matthew Dresden
            |_
              ----------
              require:
                  |_
                    ----------
                    group:
                        group_mdresden
            - present
            |_
              ----------
              order:
                  10006

สร้างชื่อกลุ่มที่ต้องการที่คาดหวัง เช่น group_mdresden ซึ่งเป็นชื่อกลุ่มที่รัฐจัดทำ


person Dresden    schedule 02.03.2016    source แหล่งที่มา
comment
คุณสามารถโพสต์ผลลัพธ์ของ state.show_sls ได้หรือไม่ เราจะเห็นว่าชื่อ ความต้องการ และอื่นๆ... ใดที่สร้างโดยไฟล์สถานะของคุณ   -  person Christophe Drevet-Droguet    schedule 03.03.2016
comment
ขอขอบคุณที่ให้ความสนใจ ฉันเพิ่มผลลัพธ์ที่ด้านล่างของคำถาม   -  person Dresden    schedule 03.03.2016
comment
ทำไมไม่เพียงแค่กำหนด - requires? คุณสามารถให้ผู้ใช้กำหนดให้สถานะกลุ่มของพวกเขาถูกรัน และเกลือจะเคารพลำดับนั้น   -  person Wayne Werner    schedule 03.03.2016
comment
ฉันคิดว่านั่นคือสิ่งที่สอดคล้อง - ต้องการ: - กลุ่ม: {{ ผู้ใช้|แทนที่ (ผู้ใช้, กลุ่ม) }} คุณกำลังแนะนำความแตกต่างอะไร   -  person Dresden    schedule 03.03.2016
comment
ปรากฏจากเอาต์พุตด้านบน show_sls สร้างข้อกำหนดในสถานะ   -  person Dresden    schedule 03.03.2016
comment
ดูเหมือนทุกอย่างจะโอเค รวมถึงปัจจัยที่จำเป็นด้วย ข้อความแสดงข้อผิดพลาดแจ้งเราว่าข้อกำหนดของกลุ่มล้มเหลว มีข้อผิดพลาดในสถานะ group หรือไม่   -  person Christophe Drevet-Droguet    schedule 04.03.2016
comment
ฉันได้ตรวจสอบและโพสต์ผลลัพธ์ของกลุ่มแล้ว มันแสดงข้อผิดพลาด ซึ่งฉันยังไม่เข้าใจว่าบ่นเกี่ยวกับการตั้งค่า gid แต่จริงๆ แล้วตั้งค่าอย่างถูกต้อง นอกจากนี้ ฉันได้สังเกตเห็นแล้วว่าเมื่อส่วนคำสั่ง need เกิดขึ้น มันล้มเหลวในการสร้างผู้ใช้ เมื่อฉันลบส่วนคำสั่งออก มันจะสร้างผู้ใช้และกลุ่มตามที่คาดไว้ แม้ว่าข้อผิดพลาดของกลุ่มจะยังคงปรากฏอยู่ก็ตาม เท่าที่ฉันสามารถบอกได้ว่าตัวเลือกที่ต้องการไม่ทำงาน ช่วยให้ฉันเข้าใจได้ดีขึ้นว่าข้อกำหนดนั้นดีอย่างไร มันอาจจะล้มเหลวเนื่องจากสิ่งที่ดูเหมือนจะเป็นข้อผิดพลาดปลอมในการสร้างกลุ่มหรือไม่   -  person Dresden    schedule 04.03.2016
comment
ฉันเพิ่มผลลัพธ์ของกลุ่มและข้อผิดพลาดในการมองหารถในโพสต์ต้นฉบับ   -  person Dresden    schedule 04.03.2016
comment
@Dresden gid จะต้องกำหนดเป็นจำนวนเต็ม ไม่ใช่สตริง ฉันก็มีช่วงเวลาที่ยากลำบากเช่นกัน ลองลบเครื่องหมายคำพูดคู่ออกจากคำจำกัดความกลุ่มของคุณ gid ขออภัยที่ตอบช้า.   -  person Christophe Drevet-Droguet    schedule 29.03.2016


คำตอบ (1)


ขอบคุณ คริสตอฟ เดรเวต-โดร้ก

gid และ uid ในไฟล์สถานะของฉันถูกใส่เครื่องหมายคำพูดคู่ สิ่งนี้ทำให้ถูกตีความว่าเป็นสตริงแทนที่จะเป็นจำนวนเต็มซึ่งเป็นสิ่งที่คาดหวัง ปัญหานั้นทำให้เกิดปัญหาอื่น ๆ ทั้งหมด

ดังนั้นคำตอบสำหรับคำถามเดิมคือ ตัวอย่างที่ฉันโพสต์บรรลุผลสำเร็จในสิ่งที่ฉันถามในคำถามอย่างเพียงพอ

person Dresden    schedule 29.03.2016