収集されたファクトを条件付きタスクで使用する
収集されたファクトの最も強力な使用方法の 1 つは、プレイブックで条件付きロジックを実装することです。このステップでは、実行するタスクを決定するためにファクトを使用するプレイブックを作成します。
Ansible での条件付きタスクの理解
Ansible では、when キーワードを使用して、変数、ファクト、またはタスクの結果に基づいてタスクを条件付きで実行できます。これにより、より動的で適応性の高いプレイブックを作成できます。
条件付きタスクを使用したプレイブックの作成
オペレーティングシステムに基づいて異なるアクションを実行するプレイブックを作成しましょう。
- WebIDE で、
/home/labex/project/ansible ディレクトリに移動します。
conditional_facts_playbook.yml という名前の新しいファイルを作成します。
- 次の内容を追加します。
---
- name: Conditional Tasks Based on Facts
hosts: local
gather_facts: true
tasks:
- name: Display OS information
debug:
msg: "Running on {{ ansible_distribution }} {{ ansible_distribution_version }}"
- name: Task for Ubuntu systems
debug:
msg: "This is an Ubuntu system. Would run apt commands here."
when: ansible_distribution == "Ubuntu"
- name: Task for CentOS systems
debug:
msg: "This is a CentOS system. Would run yum commands here."
when: ansible_distribution == "CentOS"
- name: Task for systems with at least 2GB RAM
debug:
msg: "This system has {{ ansible_memtotal_mb }} MB RAM, which is sufficient for our application."
when: ansible_memtotal_mb >= 2048
- name: Task for systems with less than 2GB RAM
debug:
msg: "This system has only {{ ansible_memtotal_mb }} MB RAM, which may not be sufficient."
when: ansible_memtotal_mb < 2048
このプレイブックは次のとおりです。
- システムに関するすべてのファクトを収集します。
- オペレーティングシステム情報を表示します。
- オペレーティングシステムのタイプに基づいてタスクを条件付きで実行します。
- RAM の量に基づいてタスクを条件付きで実行します。
条件付きプレイブックの実行
プレイブックを実行して、条件付きタスクを実際に見てみましょう。
cd ~/project/ansible
ansible-playbook -i hosts conditional_facts_playbook.yml
Ubuntu で実行しているため、次のような出力が表示されるはずです。
PLAY [Conditional Tasks Based on Facts] **************************************
TASK [Gathering Facts] *******************************************************
ok: [localhost]
TASK [Display OS information] ************************************************
ok: [localhost] => {
"msg": "Running on Ubuntu 22.04"
}
TASK [Task for Ubuntu systems] ***********************************************
ok: [localhost] => {
"msg": "This is an Ubuntu system. Would run apt commands here."
}
TASK [Task for CentOS systems] ***********************************************
skipping: [localhost]
TASK [Task for systems with at least 2GB RAM] ********************************
ok: [localhost] => {
"msg": "This system has 3907 MB RAM, which is sufficient for our application."
}
TASK [Task for systems with less than 2GB RAM] *******************************
skipping: [localhost]
PLAY RECAP *******************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
条件に基づいて、一部のタスクが実行され、他のタスクがスキップされることに注目してください。CentOS タスクは、Ubuntu で実行しているためスキップされ、「2GB RAM 未満」タスクは、システムに 2GB RAM 以上があるためスキップされます。
より実用的な例の作成
次に、実際の環境で使用できる、より実用的な例を作成しましょう。
- WebIDE で、
practical_conditional_playbook.yml という名前の新しいファイルを作成します。
- 次の内容を追加します。
---
- name: Practical Conditional Playbook
hosts: local
gather_facts: true
vars:
app_dir: "/home/labex/project/app"
tasks:
- name: Create application directory
file:
path: "{{ app_dir }}"
state: directory
mode: "0755"
- name: Configure for production environment
copy:
dest: "{{ app_dir }}/config.yml"
content: |
environment: production
memory_limit: high
debug: false
when: ansible_memtotal_mb >= 4096
- name: Configure for development environment
copy:
dest: "{{ app_dir }}/config.yml"
content: |
environment: development
memory_limit: low
debug: true
when: ansible_memtotal_mb < 4096
- name: Display configuration
command: cat {{ app_dir }}/config.yml
register: config_content
- name: Show configuration
debug:
msg: "{{ config_content.stdout_lines }}"
このプレイブックは次のとおりです。
- アプリケーションのディレクトリを作成します。
- 利用可能なシステムメモリに基づいて、異なる構成ファイルを書き込みます。
- 結果の構成を表示します。
実用的なプレイブックを実行します。
ansible-playbook -i hosts practical_conditional_playbook.yml
この例は、収集されたファクトを使用して、システム特性に基づいて構成を自動的に適応させる方法を示しています。