&&を使用したawkコマンド

&&を使用したawkコマンド

私がやりたいことは、ホスト名とvlumeの50%以上を得るためにAnsibleでawkを使用することです。

その後、次のコマンドを実行してボリュームを50%以上に設定できます。

ansible-playbook pb-servermgmt_runcommand_goce.yml --extra-vars "hostlist=test01 command='df -hlT -x tmpfs -x devtmpfs -x iso9660 --total'" | awk '0+$6 >= 50 {print}'
        "/dev/mapper/rhel-root xfs    50G   35G   16G  70% /",

次のコマンドを実行してサーバー名を表示できます。

ansible-playbook pb-servermgmt_runcommand_goce.yml --extra-vars "hostlist=test01 command='df -hlT -x tmpfs -x devtmpfs -x iso9660 --total'" | awk '/ok/ {print}'
ok: [test01] => {
test01                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

私は次のような出力が欲しい

ok: [test01] => {
        "/dev/mapper/rhel-root xfs    50G   35G   16G  70% /",

私はそれを見ていますが、&&書き込み構文を取得できませんでした。どんなアイデアがありますか?

答え1

尋ねる:「使用率が50%以上のホスト名とボリュームを取得します。」

答え:それよりもアッフィルタの使用コミュニティ、一般.jcコマンドの出力を解析します。登録コマンドの出力

    - command: "{{ command }}"
      register: out

そして変数宣言

    my_df: "{{ out.stdout|community.general.jc('df') }}"

たとえば、次のスクリプトは

- hosts: "{{ hostlist }}"

  vars:

    my_df: "{{ out.stdout|community.general.jc('df') }}"

  tasks:

    - command: "{{ command }}"
      register: out

    - debug:
        var: my_df

与えられた(要約)

shell> ansible-playbook pb.yml -e "hostlist=test01 command='df -hlT --total'"

PLAY [test01] *************************************************************************************

TASK [command] ************************************************************************************
changed: [test01]

TASK [debug] **************************************************************************************
ok: [test01] => 
  my_df:
  - available: 1
    filesystem: devtmpfs
    mounted_on: /dev
    size: 1.9G
    type: devtmpfs
    use_percent: 0
    used: 0
  - available: 1
    filesystem: tmpfs
    mounted_on: /dev/shm
    size: 1.9G
    type: tmpfs
    use_percent: 0
    used: 0
  - available: 1
    filesystem: tmpfs
    mounted_on: /run
    size: 1.9G
    type: tmpfs
    use_percent: 11
    used: 193
  - available: 1
    filesystem: tmpfs
    mounted_on: /sys/fs/cgroup
    size: 1.9G
    type: tmpfs
    use_percent: 0
    used: 0
  - available: 2
    filesystem: /dev/mapper/cl-root
    mounted_on: /
    size: 18G
    type: xfs
    use_percent: 86
    used: 15
  - available: 820
    filesystem: /dev/sda2
    mounted_on: /boot
    size: 1014M
    type: xfs
    use_percent: 20
    used: 195
  - available: 592
    filesystem: /dev/sda1
    mounted_on: /boot/efi
    size: 599M
    type: vfat
    use_percent: 2
    used: 7
  - available: 374
    filesystem: tmpfs
    mounted_on: /run/user/1000
    size: 374M
    type: tmpfs
    use_percent: 0
    used: 0
  - available: 12
    filesystem: total
    mounted_on: '-'
    size: 27G
    type: '-'
    use_percent: 58
    used: 16
...

その後、このリストを使用できます。my_dfそして選ぶまたは拒否するあなたは何が欲しいですか?バラより振り子テスト。たとえば、すべての種類のファイルシステムを選択します。xfs利用率が50%を超えました。

    my_df_xfs_50: "{{ my_df|selectattr('type', '==', 'xfs')|
                            selectattr('use_percent', '>', 50)}}"

、またはファイルシステムの選択/dev/mapper/cl-root

    my_df_root: "{{ my_df|selectattr('filesystem', '==', '/dev/mapper/cl-root') }}"

この例では、両方とも同じ結果を提供します。

  my_df_xfs_50:
  - available: 2
    filesystem: /dev/mapper/cl-root
    mounted_on: /
    size: 18G
    type: xfs
    use_percent: 86
    used: 15
  my_df_root:
  - available: 2
    filesystem: /dev/mapper/cl-root
    mounted_on: /
    size: 18G
    type: xfs
    use_percent: 86
    used: 15

50%を超える使用量でホスト名とボリュームに書き込む

次の辞書を宣言します。

  report: "{{ dict(ansible_play_hosts|
                   zip(ansible_play_hosts|
                       map('extract', hostvars, 'my_df_xfs_50'))) }}"

デバッグ

    - set_fact:
        my_df_xfs_50: "{{ my_df_xfs_50 }}"
    - debug:
        msg: |
          {{ report }}
      run_once: true

与えられた

    test01:
    - available: 2
      filesystem: /dev/mapper/cl-root
      mounted_on: /
      size: 18G
      type: xfs
      use_percent: 86
      used: 15

望むより:


尋ねる:「設定モジュールを介して可能な事実からこの情報を取得することはすでに可能ではありませんか?」

答え:はい。コマンドではなくdf、利用できますansible_mountsコレクター設定。このリストは使用率を提供しません。リストを更新するには、このプロパティを使用します。その後、次のスクリプト

shell> cat pb.yml
- hosts: "{{ hostlist }}"

  vars:

    ansible_mounts_update_str: |
      {% for i in ansible_mounts %}
      {% set use_percent = 100 - i.size_available / i.size_total * 100 %}
      - {{ i|combine({'use_percent': use_percent|round|int}) }}
      {% endfor %}
    ansible_mounts_update: "{{ ansible_mounts_update_str|from_yaml }}"

    my_df_xfs_50: "{{ ansible_mounts_update|
                      selectattr('fstype', '==', 'xfs')|
                      selectattr('use_percent', '>', 50) }}"
    my_df_root: "{{ ansible_mounts_update|
                    selectattr('device', '==', '/dev/mapper/cl-root') }}"

    report: "{{ dict(ansible_play_hosts|
                     zip(ansible_play_hosts|
                         map('extract', hostvars, 'my_df_xfs_50'))) }}"

  tasks:

    - setup:
        gather_subset: mounts
    - debug:
        var: ansible_mounts
    - debug:
        var: ansible_mounts_update

    - debug:
        var: my_df_xfs_50
    - debug:
        var: my_df_root

    - set_fact:
        my_df_xfs_50: "{{ my_df_xfs_50 }}"
    - debug:
        msg: |
          {{ report }}
      run_once: true

(要約)同じ結果を提供します。

shell> ansible-playbook pb.yml -e "hostlist=test01"

PLAY [test01] *************************************************************************************

TASK [setup] **************************************************************************************
ok: [test01]

...

TASK [debug] **************************************************************************************
ok: [test01] => 
  my_df_xfs_50:
  - block_available: 617954
    block_size: 4096
    block_total: 4561408
    block_used: 3943454
    device: /dev/mapper/cl-root
    fstype: xfs
    inode_available: 4944209
    inode_total: 5351696
    inode_used: 407487
    mount: /
    options: rw,seclabel,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota
    size_available: 2531139584
    size_total: 18683527168
    use_percent: 86
    uuid: 2cb4d983-108f-40f3-bc22-8afae8edc80a

TASK [debug] **************************************************************************************
ok: [test01] => 
  my_df_root:
  - block_available: 617954
    block_size: 4096
    block_total: 4561408
    block_used: 3943454
    device: /dev/mapper/cl-root
    fstype: xfs
    inode_available: 4944209
    inode_total: 5351696
    inode_used: 407487
    mount: /
    options: rw,seclabel,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota
    size_available: 2531139584
    size_total: 18683527168
    use_percent: 86
    uuid: 2cb4d983-108f-40f3-bc22-8afae8edc80a

TASK [set_fact] ***********************************************************************************
ok: [test01]

TASK [debug] **************************************************************************************
ok: [test01] => 
  msg:
    test01:
    - block_available: 617954
      block_size: 4096
      block_total: 4561408
      block_used: 3943454
      device: /dev/mapper/cl-root
      fstype: xfs
      inode_available: 4944209
      inode_total: 5351696
      inode_used: 407487
      mount: /
      options: rw,seclabel,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota
      size_available: 2531139584
      size_total: 18683527168
      use_percent: 86
      uuid: 2cb4d983-108f-40f3-bc22-8afae8edc80a

PLAY RECAP ****************************************************************************************
test01: ok=7    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

関連情報