Ansibleホスト上でコマンドを実行することは可能ですか?
私のシナリオは、内部でホストされている(そして企業のファイアウォールの外側からはアクセスできない)gitサーバーからチェックアウトしたいということです。次に、チェックアウト(tarballed)をプロダクションサーバー(外部でホストされている)にアップロードします。
現時点では、チェックアウトを実行し、それをtarballしてから展開スクリプトを実行するスクリプトを実行することを検討しています。
はい、Ansible Hostでコマンドを実行できます。プレイ内のすべてのタスクを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 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はすでに存在すると想定しています。
私はあなたがこれらを書くことができるもう少し読みやすい私見である他の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
AnsibleをShellを介してlocalhost上で実行できることを共有したいと思います。
ansible all -i "localhost," -c local -m Shell -a 'echo hello world'
これは簡単な作業やAnsibleの実践的な学習に役立ちます。
コードの例は、この記事から抜粋したものです。
あなたはあなたの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
@gordonによる答えを拡張して、これがShell/commandモジュールで読みやすい構文と引数の受け渡しの例です(これらは、gitモジュールとは異なりますが、必須ではあるが自由形式の引数があります)。
- name: "release tarballが生成されました" local_action: module:シェル _raw_params:git archive --format Zip --output release.Zip HEAD [ chdir: "ファイル/クローン/ウェブフック"
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でパスフレーズを要求する必要があります。
あなたはこのように試すことができます
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