ansibleハンドブック条件決意サイクルと階層管理役割のタイトルIII
1. ansible脚本、ループ構文の分析:
達成するために、構文を決定する際にリサイクルwith_items、以下の具体例のために、使用されてもよいAnsibleハンドブック。
---
vim httpd_v4.yaml
- hosts: websrvs
remote_user: '{{uservar}}'
vars: #定义变量,变量的值为列表
software:
- python-setuptools
- httpd
- mariadb
tasks:
- name: run this command ans ignore the result
shell: hostname
ignore_errors: True #忽略错误,可以继续执行
register: result #将上面shell的结果赋值给result变量
- debug: msg='{{result.stdout}}'
- name: install mysql and httpd
yum: name={{ software }} state=installed #通过调用循环的变量内容来实现批量安装软件
become: yes
with_items: #循环调用software里面的变量
- '{{software}}'
tags: init
- name: guarantee httpd2 is running
service: name=httpd state=started
become: yes
- name: transfer httpd configfile to remote
template: src=./httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用模板,传送jinja2文件,也可以用copy模块传送普通文件
notify:
- restart httpd
when: result.stdout == 'rainbondnode01' #通过判断主机名是'rainbondnode01才执行拷贝模板文件
handlers: #触发器
- name: restart httpd
service: name=httpd state=restarted
become: yes
この例では、我々はいくつかの技術的なポイントを使用します。
- とき、条件付き構文は次のとおりです。
- with_itemsは、円形のリストです。
- それは、変数に割り当てられたタスクの実行の結果を登録すると述べました。
- sudoのを意味しているになります。
- コマンド段変速を実行する際に-e USERVAR = gytest --check httpd_v4.yaml、-eを示し、このハンドブックansible-ハンドブックを実行するために使用されてもよいです。
2.ロール階層管理のansible脚本:
1.どのような役割は、現場で使用されるのでしょうか?
我々は今3ホストを管理している場合は、最初は、第二は、設定するのhttpd PHPサーバー、および第三として設定するには、MySQLサーバを設定することにします。どのように我々は脚本を定義していますか?
最初は、第二のプレイは、PHPを構築するために使用される第二のホスト、MySQLを構築するために使用される第3のホスト上の第三の遊びを使用して、httpdのを構築するための第1のホストコンピュータ上でプレイを使用しています。脚本における遊びの定義は、将来のコールをブロックに助長されていません、あまりにも面倒で繰り返し転送に助長されていません。例えば、後でミックスにホスト、ホストは、第四のhttpdサーバの両方が、また、PHPサーバーを追加し、我々は、インストールのhttpdとphpの上に書かれた第四の遊びを、書くことができます。このように繰り返しコードを脚本。
コードの重複を避けるために、役割はコードの重複が呼び出され達成することができます。websrvsと呼ばれる役割、phpappsrvsと呼ばれる二役、三役と呼ばれるdbsrvsを定義します。だから、次のように呼び出すことを呼び出すとき:
hosts: host1
role:
- websrvs
hosts: host2
role:
- phpappsrvs
hosts: host3
role:
- dbsrvs
hosts: host4
role:
- websrvs
- phpappsrvs
このようなコードを再利用することができ、それぞれの役割が独立して呼び出しを繰り返すことができます。次の例では、使用方法を示しています。
2.ランプ+ワードプレスフォーラムをインストールするには、役割を使用します。
役割は、特定のディレクトリ構造を必要とし、以下のように、ディレクトリ構造私の実験ランプは次のようになります。
[root@rainbondmanager gytest]# tree
.
├── group_vars
│ └── websrvs
├── hosts
├── roles
│ ├── mysql
│ │ ├── files
│ │ │ └── mysql_init.sh
│ │ ├── handlers
│ │ │ └── main.yaml
│ │ ├── tasks
│ │ │ ├── configure.yml
│ │ │ └── main.yaml
│ │ ├── templates
│ │ │ └── my.cnf
│ │ └── vars
│ │ └── main.yaml
│ ├── php
│ │ ├── files
│ │ ├── handlers
│ │ ├── meta
│ │ ├── tasks
│ │ │ └── main.yaml
│ │ ├── templates
│ │ └── vars
│ │ └── main.yaml
│ └── webserver
│ ├── files
│ │ └── wordpress.tar.gz
│ ├── handlers
│ │ └── main.yaml
│ ├── meta
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ └── templates
│ └── httpd.conf.j2
└── site.yaml
Site.yml初段少なくとも1つのファイル、ファイルエントリがハンドブックを行う有し、ロールは、少なくとも1つのディレクトリを持っています。役割ディレクトリが分類を作成したディレクトリで、例えば、私はhttpdのPHPのmysqlの3つのソフトウェアをインストールする必要があり、その後、3つのディレクトリを分け、各ディレクトリのサブディレクトリが固定され、一般的にファイル、ハンドラ、タスクに分割することができ、テンプレートは、varsは、メタ。ファイルディレクトリはテンプレートは、テンプレートファイルは、タスクはタスクファイルで、ハンドラがトリガYAML文書を設定されている、ファイルは一般的にファイルコピーモジュールのローカルパスによって呼び出される入れ、一般的な店舗フォーマット.j2ファイル、 VARSは、変数定義ファイル、メタ依存の定義ファイルです。
次に、私はにすべての設定ファイルの内容を一覧表示し、簡単な説明を行います。
[root@rainbondmanager gytest]# cat site.yaml
---
- hosts: websrvs
remote_user: root
roles:
- webserver
- hosts: 10.83.32.130
remote_user: root
roles:
- php
サイトには、エントリー文書で、ユーザー、オブジェクトを呼び出す役割によって実行されるホスト、リモート実行が言いました。10.83.32.130このホストアプリケーションインストールPHP、この構成では、ホストグループは、上記のアプリケーションインストールのhttpdをwebsrvs表します。
[root@rainbondmanager gytest]# cat hosts
[websrvs]
10.83.32.130
10.83.32.131
私のホームディレクトリでもよう、また、変数を定義することができhostsファイルに設定されたホストのこの別のリストの使用を指定する方法をホスト-i ansible-脚本を使用し、hostsファイルを定義します
[websrvs]
10.83.32.130 http_port=80
10.83.32.131 http_port=8080
秘密鍵を持つ方法がない場合、ユーザーは、などのホストが内部のファイルを、ポートのssh、SSHパスワードでSSHを指定することができます
[websrvs]
10.83.32.130 ansible_ssh_user=gytest ansible_ssh_pass=123456
10.83.32.131 ansible_ssh_user=gytest ansible_ssh_pass=123456
ホームディレクトリは、グループ全体のために有効になり、変数の値は、あなたがグループをホストする必要があるファイル名がホストグループに適用されるという名前のファイルにグループの名前を持つ変数の設定ディレクトリがあり、
[root@rainbondmanager gytest]# cat group_vars/websrvs
http_port: 8080
[root@rainbondmanager gytest]#
のは、インストールされたコンテンツのhttpdサーバーの役割を分析してみましょう
# 第一个是tasks文件内容,里面的copy文件路径直接写相对路径,就是表明file下面的内容,template模板文件也是同理,使用相对路径
[root@rainbondmanager gytest]# cat roles/webserver/tasks/main.yaml
---
- name: installed httpd
yum: name=httpd state=present
tags: install
- name: keep httpd is running
service: name=httpd state=started enabled=true
tags: install
- name: insert iptables rules
shell: iptables -I INPUT -p tcp --dport {{http_port}} -j ACCEPT
- name: transfer index html
copy: src=wordpress.tar.gz dest=/var/www/html/wordpress.tar.gz
tags: install
- name: unzip wordpress
unarchive: src=/var/www/html/wordpress.tar.gz dest=/var/www/html/ copy=no
ignore_errors: True
tags: install
- name: mv wordpress
shell: mv /var/www/html/wordpress/* /var/www/html/
- name: wait for httpd to start
wait_for: port=8080
tags: install
- name: transfer httpd configure file
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags: conf
notify:
- restart httpd
cat roles/webserver/handlers/main.yaml
- name: restart httpd
service: name=httpd state=restarted
# tasks任务里面调用的notify通知,默认就是handlers目录下面的文件内容;
cat roles/webserver/templates/httpd.conf.j2 |grep "{{"
Listen {{http_port}}
ServerAdmin {{ansible_fqdn}}
# 模板文件里面调用了facts变量和自定义变量
cat roles/webserver/meta/main.yaml
dependencies:
- {role: mysql, echo_wars: hello_mysql}
# meta目录下面定义了依赖关系,也就是安装httpd的时候,先要确定mysql运行
ls roles/webserver/files/wordpress.tar.gz
roles/webserver/files/wordpress.tar.gz
# file目录是wordpress的源码包,通过copy模块拷贝到远程主机,并通过解压模块解压
その後、我々は、インストールされたファイルのMySQLデータベースサーバーの役割の内容を見てみましょう。
[root@rainbondmanager gytest]# cat roles/mysql/tasks/main.yaml
---
- name: install mariadb databases
yum: name={{software}} state=present
with_items:
- '{{software}}'
tags: install
- name: keep mariadb is running
service: name=mariadb state=started enabled=true
tags: install
- name: insert iptables rules
shell: iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
- name: echo_vars
shell: echo '{{echo_vars}}'
register: result
tags: install
- name: excute mysql init scrpts
script: /data/playbooks/gytest/roles/mysql/files/mysql_init.sh
- include: configure.yml
# tasks定义了安装mariadb服务器,启动服务,设置防火墙,执行数据库初始脚本等;
[root@rainbondmanager gytest]# cat roles/mysql/tasks/configure.yml
---
- name: transfer mysql configure file
template: src=my.cnf dest=/etc/my.cnf
notify:
- restart mysql
tags: configure
[root@rainbondmanager gytest]#
# main.yml包含了这个configure.yml,拷贝mysql配置文件到目标机器
[root@rainbondmanager gytest]# cat roles/mysql/handlers/main.yaml
---
- name: restart mysql
service: name=mysql state=restarted
[root@rainbondmanager gytest]#
# 触发器的配置,配置文件更改之后重启mysql
[root@rainbondmanager gytest]# cat roles/mysql/vars/main.yaml
---
software:
- mariadb
- mariadb-server
echo_vars:
- hello_mysql
mysql_port:
- '3306'
[root@rainbondmanager gytest]#
# 变量文件定义,定义了安装mysql的软件包和其他变量
[root@rainbondmanager gytest]# cat roles/mysql/files/mysql_init.sh
#!/bin/bash
#
mysql -uroot -pwordpress2018 -e "update mysql.user set password=password('wordpress2019') where user='root' and host='localhost';"
mysql -uroot -pwordpress2018 -e "grant all privileges ON *.* TO root@'%';"
mysql -uroot -pwordpress2019 -e "flush privileges;"
mysql -uroot -pwordpress2019-e "create database wordpress"
[root@rainbondmanager gytest]#
# mysql初始化脚本,更改root密码,创建wordpress数据库,并给root账户赋权;
[root@rainbondmanager gytest]# cat roles/mysql/templates/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
# mysql的配置文件内容
最後に、私たちは一緒にPHPのインストールを見て
cat roles/php/tasks/main.yaml
---
- name: installed php-fpm
yum: name={{ software }} state=present
tags: install
# 定义安装php的任务
[root@rainbondmanager gytest]# cat roles/php/vars/main.yaml
---
software:
- php
- php-mysql
- php-gd
- php-imap
- php-ldap
- php-odbc
- php-pear
- php-xml
- php-xmlrpc
# 定义安装php的软件包
ansible脚本のより多くの例が、githubのアドレスを参照することができ、ここで書くために、ここでansibleシリーズの話題を書くために今日のブログ記事https://github.com/ansible/ansible-examples