Ansible Playbookからコマンドのstdoutを変数に抽出する方法

Ansible Playbookからコマンドのstdoutを変数に抽出する方法

Ansibleを使用して仮想マシンにDocker資格情報ストアをインストールしようとしています。

これはplaybook.yamlの資格情報保存コードの一部です。

しかし、問題はgpgキーIDをplay.4から変数としてエクスポートしようとしていますが、play.6でその変数をエコーできないことです。

レジスタを試してみましたが、レジスタ変数が他のゲームのシェルコマンドでは動作しないようです。

 - name: 1. Install gpg and pass
    apt:
      update_cache: yes
      name:
      - gpg
      - pass
  - name: 2. Create GPG key
    shell: |
      cat > /root/gpgKey <<EOF
      %echo Generating a default key
       Key-Type: default
       Subkey-Type: default
       Name-Real: abc999
       Name-Comment: abc999
       Name-Email: [email protected]
       Expire-Date: 0
       Passphrase: abc999
       %commit
       %echo done
      EOF
  - name: 3. Generate keys with `/root/gpgKey` file
    shell: |
      sudo gpg --batch --generate-key /root/gpgKey
  - name: 4. Verify key generation
    shell: |
      var=$(sudo gpg --list-secret-keys --keyid-format=long | sed '4!d' | tr -d " ")
  - name: 5. Download docker-credential-pass
    shell: |
      export PASS_VERSION="v0.6.0"
      wget -q "https://github.com/docker/docker-credential-helpers/releases/download/${PASS_VERSION}/docker-credential-pass-${PASS_VERSION}-amd64.tar.gz" -O - | sudo tar -x -C /usr/bin
      sudo chmod 710 "/usr/bin/docker-credential-pass"
  - name: 6. Echo GPG id
    shell: |
      echo $var

ansible-playbook playbook.yaml -vvvこれはplay.6コマンドの出力ですecho $var。標準出力には何もありません。

changed: [localhost] => {
    "changed": true,
    "cmd": "echo $var\n",
    "delta": "0:00:00.002488",
    "end": "2023-04-27 09:36:46.483048",
    "invocation": {
        "module_args": {
            "_raw_params": "echo $var\n",
            "_uses_shell": true,
            "argv": null,
            "chdir": null,
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "stdin_add_newline": true,
            "strip_empty_ends": true,
            "warn": true
        }
    },
    "rc": 0,
    "start": "2023-04-27 09:36:46.480560",
    "stderr": "",
    "stderr_lines": [],
    "stdout": "",
    "stdout_lines": []
}

ベストアンサー1

コメントについて」registerAnsibleがそれを保存できるようにするには、コマンドの出力が必要です。「そして」私はregister以前これを試しましたが、register他のプレイのシェルで変数を使用する方法を見つけることができませんでした。「次のような最小のサンプルスクリプトを見たことがあります。

---
- hosts: localhost
  become: true
  gather_facts: false

  tasks:

  - name: 4. Verify key generation
    shell:
      cmd: "gpg --list-secret-keys --keyid-format=long | sed '4!d' | tr -d ' '"
    register: VAR

  - name: 6. Echo GPG ID
    shell:
      cmd: "echo {{ VAR.stdout_lines }}"
    register: result

  - name: Show result
    debug:
      var: result

またはより一般的に

---
- hosts: localhost
  become: false
  gather_facts: false

  tasks:

  - name: Echo example 1
    shell:
      cmd: "echo 12:34:56:78:90:AB:CD:EF"
    register: VAR

  - name: Echo example 2
    shell:
      cmd: "echo {{ VAR.stdout_lines }}"
    register: result

  - name: Show registered variable
    debug:
      var: result

  - name: Show result content only
    debug:
      msg: "{{ result }}"

これは、登録、戻り値、データ構造に慣れる方法を示すためです。

追加文書

おすすめ記事