web-dev-qa-db-ja.com

Ansibleホストでコマンドを実行します。

Ansibleホスト上でコマンドを実行することは可能ですか?

私のシナリオは、内部でホストされている(そして企業のファイアウォールの外側からはアクセスできない)gitサーバーからチェックアウトしたいということです。次に、チェックアウト(tarballed)をプロダクションサーバー(外部でホストされている)にアップロードします。

現時点では、チェックアウトを実行し、それをtarballしてから展開スクリプトを実行するスクリプトを実行することを検討しています。

217
Ross

はい、Ansible Hostでコマンドを実行できます。プレイ内のすべてのタスクをAnsibleホストで実行するように指定することも、個々のタスクをAnsibleホストで実行するようにマークすることもできます。

Ansibleホストでプレイ全体を実行したい場合は、プレイでhosts: 127.0.0.1connection:localを指定します。次に例を示します。

- name: a play that runs entirely on the ansible Host
  hosts: 127.0.0.1
  connection: local
  tasks:
  - name: check out a git repository
    git: repo=git://foosball.example.org/path/to/repo.git dest=/local/path

詳しくはAnsibleのドキュメントの ローカルプレイブック をご覧ください。

Ansible Hostで単一のタスクを実行したいだけの場合は、local_actionを使用してタスクをローカルで実行するように指定できます。例えば:

- name: an example playbook
  hosts: webservers
  tasks:
  - ...

  - name: check out a git repository
    local_action: git repo=git://foosball.example.org/path/to/repo.git dest=/local/path

詳しくはAnsibleのドキュメントの 委任 を参照してください。

編集:これをあなたのインベントリーに加えることであなたのプレイ中にconnection: localをタイプする必要を避けることができます:

localhost ansible_connection=local

(ここでは、劇を指すために "127.0.0.1"の代わりに "localhost"を使用します)。

編集:新しいバージョンのansibleでは、上記の行をインベントリに追加する必要はもうありません。ansibleはすでに存在すると想定しています。

317
Lorin Hochstein

私はあなたがこれらを書くことができるもう少し読みやすい私見である他の2つの方法を見つけました。

- name: check out a git repository
  local_action: 
    module: git
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

OR

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path
65
Gordon Dickens

AnsibleをShellを介してlocalhost上で実行できることを共有したいと思います。

ansible all -i "localhost," -c local -m Shell -a 'echo hello world'

これは簡単な作業やAnsibleの実践的な学習に役立ちます。

コードの例は、この記事から抜粋したものです。

localhostでAnsibleプレイブックを実行しています

31
mxf

あなたはあなたのAnsibleプレイを実行しているところからあなたのAnsibleホスト(管理ホスト)上でコマンドを実行するためにdelegate_toを使用することができます。例えば:

Ansible Hostにファイルがすでに存在する場合は削除します。

 - name: Remove file if already exists
   file:
    path: /tmp/logfile.log
    state: absent
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

Ansible Hostに新しいファイルを作成します。

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1
11
c_agrawal

@gordonによる答えを拡張して、これがShell/commandモジュールで読みやすい構文と引数の受け渡しの例です(これらは、gitモジュールとは異なりますが、必須ではあるが自由形式の引数があります)。

  -  name: "release tarballが生成されました" 
 local_action:
 module:シェル
 _raw_params:git archive --format Zip --output release.Zip HEAD [ chdir: "ファイル/クローン/ウェブフック" 
4
mvr

Ansible のドキュメント から:

委任これは実際にはローリングアップデート特有ではありませんが、そのような場合に頻繁に発生します。

あるホストで他のホストを参照してタスクを実行したい場合は、タスクに「delegate_to」キーワードを使用してください。これは、負荷分散プールにノードを配置したり、ノードを削除するのに理想的です。停止時間を制御するのにも非常に便利です。 debug、add_Host、includeなどのすべてのタスクを委任しても、常にコントローラ上で実行されるわけではないことに注意してください。これを「serial」キーワードと一緒に使用して、一度に実行するホストの数を制御することもお勧めです。

---

- hosts: webservers
  serial: 5

  tasks:

  - name: take out of load balancer pool
    command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

  - name: actual steps would go here
    yum:
      name: acme-web-stack
      state: latest

  - name: add back to load balancer pool
    command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

これらのコマンドは、Ansibleを実行しているマシンである127.0.0.1上で実行されます。タスクごとに使用できる省略形の構文、「local_action」もあります。これは上記と同じプレイブックですが、127.0.0.1に委譲するための簡略構文を使用しています。

---

# ...

  tasks:

  - name: take out of load balancer pool
    local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

  - name: add back to load balancer pool
    local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}

一般的なパターンは、ローカルアクションを使用して「rsync」を呼び出し、ファイルを管理対象サーバーに再帰的にコピーすることです。これが一例です。

---
# ...
  tasks:

  - name: recursively copy files from management server to target
    local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/

これを機能させるには、パスフレーズなしのSSHキーまたはSSHエージェントを設定する必要があります。そうしないと、rsyncでパスフレーズを要求する必要があります。

1
Android Control

あなたはこのように試すことができます

0
omi
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

デフォルトのモジュールはコマンドモジュールです。したがって、commandキーワードは必要ありません。

昇格された特権でコマンドを発行する必要がある場合は、同じコマンドの最後に-bを使用してください。

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b
0
Deepak kumar