ansible初级笔记:从在Mac上安装到rbenv,nfs的步骤
这是一个总结了以备忘录为目的发布的博客文章的概述。
ansible | okisanjp@记录有多重要
如果我是以摸索的方式来表达的,所以可能会有一些奇怪的地方。但如果你能提出批评之后,如果有需要修正的部分,我会进行验证,并进行修正。
安装〜简单介绍一下安装过程
使用本地的mac通过ansible查看CentOS6服务器的备忘录。
在Mac上安装Ansible。
$ brew install ansible
创建库存
默认情况下,会查找名为 hosts 的文件。可以通过 ansible.cfg 进行覆盖和修改。
[test]
192.168.xxx.xxx
如果想要从本地机器远程操作,也可以输入全球IP地址。
FQDN可进行注册。还可以使用指定如web[01-10]等以及正则表达式,但由于还没有完全理解,所以先放在后面。
尝试执行指令
在管理目标服务器上执行任意命令。
$ ansible test -i hosts -a 'date'
192.168.xxx.xxx | SUCCESS | rc=0 >>
2016年 4月 8日 金曜日 14:27:27 JST
我认为这是指定要在服务器上执行的模块的方式,使用-m来指定模块,使用-a来指定参数。默认情况下,服务器上的命令执行模块是-m。因此,我理解为只需指定要执行的一行命令(即希望执行的命令),即只需使用-a。到目前为止,我认为还需要更深入地理解这个模块。
$ ansible test -i hosts -a 'cat /etc/redhat-release'
192.168.xxx.xxx | SUCCESS | rc=0 >>
CentOS release 6.7 (Final)
制作Playbook
在目标服务器的命令行上
$ htop
-bash: htop: コマンドが見つかりません
因此,我将尝试编写一个Playbook,在尚未安装htop的服务器上安装htop。
yum-repos.yml 可以使用本地化的方式进行以下句子的释义:
Yum源配置文件.yml
首先,注册htop安装源的yum仓库(EPEL)。
- name: add repos 'EPEL'
yum: name=http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm state=present
监控工具配置文件.yml
---
- hosts: test
become: yes
tasks:
- name: Install htop
yum: name=htop state=installed
语法检查
$ ansible-playbook -i hosts yum-repos.yml --syntax-check
playbook: yum-repos.yml
检查任务的内容
$ ansible-playbook -i hosts yum-repos.yml --list-tasks
playbook: yum-repos.yml
play #1 (test): TAGS: []
tasks:
add repos 'EPEL' TAGS: []
实习运行
$ ansible-playbook -i hosts yum-repos.yml --check
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [192.168.xxx.xxx]
TASK [add repos 'EPEL'] ********************************************************
changed: [192.168.xxx.xxx]
PLAY RECAP *********************************************************************
192.168.xxx.xxx : ok=2 changed=1 unreachable=0 failed=0
由于此次情况涉及多个Playbook,需要对每个Playbook进行检查。文件名可以使用通配符同时检查多个。
执行Playbook
首先是仓库。
$ ansible-playbook -i hosts yum-repos.yml
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [192.168.xxx.xxx]
TASK [add repos 'EPEL'] ********************************************************
changed: [192.168.xxx.xxx]
PLAY RECAP *********************************************************************
192.168.xxx.xxx : ok=2 changed=1 unreachable=0 failed=0
接下来的工具是监控工具。
$ ansible-playbook -i hosts monitor-tools.yml
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [192.168.xxx.xxx]
TASK [Install htop] ***********************************************
changed: [192.168.xxx.xxx]
PLAY RECAP *********************************************************************
192.168.xxx.xxx : ok=2 changed=1 unreachable=0 failed=0
顺便提一下,-i hosts部分是指定清单(服务器列表)文件的文件名,可以选择使用默认的hosts文件创建,或者在ansible.cfg中指定任意的文件名,如果该文件存在的话,可以省略该部分。
确认
我会尝试登录到实际管理的服务器上,确认是否存在htop。
$ htop
如果安装正确,就是巨大的成功。
创建一个能使用sudo的用户并更新authorized_keys。
请以…为参考
-
- Ansibleでユーザを追加 – Qiita
- ansible でノーパスログイン(公開鍵認証)設定する – とあるSIerの憂鬱
- hosts: all
become: True
tasks:
- name: add a new user
user: name=hogeuser state=present
- name: add a sudo user
lineinfile: "dest=/etc/sudoers backup=yes state=present regexp='^hogeuser' line='hogeuser ALL=(ALL) NOPASSWD: ALL'"
- hosts: all
tasks:
- name: setup authorized_keys
authorized_key: user=hogeuser
key="{{ lookup('file', './id_rsa_hogeuser.pub') }}"
禁止使用root用户登录
使用notify和handler重新启动服务。
- hosts: all
become: True
tasks:
- name: stop root login via ssh
lineinfile:
dest: /etc/ssh/sshd_config
state: present
regexp: "^PermitRootLogin without-password"
line: "PermitRootLogin no"
backup: yes
backrefs: yes
validate: "sshd -T -f %s"
notify: restart sshd
handlers:
- name: restart sshd
service: name=sshd state=restarted
如果使用notify时填写的名称与设置的handler名称相同,它将在最后执行处理。
无论”notify”出现多少次,只会在最后执行一次。
-
- ansible.cfg是Ansible的配置文件,其存放位置有优先级。优先级顺序如下:
-
- 1. 环境变量ANSIBLE_CONFIG指定的路径
-
- 2. 当前目录下的ansible.cfg(./ansible.cfg)
-
- 3. 用户HOME目录下的.ansible.cfg(~/.ansible.cfg)
- 4. /etc/ansible/ansible.cfg
安装 rbenv 和 Ruby
建立一个app角色,并安装rbenv和ruby,以便能够使用。
主持人
[app]
app01 ansible_host=xxx.xxx.xxx.xxx
应用程序.yml
---
- hosts: app
roles:
- app
角色/应用/任务/main.yml
---
- name: 開発ツールをインストール
become: True
yum: name={{ item }} state=latest
with_items:
- git
- openssl-devel
- readline-devel
- "@Development tools"
- name: rbenvをインストール
git: repo=https://github.com/sstephenson/rbenv.git dest=~/.rbenv
- name: .bash_profileにパスを追加
lineinfile: >
dest="~/.bash_profile"
line="export PATH=$HOME/.rbenv/bin:$PATH"
- name: .bash_prifileにrbenv initを追加
lineinfile: >
dest="~/.bash_profile"
line='eval "$(rbenv init -)"'
- name: rbenv-buildのインストール
git: repo=https://github.com/sstephenson/ruby-build.git dest=~/.rbenv/plugins/ruby-build
- name: rubyのインストール
shell: bash -lc "CONFIGURE_OPTS="--disable-install-rdoc" rbenv install -s {{ ruby_version }}"
- name: globalで使用するバージョンを指定
shell: bash -lc "rbenv global {{ ruby_version }} && rbenv rehash"
角色/应用程序/默认/主要.yml
由于在tasks的main.yml中使用了变量,需要在这里进行定义。
---
ruby_version: 2.1.8
试一试
$ ansible-playbook app.yml
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [app01]
TASK [app : 開発ツールをインストール] ******************************************************
changed: [app01] => (item=[u'git', u'openssl-devel', u'readline-devel', u'@Development tools'])
TASK [app : Install htop] ******************************************************
ok: [app01]
TASK [app : rbenvをインストール] ******************************************************
ok: [app01]
TASK [app : .bash_profileにパスを追加] ***********************************************
ok: [app01]
TASK [app : .bash_prifileにrbenv initを追加] ***************************************
ok: [app01]
TASK [app : rbenv-buildのインストール] ************************************************
ok: [app01]
TASK [app : rubyのインストール] *******************************************************
changed: [app01]
TASK [app : globalで使用するバージョンを指定] ***********************************************
changed: [app01]
实施前的检查
文法检查
$ ansible-playbook app.yml --syntax-check
干跑
$ ansible-playbook app.yml -C
详细的进展情况
$ ansible-playbook app.yml -vvv
NFS客户端编辑
安装NFS相关的中间件,并将任意的NFS挂载。
CentOS 6.5。
角色/应用程序/默认/main.yml
---
file_mountpoint: /path_to_mountpoint
file_server: xxx.xxx.xxx.xxx
角色/应用/任务/main.yml
- name: NFSクライアントをインストール
become: True
yum: name={{ item }} state=latest
with_items:
- nfs-utils
- name: NFS関連:rpcbind
become: True
service: name=rpcbind state=started enabled=yes
- name: NFS関連:rpcidmapd
become: True
service: name=rpcidmapd state=started enabled=yes
- name: NFS関連:nfslock
become: True
service: name=nfslock state=started enabled=yes
- name: NFS関連:netfs
become: True
service: name=netfs state=started enabled=yes
- name: マウントポイントを作る
become: True
file: path={{ file_mountpoint }} state=directory owner=root group=root mode=0755
- name: fileサーバーをNFSマウントする
become: True
mount: name={{ file_mountpoint }} src={{ file_server }}:{{ file_mountpoint }} fstype=nfs state=mounted
我們在需要進行根操作的部分指定了 become: True,但根據環境和情況需要靈活適應。
- name: fileサーバーをNFSマウントする
become: True
mount: name={{ file_mountpoint }} src={{ file_server }}:{{ file_mountpoint }} fstype=nfs state=mounted
在这段描述中,进行了将挂载和添加到/etc/fstab一起的操作。
无论执行多少次,都不会导致fstab文件中出现重复的行。