Ansible自動展開の詳細なチュートリアル

A、Ansible自動化されたクラスタの展開K8S

はじめに1.1 Ansible

Ansibleは、IT自動化ツールです。これは、システム、ソフトウェア、およびこのような連続展開、ロールオーバーなど、より高度なIT業務の展開を座標を設定することができます。小規模から例の企業のITインフラ、ビジネス環境の管理に適用Ansible何千人も少数のホストを持っています。Ansibleは完全にアプリケーションインフラストラクチャITを説明し、簡単な自動化言語です。

以下の3つの機能を持っています:

  • シンプル:学習のコストを削減

  • パワフル:アプリケーションのライフサイクルの調整

  • エージェントレス:、予測可能で信頼性と安全性

使用文書:https://docs.ansible.com/

インストールAnsible:

yum install ansible -y

  • 在庫:Ansibleホスト情報管理、IPアドレス等、SSHポート、口座番号、パスワードなど、

  • モジュール:モジュールのタスクが完了している、あなたはまた、例えば、頻繁に使用するスクリプトをモジュールをカスタマイズすることができます。

  • プラグイン:プラグインの使用はAnsibleコア機能自体は、多くのプラグインを提供して追加し、あなたはまた、プラグインをカスタマイズすることができます。例えばターゲットホストに接続するための接続プラグ。

  • プレイブック:「スクリプト」、統一された外部コールのために定義されたタスクのモジュラーシリーズ。Ansibleコア機能。

1.2ホストのリスト

 

サービス ホスト名 IPアドレス
サーバー 主人 192.168.116.129
クライアント ノード1 192.168.116.130
クライアント ノード2 192.168.116.131

 

コマンドラインを使用して1.3

アドホックコマンド入力は、すぐにアクションを実行しますが、記録を保持する必要はありません。

アドホックコマンドは、プレイブックが知る必要が学習する前に基礎とAnsibleを理解することです。

スクリプトの中で一般的には、Ansible実力の嘘。

1は、リモートホスト認証に接続します

ホストリストのディレクトリを設定します。/ etc / ansible

配置ホスト:VIMの/ etc / ansible /ホスト 

 

SSHのパスワード認証:[ホスト]リストの設定

[webservers]
192.168.116.130:22 ansible_ssh_user=root ansible_ssh_pass=’root’
192.168.116.131:22 ansible_ssh_user=root ansible_ssh_pass=’root’

SSH鍵認証:

ssh-keygen

ssh-copy-id [email protected]
[webservers]
192.168.116.130:22 ansible_ssh_user=root ansible_ssh_key=/root/.ssh/id_rsa 
192.168.116.131:22 ansible_ssh_user=root

 

Ansible.cfgは、設定ファイルで指定すること。

[defaults]
private_key_file = /root/.ssh/id_rsa  # 默认路径

かどうかの高速接続

ansible webservers -m ping -uroot -k

2、一般的に使用されるオプション

オプション 説明
-C、--check チェックを実行し、何もしません
-e EXTRA_VARS,--extra-vars=EXTRA_VARS 设置附加变量 key=value
-u REMOTE_USER, --user=REMOTE_USER SSH连接用户,默认None
-k, --ask-pass SSH连接用户密码
-b, --become 提权,默认root
-K, --ask-become-pass 提权密码


3、命令行使用

ansible all -m ping
ansible all -m shell -a "ls /root" -u root -k 
ansible webservers -m copy –a "src=/etc/hosts dest=/tmp/hosts"

1.4 常用模块

ansible-doc –l 查看所有模块

ansible-doc –s copy 查看模块文档

模块文档:https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

1、shell

- name: 将命令结果输出到指定文件
  shell: somescript.sh >> somelog.txt
- name: 切换目录执行命令
  shell:
    cmd: ls -l | grep log
    chdir: somedir/
- name: 编写脚本
  shell: |
      if [ 0 -eq 0 ]; then
         echo yes > /tmp/result
      else
         echo no > /tmp/result
      fi
  args:
    executable: /bin/bash
 ansible webservers -m shell -a "ls /root;df -h"

2、copy

将文件复制到远程主机。

- name: 拷贝文件
  copy:
    src: /srv/myfiles/foo.conf
    dest: /etc/foo.conf
    owner: foo
    group: foo
    mode: u=rw,g=r,o=r
    # mode: u+rw,g-wx,o-rwx
    # mode: '0644'
    backup: yes

3、file

管理文件和文件属性。

- name: 创建目录
  file:
    path: /etc/some_directory
    state: directory
    mode: '0755'
- name: 删除文件
  file:
    path: /etc/foo.txt
    state: absent
- name: 递归删除目录
  file:
    path: /etc/foo
    state: absent

present,latest:表示安装

absent:表示卸载

4、yum

软件包管理。

- name: 安装最新版apache
  yum:
    name: httpd
    state: latest
- name: 安装列表中所有包
  yum:
    name:
      - nginx
      - postgresql
      - postgresql-server
    state: present
- name: 卸载apache包
  yum:
    name: httpd
    state: absent 
- name: 更新所有包
  yum:
    name: '*'
    state: latest
- name: 安装nginx来自远程repo
  yum:
    name: http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.14.0-1.el7_4.ngx.x86_64.rpm
    # name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    state: present

5、service/systemd

管理服务。

- name: 服务管理
  service:
    name: etcd
    state: started
    #state: stopped
    #state: restarted
    #state: reloaded
- name: 设置开机启动
  service:
    name: httpd
    enabled: yes
- name: 服务管理  
  systemd: 
	name=etcd 
	state=restarted 
	enabled=yes 
	daemon_reload=yes

6、unarchive

- name: 解压
  unarchive: 
    src=test.tar.gz 
    dest=/tmp

7、debug

执行过程中打印语句。

- debug:
    msg: System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}

- name: 显示主机已知的所有变量
  debug:
    var: hostvars[inventory_hostname]
    verbosity: 4

1.5 Playbook

Playbooks是Ansible的配置,部署和编排语言。他们可以描述您希望在远程机器做哪些事或者描述IT流程中一系列步骤。使用易读的YAML格式组织Playbook文件。

如果Ansible模块是您工作中的工具,那么Playbook就是您的使用说明书,而您的主机资产文件就是您的原材料。

与adhoc任务执行模式相比,Playbooks使用ansible是一种完全不同的方式,并且功能特别强大。

https://docs.ansible.com/ansible/latest/user_guide/playbooks.html

---
- hosts: webservers
  vars:
    http_port: 80
    server_name: www.ctnrs.com
  remote_user: root
  gather_facts: false
  tasks:
  - name: 安装nginx最新版
    yum: pkg=nginx state=latest
  - name: 写入nginx配置文件
    template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf
    notify:
    - restart nginx
  - name: 确保nginx正在运行
    service: name=httpd state=started
  handlers:
    - name: restart nginx
      service: name=nginx state=reloaded

1、主机和用户

- hosts: webservers
  remote_user: lizhenliang
  become: yes
  become_user: root
ansible-playbook nginx.yaml -u lizhenliang -k -b -K

2、定义变量

变量是应用于多个主机的便捷方式; 实际在主机执行之前,变量会对每个主机添加,然后在执行中引用

  • 命令行传递

    -e VAR=VALUE
  • 主机变量与组变量

在Inventory中定义变量。

[webservers]
192.168.1.100 ansible_ssh_user=root hostname=web1
192.168.1.100 ansible_ssh_user=root hostname=web2
​
[webservers:vars]
ansible_ssh_user=root hostname=web1
  • 单文件存储

Ansible中的首选做法是不将变量存储在Inventory中。

除了将变量直接存储在Inventory文件之外,主机和组变量还可以存储在相对于Inventory文件的单个文件中。

组变量:

group_vars 存放的是组变量

group_vars/all.yml 表示所有主机有效,等同于[all:vars]

grous_vars/etcd.yml 表示etcd组主机有效,等同于[etcd:vars]

 
  • 在Playbook中定义

- hosts: webservers
  vars:
    http_port: 80
    server_name: www.ctnrs.com
  • Register变量

- shell: /usr/bin/uptime
  register: result
- debug:
    var: result

3、任务列表

 

每个play包含一系列任务。这些任务按照顺序执行,在play中,所有主机都会执行相同的任务指令。play目的是将选择的主机映射到任务。

 tasks:
  - name: 安装nginx最新版
    yum: pkg=nginx state=latest

4、语法检查与调试

语法检查:ansible-playbook --check /path/to/playbook.yaml

测试运行,不实际操作:ansible-playbook -C /path/to/playbook.yaml

debug模块在执行期间打印语句,对于调试变量或表达式,而不必停止play。与'when:'指令一起调试更佳。

 - debug: msg={{group_names}}
  - name: 主机名
    debug:
      msg: "{{inventory_hostname}}"

5、任务控制

如果你有一个大的剧本,那么能够在不运行整个剧本的情况下运行特定部分可能会很有用。

  tasks:
  - name: 安装nginx最新版
    yum: pkg=nginx state=latest
    tags: install
  - name: 写入nginx配置文件
    template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf
    tags: config

使用:

ansible-playbook example.yml --tags "install"
ansible-playbook example.yml --tags "install,config"
ansible-playbook example.yml --skip-tags "install"

6、流程控制

条件:

tasks:
- name: 只在192.168.1.100运行任务
  debug: msg="{{ansible_default_ipv4.address}}"
  when: ansible_default_ipv4.address == '192.168.1.100'

循环:

tasks:
- name: 批量创建用户
  user: name={{ item }} state=present groups=wheel
  with_items:
     - testuser1
     - testuser2
- name: 解压
  copy: src={{ item }} dest=/tmp
  with_fileglob:
    - "*.txt"

常用循环语句:

语句 描述
with_items 标准循环
with_fileglob 遍历目录文件
with_dict 遍历字典

7、模板

vars:
    domain: "www.ctnrs.com"
 tasks:
  - name: 写入nginx配置文件
    template: src=/srv/server.j2 dest=/etc/nginx/conf.d/server.conf
# server.j2
{% set domain_name = domain %}
server {
   listen 80;
   server_name {{ domain_name }};
   location / {
        root /usr/share/html;
   }
}

在jinja里使用ansible变量直接 {{ }}引用。使用ansible变量赋值jinja变量不用{{ }}引用。

定义变量

{% set local_ip = inventory_hostname %}

条件和循环

{% set list=['one', 'two', 'three'] %}
{% for i in list %}
    {% if i == 'two' %}
        -> two
    {% elif loop.index == 3 %}
        -> 3
    {% else %}
        {{i}}
    {% endif %}
{% endfor %}

例如:生成连接etcd字符串

{% for host in groups['etcd'] %}
    https://{{ hostvars[host].inventory_hostname }}:2379
    {% if not loop.last %},{% endif %}
{% endfor %} 

里面也可以用ansible的变量。

1.6 Roles

Roles是基于已知文件结构自动加载某些变量文件,任务和处理程序的方法。按角色对内容进行分组,适合构建复杂的部署环境。

1、定义Roles

Roles目录结构:

site.yml
webservers.yml
fooservers.yml
roles/
   common/
     tasks/
     handlers/
     files/
     templates/
     vars/
     defaults/
     meta/
   webservers/
     tasks/
     defaults/
     meta/
  • tasks -包含角色要执行的任务的主要列表。

  • handlers -包含处理程序,此角色甚至在此角色之外的任何地方都可以使用这些处理程序。

  • defaults-角色的默认变量

  • vars-角色的其他变量

  • files -包含可以通过此角色部署的文件。

  • templates -包含可以通过此角色部署的模板。

  • meta-为此角色定义一些元数据。请参阅下面的更多细节。

 

通常的做法是从tasks/main.yml文件中包含特定于平台的任务:

# roles/webservers/tasks/main.yml
- name: added in 2.4, previously you used 'include'
  import_tasks: redhat.yml
  when: ansible_facts['os_family']|lower == 'redhat'
- import_tasks: debian.yml
  when: ansible_facts['os_family']|lower == 'debian'
​
# roles/webservers/tasks/redhat.yml
- yum:
    name: "httpd"
    state: present
​
# roles/webservers/tasks/debian.yml
- apt:
    name: "apache2"
    state: present

2、使用角色

# site.yml
- hosts: webservers
  roles:
    - common
    - webservers
定义多个:
- name: 0
  gather_facts: false
  hosts: all 
  roles:
    - common
​
- name: 1
  gather_facts: false
  hosts: all 
  roles:
    - webservers

3、角色控制

- name: 0.系统初始化
  gather_facts: false
  hosts: all 
  roles:
    - common
  tags: common 

 

发布了171 篇原创文章 · 获赞 39 · 访问量 5万+

おすすめ

転載: blog.csdn.net/heian_99/article/details/104069075