回答:
はい、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はすでにそこにあると想定しています。
ansible-playbook -K playbook.yml
where -K for root
私はあなたがこれらを書くことができる他のいくつかの方法を見つけました。これは少し読みやすい私見です。
- 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
shell
モジュールにも当てはまります。
Ansibleをシェル経由でlocalhostで実行できることを共有したいと思います。
ansible all -i "localhost," -c local -m shell -a 'echo hello world'
これは、単純なタスクや、Ansibleの実践的な学習に役立ちます。
コードの例は、次の優れた記事から引用されています。
を使用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
become
タスクがTrueの場合、sudoなどについて文句を言うでしょう。これは、タスクで直接発生するか、他の場所に継承されます。
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はパスフレーズを要求する必要があります。
あなたはこの方法を試すことができます
sudo: no
委任のシナリオでも必要でした