Ansible超级入门手把手教学在Vagrant上
目标受众
-
- 今回の記事は下記ような人を対象としています。
ansibleが何なのか、どういったものなのかをある程度理解をしている
誰かが構築したansibleを触ったことがある
自身では、まだansibleを構築したことない人
我自己也才開始接觸半年,實際上自己是從大概一個月前才開始進行環境構築等工作的,所以對於最佳實踐並不十分清楚,也可能會寫錯資訊,如果有任何問題,請指正。
开始实践
环境信息
CentOS环境建设
Ansible环境 configurations
- 今回はvagrantを使用して、CentOS環境を構築します。
-
- 确认Vagrant box
$ vagrant box list
如果执行上述命令后没有Centos6.5的vagrant box,则跳到步骤2。如果已经存在Centos6.7的vagrant box,则跳过步骤2。
添加Centos6.7的vagrant box
$ vagrant box add centos6.7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
注意:在使用vagrant box add命令后,紧跟着可以自行命名的box名称。
Vagrant初始化
$ vagrant init centos6.7
修改Vagrantfile
执行vagrant init后,会在当前目录生成Vagrantfile文件,请按照以下内容进行修改。
Vagrantfile
# 创建一个私有网络,允许主机直接访问该机器
# 使用指定的IP。
– # config.vm.network “private_network”, ip: “192.168.33.10”
+ config.vm.network “private_network”, ip: “192.168.33.10”
启动Vagrant并登录
$ vagrant up
$ vagrant ssh
执行目标 – 自动化工具
- 実際の運用に近づけるために、今回はAnsibleの実行対象用のvagrantの環境も作る
-
- Vagrant的初始化
$ vagrant init centos6.7
修正Vagrantfile
当执行vagrant init时,会在当前目录生成Vagrantfile,所以需要按照以下方式进行修正
Vagrantfile
# 创建一个私有网络,允许通过特定IP进行主机访问
– # config.vm.network “private_network”, ip: “192.168.33.10”
+ config.vm.network “private_network”, ip: “192.168.33.11”
启动Vagrant并登录
$ vagrant up
$ vagrant ssh
Ansible安装
-
- 添加EPEL存储库
$ sudo -y yum install epel-release
安装Ansible
$ sudo yum -y install ansible
在要运行Ansible的vagrant环境中注册Ansible公钥
为了能够以SSH无密码登录到目标vagrant环境中,需要从Ansible服务器发送公钥
目标服务器的IP是192.168.33.11
$ ssh-keygen -t rsa
$ ssh-copy-id vagrant@192.168.33.11
连接确认
如果能够执行下面的命令并且无需输入密码即可登录,则表示连接成功
$ ssh vagrant@192.168.33.11
创建库存文件
- 対象のサーバを記述するファイル
-
- 创建ansible根目录和inventory目录
$ mkdir ansible; cd $_
$ mkdir inventory; cd $_
将目标服务器的IP地址写入hosts文件
在inventory目录下创建hosts文件,并将目标服务器的IP写入其中
※本次使用的IP地址为192.168.33.11
ansible/inventory/hosts
[target]
192.168.33.11
上述[target]将192.168.33.11主机归属于名为target的组。
连接测试
进入ansible的根目录,执行ansible命令
$ cd ~/ansible
$ ansible all -i hosts -m ping
192.168.33.11 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
通过-i {inventory文件名}指定inventory文件
当指定all时,所有在-i指定的hosts文件中的主机都将作为目标
通过-m {模块名}指定模块
创建Playbook
-
- 大きく分けて、playbookには3つの事を定義する
target
どこに・誰が実行するか
vars
変数を指定する(taskで使用する)
※実際はplaybookではなく変数用のディレクトリ・ファイルを作成して、共通化することがほとんど(所感)
task
どんなことをするかモジュール使って記述する
-
- 定义变量
创建名为group_vars/targets.yml的文件
$ mkdir group_vars ; cd $_
$ vi targets.yml
写入以下内容
ansible/group_vars/targets.yml
message: “你好Ansible!”
tokyo:
edogawa:
population: 68,2400
katsushika:
population: 44,4400
※内容没有特定意义
定义playbook
使用debug模块在目标服务器上输出存储在msg中的字符串任务
ansible/test.yml
– hosts: target
user: vagrant
tasks:
– name: 输出信息。
debug: msg=”{{ message }}”
– name: 输出市中心的人口
debug: msg=”我出生在{{ item.key }},人口有{{ item.value.population }}人”
with_dict: “{{ tokyo }}”
执行Playbook
-
- 在ansible的根目录中执行ansible-playbook -i inventory/hosts test.yml
-i {inventory文件名}指定目标主机
test.yml指定要执行的playbook。
在playbook中指定了名为target的组作为目标主机,因此变量也会自动加载target.yml文件。*在Ansible中,信息是从特定目录等隐式获取的,因此需要理解依赖关系。
$ cd ~/ansible
$ ansible-playbook -i inventory/hosts test.yml
PLAY [target] ***********************************************************************************************************************************************************************
TASK [获取信息] ************************************************************************************************************************************************************** ********
ok: [192.168.33.11]
TASK [输出消息。] *************************************************************************************************************************************************************** ****
ok: [192.168.33.11] => {
“msg”: “Hello Ansible !”
}
TASK [输出市中心人口] ********************************************************************************************************************************************************* ******
ok: [192.168.33.11] => (item={‘key’: u’edogawa’, ‘value’: {u’population’: 68,2400}}) => {
“item”: {
“key”: “edogawa”,
“value”: {
“population”: 68,2400
}
},
“msg”: “我出生在江户川,人口为682400人”
}
ok: [192.168.33.11] => (item={‘key’: u’katsushika’, ‘value’: {u’population’: 44,4400}}) => {
“item”: {
“key”: “katsushika”,
“value”: {
“population”: 44,4400
}
},
“msg”: “我出生在葛飾区,人口为444400人”
}
PLAY RECAP **************************************************************************************************************************************************************************
192.168.33.11 : ok=3 改变=0 无法访问=0 失败=0
稍微解释一下
在输出消息的任务中,使用debug模块仅仅输出了变量message。但是,在使用tokyo字典形式的写法时,这个任务将使用with_dict来循环并取出tokyo变量的值,并且在每次循环中使用debug模块输出消息。循环中取出的元素将存储在预定义变量item中,并可在处理过程中使用。
↓元素以这样的方式存储
(
item={
'key': u'edogawa',
'value': {
u'population': 68,2400
}
}
)
在这种情况下,可以通过item.key获得位于东京下方的城市名称,而城市名称下的人口数可以通过item.value.population获得。对于本次循环,可以分别获取以下数值。
-
- 第一次循环中,item.key 等于 “江户川”,item.value.population 等于 682,400。
第二次循环中,item.key 等于 “葛饰”,item.value.population 等于 444,400。
结束
- 超初歩的なハンズオンだが、少なくても変数を使わなければ2ファイルで実装できてしまう…..!!
.
├── group_vars
│ └── target.yml
├── inventory
│ └── hosts
└── test.yml
这次虽然只是一个在目标服务器上输出字符串的任务,但实际上可以利用yum、shell等模块将各种安装等操作转化为任务,通过一个命令即可完成所有操作,非常方便。请务必尝试其他模块并在本地环境下进行测试!
另外,我计划在不久的将来写一些更接近实际应用的内容,比如角色、标签,以及加密和解密之类的内容。