目次
7. フェッチ モジュールはコピー モジュールに似ていますが、逆の効果があります。リモート マシンからローカル マシンにファイルをコピーするために使用されます。
I. 概要
Ansible は、構成管理、アプリケーションのデプロイメント、およびクラウド デプロイメントの調整に使用される自動化ツールです。これは、Python で書かれたオープンソース ツールで、SSH プロトコルを通じてリモート ホストと通信します。
1. 関連紹介および類似プラットフォーム:
- 関連紹介: Ansible は、シンプルで軽量な構文を使用するエージェントベースの自動化ツールです。その主な目標は、大規模なインフラストラクチャを管理するための強力な機能を提供しながら、自動化プロセスをシンプルで使いやすくすることです。
- 類似のプラットフォーム: Ansible に類似した自動化ツールには、Puppet、Chef、SaltStack などがあります。これらのツールはすべて同様の機能を提供しますが、構文、動作原理、展開モデルが若干異なります。
2. Ansible を使用する理由、何ができるか、そしてその利点:
- 使いやすさ: Ansible は YAML ベースの構文を使用するため、プログラミングの知識がなくても理解しやすく、簡単に作成できます。また、充実したドキュメントと活発なコミュニティサポートも備えています。
- エージェントレス: Ansible は、リモート ホストにエージェントをインストールすることなく SSH プロトコルを使用して通信するため、デプロイメントと構成がよりシンプルかつ安全になります。
- スクリプトベース: Ansible は、スクリプトベースのアプローチを使用して自動化されたタスクを記述および実行し、タスクの編成と管理をより柔軟かつスケーラブルにします。
- 高度な構成可能: Ansible はさまざまなプラットフォームとオペレーティング システムをサポートし、サーバー、ネットワーク デバイス、クラウド プラットフォームなどのさまざまな種類のリソースを管理するための豊富なモジュールとプラグインを提供します。
- 拡張性: Ansible は強力な拡張性を備えており、特定のニーズに応じてカスタム モジュールやプラグインを作成したり、既存のツールやシステムと統合したりできます。
3. 仕組み:
- Ansible は 1 つの制御ノードを使用して複数のリモート ホストを管理します。制御ノード上の Ansible 構成ファイルには、実行する必要があるタスクと関連するホスト情報が記述されています。
- コントロール ノードが Ansible コマンドを実行すると、SSH 経由でリモート ホストに接続し、リモート ホスト上で対応するタスクを実行します。
- Ansible は、モジュールベースのアプローチを使用してリモートホストを管理および構成します。ファイル管理、ソフトウェアパッケージのインストール、サービス管理など、組み込みモジュールを通じてさまざまな操作を実行できます。
- Ansible は、複数のタスクを定義および整理するための Playbook の使用や、より複雑な自動化プロセスを実装するための変数や条件の使用もサポートしています。
全体として、Ansible は強力で使いやすく、エージェントレスの自動化ツールであり、構成管理とアプリケーション展開のプロセスを簡素化し、作業効率と保守性を向上させるのに役立ちます。
コアコンポーネント:
• インベントリ: IP アドレス、SSH ポート、アカウント番号、パスワードなど、Ansible によって管理されるホスト情報 。
• モジュール: タスクはモジュールによって完了され、頻繁に使用されるスクリプトなどのモジュールをカスタマイズすることもできます。
• プラグイン:プラグインを使用して、Ansible のコア機能を強化します 。多くのプラグインが提供されており、自分で追加することもできます。
プラグインを定義します。たとえば、接続プラグインはターゲット ホストに接続するために使用されます。コールバックkプラグインは結果を他の場所に出力 できます。 vars プラグインは、定義された比率変数をAnsibleに挿入して 実行します。
• Playbook : 「スクリプト」。統合された外部呼び出しのための一連のタスクをモジュール形式で定義します。Ansible のコア機能。
Ansibleは、Python 2 (バージョン 2.6 または 2.7) または Python 3 (バージョン 3.5 以降) がインストールされているマシン上で実行できます (Windows は管理 マシン ではサポートされていません) 。
2. インストール
実験を開始する前に、まずクラスター時刻を同期し、ssh パスワードフリーを実行します。
##每台主机
ssh-keygen
ssh-copy-id 192.168.115.131
##在192.168.115.131
for i in 136 140 ;do scp /root/.ssh/authorized_keys 192.168.115.$i:/root/.ssh ;done
##同步集群时间
for i in 131 136 140 ;do ssh 192.168.115.$i yum -y install ntp;done
for i in 131 136 140 ;do ssh 192.168.115.$i systemctl restart ntpd;done
1. ソースを選択します
cd /etc/yum.repos.d
mkdir back
mv * bcak
yum clean all
yum makecache
yum update
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl-o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache frist
yum update
2. ansible をインストールする
yum -y install epel-release.noarch
yum -y install ansible
3. モジュールビュー
###模块列表
ansible-doc -l
###模块用法查看
ansible-doc 模块名
3. 実験
1. トポロジー
2. グループと ping モジュールをセットアップする
緑が成功、赤が失敗
方法1
vim /etc/ansible/hosts
###插入
[group]
192.168.115.131
192.168.115.136
192.168.115.140
###利用模块ping
ansible -m ping group
方法 2
#如果主机数量太多就这样表示
[group]
192.168.115.[136:140]
方法3
##指定端口
[group]
192.168.115.136:22
方法4
###别名
[group]
192.168.115.136:22
hy ansible_ssh_host=192.168.115.140 ansible_ssh_port=22
方法5
##没有ssh免密的也可以
[group]
ansible_ssh_host=192.168.115.140 ansible_ssh_port=22 ansible_ssh_user=用户名 ansible_ssh_pass="密码"
道6
###利用别名分组
[group]
192.168.115.136:22
hy ansible_ssh_host=192.168.115.136 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123.com"
nginx ansible_ssh_host=192.168.115.140 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123.com"
[nginx]
nginx
[hy]
hy
3. ホスト名モジュール
基本的な形式は次のとおりです: Ansible 操作のマシン名またはグループ名 -m モジュール名 -a "パラメーター 1= 値 1 パラメーター 2= 値 2" 引数
黄色は成功を示します
###修改192.168.115.136的主机名hy
###修改192.168.115.140的主机名nginx
ansible hy -m hostname -a 'name=hy'
ansible nginx -m hostname -a 'name=nginx'
4. ファイルモジュール
1. ディレクトリを作成する
##创建一个目录
ansible hy -m file -a "path=/opt/hy.txt state=directory"
2. ファイルを作成する
ansible hy -m file -a "path=/opt/hy.txt/test.tst state=touch"
3. 所有者グループと権限を変更する
####修改属主为hy,属组hy 权限777
ansible hy -m file -a "path=/opt/hy.txt recurse=yes owner=hy group=hy mode=777"
4. ディレクトリ(ディレクトリ内のファイルも含む)を削除します。
###删除/opt/hy.txt
ansible hy -m file -a "path=/opt/hy.txt state=absent"
5. ソフト接続とハード接続を作成する
#软
ansible hy -m file -a "src=/etc/fstab path=/opt/fstab2 state=link"
#硬
ansible hy -m file -a "src=/etc/fstab path=/opt/fstab1 state=hard"
5.統計モジュール
###用来获取文件的信息状态
ansible hy -m file -a "path=/opt/hy.txt state=touch"
ansible hy -m stat -a "path=/opt/hy.txt"
6. モジュールのコピー (ローカルからリモートにコピー)
ansible 上の 2 つのエージェントにコピーするファイルを準備する
echo 192.168.115.131 > 1.txt
ansible group -m copy -a "src=/root/1.txt dest=/opt"
コンテンツを使用してリモートでコンテンツを書き込み、元のコンテンツを上書きする
ansible group -m copy -a "content="hello\n" dest=/opt/1.txt"
Force パラメータを使用してカバレッジを強制するかどうか
##写入
echo 192.168.115.131 > 1.txt
ansible group -m copy -a "content="hello" dest=/opt/1.txt force=no"#如果目标文件存在,不覆盖
ansible group -m copy -a "content="hello" dest=/opt/1.txt force=yes"#如果目标文件存在,覆盖
バックアップ モジュールを使用して、ローカル ファイルをリモート エンドにバックアップします。
###把本机的文件备份到远端
ansible group -m copy -a "src=/root/1.txt dest=/opt/2.txt backup=yes owner=root group=root mode=644"
/ をコピーする場合としない場合の違い
ansible hy -m copy -a "src=/etc/yum.repos.d dest=/etc/yum.repos.d"
ansible nginx -m copy -a "src=/etc/yum.repos.d/ dest=/etc/yum.repos.d"
7. フェッチ モジュールはコピー モジュールに似ていますが、逆の効果があります。リモート マシンからローカル マシンにファイルをコピーするために使用されます。
注: フェッチ モジュールはディレクトリをリモートからローカルにコピーできません
##两台agent上创建同名、路径文件
echo 192.168.115.136 hy > test.txt
echo 192.168.115.140 nginx > test.txt
###ansible上操作
group -m fetch -a "src=/etc/yum.repos.d/test.txt dest=/etc/yum.repos.d"
8. ユーザーモジュール
ユーザー モジュールは、ユーザー アカウントとユーザー属性を管理するために使用されます。
##创建aaa用户,默认为普通用户,创建家目录
ansible hy -m user -a "name=aaa state=present"
###创建系统用户
ansible hy -m user -a'name=bbb state=present system=yes shell="/sbin/nologin"'
##创建ccc用户, 使用uid参数指定uid, 使用password参数传密码
echo 123.com |openssl passwd -stdin
ansible hy -m user -a 'name=ccc state=present uid=6666 password="密码"'
##创建一个普通用户叫ddd,并产生空密码 密钥对
ansible hy -m user -a 'name=ddd state=present generate_ssh_key=yes'
##删除aaa用户,但家目录默认没有删除
ansible hy -m user -a 'name=aaa state=absent'
##删除aaa用户、家目录
ansible hy -m user -a 'name=aaa state=absent remove=yes'
9. グループモジュール
グループ モジュールは、ユーザー グループとユーザー グループ属性を管理するために使用されます。
###创建组
ansible hy -m group -a 'name=web gid=2000 state=present'
##删除组(如果有用户的gid为此组,则删除不了)
ansible hy -m group -a 'name=web state=absent'
10. cronモジュール
cron モジュールは定期的な時間タスクを管理するために使用されます
##创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。
如果minute,hour,day,month,week不指定的话,默认都为*
ansible hy -m cron -a 'name="test1" user=root job="touch /etc/6666" minute=26'
删除cron任务
ansible hy -m cron -a 'name="test1" state=sbsent'
4.yum_repositoryモジュール
yum_repository モジュールは、yum リポジトリの設定に使用されます。
### yum_repository模块yum_repository模块用于配置yum仓库。
注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱到/mnt目录
ansible hy -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"
##删除/etc/yum.repos.d/local.repo配置文件
ansible hy -m yum_repository -a "name=local state=absent"
5.yumモジュール
yum モジュールは、yum コマンドを使用してソフトウェア パッケージをインストールおよびアンインストールするために使用されます。前提条件: グループ マシンの yum 設定が正常であること。ローカル ソースを使用する場合は、それらをマウントする必要があります。
##安装http
ansible group -m yum -a 'name=httpd state=present'
######使用网络源
##在ansible上安安装网络源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
##copy到其他主机
yum を使用して httpd、httpd-devel ソフトウェアをインストールします。state=latest は最新バージョンのインストールを意味します
ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest'
yum を使用して httpd、httpd-devel ソフトウェアをアンインストールする
ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent'
6. サーバーモジュール
### service模块(重点)service模块用于控制服务的启动,关闭,开机自启动等。
启动vsftpd服务,并设为开机自动启动
master# ansible group -m service -a 'name=vsftpd state=started enabled=on'
关闭vsftpd服务,并设为开机不自动启动
master# ansible group -m service -a 'name=vsftpd state=stoped enabled=false'
mariadb サービスをインストールし、起動時に自動的に開始するように設定します。
ansible group -m yum -a 'name=mariadb,mariadb-server state=present'
ansible group -m service -a 'name=mariadb state=started enabled=yes'
7. スクリプトモジュール
スクリプト モジュールは、リモート マシン上でローカルスクリプトを実行するために使用されます。
在master上准备一个脚本
master# vim /tmp/1.sh
#!/bin/bash
mkdir /tmp/haha
touch /tmp/haha/{1..10}
在group1的远程机器里都执行master上的/tmp/1.sh脚本(此脚本不用给执行权限)
master# ansible group1 -m script -a '/tmp/1.sh'
8. コマンドおよびシェルモジュール
どちらのモジュールも Linux コマンドを実行するために使用され、コマンドに精通したエンジニアにとっては非常に使いやすいものです。
シェル モジュールはコマンド モジュールに似ています (コマンド モジュールは $HOME、>、<、| などのシンボルを実行できませんが、シェルは実行できます)。
ansible -m コマンド グループ 1 -a "useradd user2" ansible -m コマンド グループ 1 -a "id user2" ansible -m コマンド グループ 1 -a "cat /etc/passwd |wc -l" --报错 ansible -m シェル グループ 1 - a "cat /etc/passwd |wc -l" --成功 ansible -m command group1 -a "cd $HOME;pwd" --报错 ansible -m shell group1 -a "cd $HOME;pwd" --成功
注:シェル モジュールは、vim や ll エイリアスなどのコマンドと 100% 互換性があるわけではありません。どのコマンドが許可されていないのかを覚えておくことはお勧めできませんが、本番環境のコマンドを最初にテスト環境でテストする習慣を身に付ける必要があります。
9. プレイブック
Playbook: 制御ノードを構成、デプロイ、管理するために Ansible によって使用される Playbook です。Ansible 操作のオーケストレーション。
使用される形式はyaml形式です (saltstack、elk、docker、docker-compose、kubernetes なども yaml 形式を使用します)
YMAL形式
-
.yaml または .yml で終わる
-
ファイルの最初の行は「---」で始まり、YMAL ファイルの始まりを示します (オプション)
-
# 記号で始まるコメント
-
リストのすべてのメンバーは同じインデント レベルで始まり、
"- "
(ダッシュとスペース)で始まります。 -
辞書は
键: 值
単純な形式で構成されます (コロンの後にはスペースが必要です)。 -
==注意: この種のファイルを書き込むときはタブ キーを使用せず、スペースを使用してください==
## playbook实例
先直接来看一个实例
**第1步: 创建一个存放playbook的目录(路径自定义)**
```powershell
master# mkdir /etc/ansible/playbook
```
**第2步: 准备httpd配置文件,并修改成你想要的配置**
```powershell
master# yum install httpd -y
按需要修改你想要的配置(为了测试可以随意改动标记一下)
master# vim /etc/httpd/conf/httpd.conf
```
**第3步: 写一个playbook文件(后缀为.yml或.yaml)**
```powershell
# vim /etc/ansible/playbook/example.yaml
---
- hosts: group1
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd,httpd-devel state=latest
- name: write the apache config file
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
```
第4步: 执行写好的palybook
- 会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识
- 执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)
```powershell
# ansible-playbook /etc/ansible/playbook/example.yaml
```
## Playbook常见语法
**hosts:** 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.
**remote_user:** 用于指定远程主机上的执行任务的用户.
```powershell
- hosts: group1
remote_user: root
```
**tasks:** 任务列表, 按顺序执行任务.
- 如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.
```powershell
tasks:
- name: ensure apache is at the latest version
yum: name=httpd,httpd-devel state=latest
- name: write the apache config file
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
```
**handlers:** 类似task,但需要使用notify通知调用。
- 不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.
- handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.
```powershell
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
```
**练习:** 修改httpd的端口为8080,再执行playbook测试
**variables:** 变量
- 定义变量可以被多次方便调用
```powershell
master# vim /etc/ansible/playbook/example2.yaml
---
- hosts: group1
remote_user: root
vars:
- user: test1
tasks:
- name: create user
user: name={
{user}} state=present
~
```
```powershell
master# ansible-playbook /etc/ansible/playbook/example2.yaml
```
### 案例: playbook编排vsftpd
写一个playbook实现
1. 配置yum
2. 安装vsftpd包
3. 修改配置文件(要求拒绝匿名用户登录)
4. 启动服务并实现vsftpd服务开机自动启动
```powershell
---
- hosts: group1
remote_user: root
tasks:
- name: rm yum repository
file: path=/etc/yum.repos.d/ state=absent
- name: 同步master上的yum源到group1
copy: src=/etc/yum.repos.d dest=/etc/
- name: ensure vsftpd is at the latest version
yum: name=vsftpd state=latest
- name: write the apache config file
copy: src=/etc/vsftpd/vsftpd.conf dest=/etc/vsftpd/vsftpd.conf
notify:
- restart vsftpd
- name: ensure vsftpd is running (and enable it at boot)
service: name=vsftpd state=started enabled=yes
handlers:
- name: restart vsftpd
service: name=vsftpd state=restarted
```
## **playbook编排多个hosts任务**
~~~powershell
--- # ---代表开始(可选项,不写也可以)
- hosts: 10.1.1.12
remote_user: root
tasks:
- name: 创建/test1/目录
file: path=/test1/ state=directory
# 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用---来分隔段落的)
- hosts: 10.1.1.13
remote_user: root
tasks:
- name: 创建/test2/目录
file: path=/test2/ state=directory
... # ...代表结束(可选项,不写也可以)
~~~
### 案例: 编排nfs搭建与客户端挂载
1, 在master上准备nfs配置文件
~~~powershell
# vim /etc/exports
/share *(ro)
~~~
2, 编写yaml编排文件
~~~powershell
# vim /etc/ansible/playbook/nfs.yml
---
- hosts: 10.1.1.12
remote_user: root
tasks:
- name: 安装nfs服务相关软件包
yum: name=nfs-utils,rpcbind,setup state=latest
- name: 创建共享目录
file: path=/share/ state=directory
- name: 同步nfs配置文件
copy: src=/etc/exports dest=/etc/exports
notify: restart nfs
- name: 启动rpcbind服务,并设置为开机自启动
service: name=rpcbind state=started enabled=on
- name: 启动nfs服务,并设置为开机自启动
service: name=nfs state=started enabled=on
handlers:
- name: restart nfs
service: name=nfs state=restarted
- hosts: 10.1.1.13
remote_user: root
tasks:
- name: 安装nfs客户端软件包
yum: name=nfs-utils state=latest
- name: 挂载nfs服务器的共享
shell: mount 10.1.1.12:/share /mnt
~~~
3, 执行playbook
~~~powershell
# ansible-playbook /etc/ansible/playbook/nfs.yaml
~~~