Ansibleホストでコマンドを実行する


247

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

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

現時点では、チェックアウトを実行し、それをtarballし、展開スクリプトを実行するスクリプトを実行しているところですが、これをAnsibleに統合できれば望ましいと思います。

回答:


347

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

あなたはAnsibleホスト上の全体のプレーを実行したい場合は、指定hosts: 127.0.0.1及びconnection: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ホストで単一のタスクを実行するだけの場合は、を使用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はすでにそこにあると想定しています。


8
sudo: no委任のシナリオでも必要でした
Danimal

rootユーザーとしてローカル接続を実行する方法?
ビラルUsean 2017

@BilalUsean ansible-playbook -K playbook.ymlwhere -K for root
Kush

74

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

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

または

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

3
興味深いことに、それはコマンドでどのように機能しますか?私の知る限りでは、実行されるコマンドを定義するためにparam free_formを使用できないからです
Ander

@Ander同じことがshellモジュールにも当てはまります。
2017年

6
コマンド/シェルで使用する場合、必要なのは「_raw_params」です
mvr

41

Ansibleをシェル経由でlocalhostで実行できることを共有したいと思います。

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

これは、単純なタスクや、Ansibleの実践的な学習に役立ちます。

コードの例は、次の優れた記事から引用されています。

localhostでansibleプレイブックを実行する


2
localhostの後のコンマ(、)の意味は何ですか。コマンドが機能することが重要であることに気づきました
Tuomas Toivonen

2
末尾のコンマは、ファイルを指す単純なインベントリを定義するためのものです。文書化されていないハックのようなもので、消えてしまう可能性があります(iirc)。
senorsmile 2017年

19

を使用delegate_toして、Ansibleプレイを実行しているところから、Ansibleホスト(管理ホスト)でコマンドを実行できます。例えば:

ファイルがAnsibleホストに既に存在する場合は削除します。

 - 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ホストに新しいファイルを作成します。

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

1
これはこれまでの答えの中で最もクリーンなソリューションのようです。

1
同意します。最小限の新しい構文で、最も柔軟性があります(他の場所にも委任します)。注意すべき1つの項目- becomeタスクがTrueの場合、sudoなどについて文句を言うでしょう。これは、タスクで直接発生するか、他の場所に継承されます。
JLペイレ

4

@gordonによる回答を拡張して、シェル/コマンドモジュールを使用して読み取り可能な構文と引数を渡す例を次に示します(@anderで示されているように、必須だが自由形式の引数があるという点でgitモジュールとは異なります)。

-名前:「リリースtarballが生成されます」
  local_action:
    モジュール:シェル
    _raw_params:git archive --format zip --output release.zip HEAD
    chdir: "ファイル/クローン/ウェブフック"

2

Ansibleのドキュメントから:

委任これは実際にはローリング更新に固有のものではありませんが、そのような場合に頻繁に発生します。

他のホストを参照して1つのホストでタスクを実行する場合は、タスクで「delegate_to」キーワードを使用します。これは、負荷分散されたプールにノードを配置したり、それらを削除するのに理想的です。また、停止ウィンドウの制御にも非常に役立ちます。すべてのタスクを委任しても意味がないことに注意してください。デバッグ、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-agentが構成されている必要があることに注意してください。そうでない場合、rsyncはパスフレーズを要求する必要があります。


0
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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.