Ansible超级入门手把手教学在Vagrant上

目标受众

    • 今回の記事は下記ような人を対象としています。

ansibleが何なのか、どういったものなのかをある程度理解をしている
誰かが構築したansibleを触ったことがある
自身では、まだansibleを構築したことない人

我自己也才開始接觸半年,實際上自己是從大概一個月前才開始進行環境構築等工作的,所以對於最佳實踐並不十分清楚,也可能會寫錯資訊,如果有任何問題,請指正。

开始实践

环境信息

種類バージョンOScentos6.7ansible2.3.1.0python2.6.6

CentOS环境建设

Ansible环境 configurations

    今回はvagrantを使用して、CentOS環境を構築します。
    1. 确认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の環境も作る
    1. 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安装

    1. 添加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

创建库存文件

    対象のサーバを記述するファイル
    1. 创建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

どんなことをするかモジュール使って記述する

    1. 定义变量

创建名为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

    1. 在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获得。对于本次循环,可以分别获取以下数值。

    1. 第一次循环中,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等模块将各种安装等操作转化为任务,通过一个命令即可完成所有操作,非常方便。请务必尝试其他模块并在本地环境下进行测试!


另外,我计划在不久的将来写一些更接近实际应用的内容,比如角色、标签,以及加密和解密之类的内容。

广告
将在 10 秒后关闭
bannerAds