ansible はシェルコマンドの結果を変数に渡します。

ansible はシェルコマンドの結果を変数に渡します。

ansibleと自動生成IDには少し問題があります。複数のmysqlマスターサーバーとスレーブサーバーがあり、サーバーIDを生成する必要があります。

私の考えは、次のようにすることです。

   - name: generate repli-id
      shell: hostname -I | sed -e 's/ \+\([a-z0-9]\+\:\)\+[a-z0-9]\+//' | sed -e 's/ /\n/' | grep -v '^$' | tail -1 | awk -F. '{print $3 * 256 + $4}'
      register:  slave_repli

    - debug: var=slave_repli.stdout_lines

    - name: rewrite
      template: src=templates/root.j2 dest=/root/test.conf

そのため、生成されたIDを取得しました。

TASK [debug] *******************************************************************
task path: /Users/miwi/ansible/roles/test/main.yml:32
ok: [mysqls5slave] => {
    "slave_repli.stdout_lines": [
        "3698"
    ]
}
ok: [mysqls5master] => {
    "slave_repli.stdout_lines": [
        "3699"
    ]
}

私の質問は今、私のvarファイルに渡す方法です。

スレーブサーバーID:{{スレーブサーバーID}}

答え1

local_action とともにコピーモジュールを使用して、変数を制御システムのローカルファイルに保存し、後で次のプレイブックで使用できます。

- local_action: copy content="slave_server_id: {{ slave_repli.stdout_lines[0] }}" dest=/path/to/var/file

答え2

プレイブックからIDを生成する代わりに、ここでカスタムファクトを定義できます。 mysqlサーバーで次のことができます。

mkdir -p /etc/ansible/facts.d
cat <<EOF >/etc/ansible/facts.d/mysql.fact
#!/bin/sh
echo "[mysql]"
echo server_id=`hostname -I | sed -e 's/ \+\([a-z0-9]\+\:\)\+[a-z0-9]\+//' | sed -e 's/ /\n/' | grep -v '^$' | tail -1 | awk -F. '{print $3 * 256 + $4}'`
EOF
chmod +x /etc/ansible/facts.d/mysql.fact

ansible -m setup your.mysql.ip.address事実が正しく実行されていることを確認するために実行してください。いくつかの定義が必要ですansible_local['mysql']['mysql']['server_id']

これを展開できると仮定すると、次のことができます。

- name: install fact
  copy: src=myfact dest=/etc/ansible/facts.d/mysql.fact owner=root group=root mode=0755
  register: fact_installed
- name: reload facts
  setup: filter=ansible_local
  when: fact_installed is defined and fact_installed.changed == True

その後、変数を参照してテンプレートを含めることができますserver_id

答え3

テンプレートから生成された値を使用するには2つのオプションがあります。

オプション1:slave_repli.stdout_linesテンプレートで使用:

# in templates/root.j2:
...
slave_server_id: {{ slave_repli.stdout_lines[0] }}
...

オプション2:変数を割り当てる

スクリプトから:

- name: rewrite
  vars:
    slave_server_id: "{{ slave_repli.stdout_lines[0] }}"
  template:
    src: templates/root.j2
    dest: /root/test.conf

テンプレートから:

# in templates/root.j2:
...
slave_server_id: {{ slave_server_id }}
...

私は2番目の方法がよりきれいなので好む。

関連情報