ããã¯ãOpenshift Originã§ã®ãœãããŠã§ã¢è£œåã®èªåãã¹ãã«é¢ããäžé£ã®3ã€ã®èšäºïŒ æåã®èšäº ã 3çªç®ã®èšäº ïŒã®ç¶ãã§ãã ãã®èšäºã§ã¯ãOpenshiftã®äž»èŠãªãªããžã§ã¯ãã«ã€ããŠèª¬æããã¯ã©ã¹ã¿ãŒæäœã®åçã«ã€ããŠã説æããŸãã ããã¯éåžžã«æéã®ãããäœæ¥ã§ããããã®èšäºã®ç¯å²å€ã§ãããããæå³çã«ãã¹ãŠã®å¯èœãªãªããžã§ã¯ããšãã®æ©èœã説æããããšã¯ããŸããã
ã¯ã©ã¹ã¿ãŒïŒ
äžè¬ã«ãOpenshift Originã¯ã©ã¹ã¿ãŒã¯ä»ã®ãœãªã¥ãŒã·ã§ã³ãšããã»ã©éãã¯ãããŸããã çä¿¡ã¿ã¹ã¯ã¯ãã¯ãŒã¯ããŒãã«åºã¥ããŠäœæ¥ããŒãéã§åæ£ãããã¹ã±ãžã¥ãŒã©ããã®åæ£ãåŠçããŸãã
ã³ã³ãããŒãå®è¡ããã«ã¯ãå éšãŸãã¯å€éšã¬ãžã¹ã¿ãŒããããŒãã§ããDockerã€ã¡ãŒãžãå¿ èŠã§ãã ã³ã³ããã®çŽæ¥èµ·åã¯ãããŸããŸãªã»ãã¥ãªãã£ã³ã³ããã¹ã ïŒããŸããŸãªãªãœãŒã¹ãžã®ã³ã³ããã¢ã¯ã»ã¹ãå¶éããã»ãã¥ãªãã£ããªã·ãŒïŒã§çºçããŸãã
ããã©ã«ãã§ã¯ãç°ãªããããžã§ã¯ãã®ã³ã³ããã¯ã ãªãŒããŒã¬ã€ãããã¯ãŒã¯ã䜿çšããŠçžäºã«éä¿¡ã§ããŸã ïŒ1ã€ã®å€§ããªãµãããããå²ãåœãŠãããã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®äœæ¥ããŒãã®å°ããªãµããããã«åå²ãããŸãïŒã äœæ¥ããŒãã§å®è¡ãããŠããã³ã³ããã«ã¯ããã®ããŒãã«å²ãåœãŠããããµããããããIPã¢ãã¬ã¹ãå²ãåœãŠãããŸãã ãªãŒããŒã¬ã€ãããã¯ãŒã¯èªäœã¯ãäœæ¥ããŒãéã®éä¿¡ã«VXLANã䜿çšããOpen vSwitchã«åºã¥ããŠæ§ç¯ãããŸãã
åäœæ¥ããŒãã§ãå°çšã®Dnsmasqã€ã³ã¹ã¿ã³ã¹ãèµ·åããããã¹ãŠã®DNSã³ã³ãããŒèŠæ±ãSkyDNSã«å éšãµãŒãã¹ãµããããã«ãªãã€ã¬ã¯ããããŸãã
ã³ã³ãããã¯ã©ãã·ã¥ããããåã«åæåã§ããªãå Žåãã³ã³ãããå±éããã¿ã¹ã¯ã¯å¥ã®äœæ¥ããŒãã«è»¢éãããŸãã
ããã¯æ³šç®ã«å€ããïŒ
SELinuxã¯å³å¯ãªã¯ã©ã¹ã¿ãŒç¶æ ã§ã¯ãããŸããã ãããç¡å¹ã«ãããšïŒ ã»ãã¥ãªãã£äžã®çç±ã§æšå¥šãããŸãã ïŒãã³ã³ãããæäœãããšãã«é床ãããããåäžããŸãïŒãŸããç£èŠãç¡å¹ã«ãªããŸãïŒã SELinuxãã³ã³ããå ã®ã¢ããªã±ãŒã·ã§ã³ã«å¹²æžããå Žåãã¯ã©ã¹ã¿ãŒã®äœæ¥ããŒãã«SELinuxäŸå€ãçŽæ¥è¿œå ããå¯èœæ§ããããŸãã
ããã©ã«ãã§ã¯ã LVM㯠Docker EngineãªããžããªãšããŠäœ¿çšãããŸãã ããã¯æéã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããããä»ã®çš®é¡ã®ã¹ãã¬ãŒãžïŒ BTRFSãªã©ïŒã䜿çšã§ããŸãã
ãµãŒãã¹ã®ååïŒãµãŒãã¹ãåç §ïŒã¯ãé·ããšæå¹ãªæåã®å¶éã䌎ãDNSåã§ããããšã«æ³šæããŠãã ããã
Dockerã€ã¡ãŒãžãã¢ã»ã³ãã«ããéã®æéãšããŒããŠã§ã¢ã³ã¹ããåæžããã«ã¯ããããããã¬ã€ã€ãŒããã¢ãããŒãïŒ Dockerã®ãã«ãã¹ããŒãž ïŒã䜿çšã§ããŸãã ãã®ã¢ãããŒãã§ã¯ãäºãã«è£å®ããåºæ¬ã€ã¡ãŒãžãšäžéã€ã¡ãŒãžã䜿çšããŸãã åºæ¬ã€ã¡ãŒãžãcentosïŒ7ãïŒå®å šã«æŽæ°æžã¿ïŒãäžéã€ã¡ãŒãžãcentosïŒ7-toolsãïŒã€ã³ã¹ããŒã«æžã¿ããŒã«ïŒãæçµã€ã¡ãŒãžãcentosïŒ7-appãïŒãcentosïŒ7ãããã³ãcentosïŒ7ãå«ããïŒ -tools "ïŒã ã€ãŸããä»ã®ã€ã¡ãŒãžã«åºã¥ãããã«ãã¿ã¹ã¯ãäœæã§ããŸãïŒBuildConfigãåç §ïŒã
Dockerã€ã¡ãŒãžã®ã¢ã»ã³ãã«ã®ã¿ãåŠçãããããã®ã€ã¡ãŒãžãä»ã®ãããžã§ã¯ãã«ãªã³ã¯ãããããžã§ã¯ãã1ã€ãããªãå Žåã¯ãååã«æè»ãªãœãªã¥ãŒã·ã§ã³ãã¢ãããŒãã§ãïŒImageStreamãåç §ïŒã ããã«ãããåãããžã§ã¯ãã§äžå¿ èŠãªãšã³ãã£ãã£ãçæããªãããã«ããããšãã§ããäœããã®çµ±äžã«ã€ãªãããŸãã
ã¯ã©ã¹ã¿ãŒå ã®ã»ãšãã©ã®ãªããžã§ã¯ãã«ã¯ä»»æã®ã©ãã«ãå²ãåœãŠãããšãã§ããŸãããããã®ã©ãã«ã䜿çšããŠããããã®ãªããžã§ã¯ãã«å¯ŸããŠäžæ¬æäœãå®è¡ã§ããŸãïŒããšãã°ããããžã§ã¯ãå ã®ç¹å®ã®ã³ã³ãããŒãåé€ããŸãïŒã
ã¢ããªã±ãŒã·ã§ã³ãLinuxã«ãŒãã«ã®ç¹å®ã®ã«ãŒãã«æ©èœãå¿ èŠãšããå Žåããã®ã¢ããªã±ãŒã·ã§ã³ãèµ·åããå¿ èŠããããã¹ãŠã®äœæ¥ããŒãã§ãã®ã¢ãžã¥ãŒã«ãããŠã³ããŒãããå¿ èŠããããŸãã
å€ãç»åãå¿ããããç°å¢ãããã«åé€ããå¿ èŠããããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒ/ oadm pruneã䜿çšããŠæåã®åé¡ã解決ããå Žåã2çªç®ã®åé¡ã¯ãOpenshift Originã§ã®ã³ã©ãã¬ãŒã·ã§ã³ã®ã«ãŒã«ã«é¢ãããã¹ãŠã®åå è ã®èª¿æ»ãšç¿çãå¿ èŠã§ãã
ã¯ã©ã¹ã¿ãŒã¯ãªãœãŒã¹ã«ãã£ãŠå¶éããããããå°ãªããšãäœæ¥ããŒãã®ã¬ãã«ã§ç£èŠãç·šæããããšãéåžžã«æãŸããã§ãïŒã³ã³ãããŒå ã®ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ã®ç£èŠã¯å¯èœã§ãïŒã ããã¯ãæ¢è£œã®Openshift Metricsãœãªã¥ãŒã·ã§ã³ãšãµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ïŒ Sysdigãªã©ïŒã®äž¡æ¹ã䜿çšããŠå®è¡ã§ããŸãã ã¯ã©ã¹ã¿ãŒè² è·ã¡ããªãã¯ãååšããå ŽåïŒå šäœãšããŠããŸãã¯èšèšäžïŒãçä¿¡ã¿ã¹ã¯ã®æè»ãªã¹ã±ãžã¥ãŒãªã³ã°ãç·šæã§ããŸãã
ç¹ã«ãäœæ¥ããŒããåçã«åæåã§ããããšãã€ãŸããæ¢åã®IaaSæœèšã§Openshift Originã¯ã©ã¹ã¿ãŒãæ¡åŒµã§ããããšã«æ³šæããŠãã ããã ã€ãŸãããã¬ãªãªãŒã¹ãã¹ãäžã«ã容éãå€§å¹ ã«æ¡åŒµãããã¹ãæéãççž®ã§ããŸãã
ãªããžã§ã¯ãïŒ
ãããžã§ã¯ã -ãªããžã§ã¯ãã¯Kubernetesåå空éã§ãã ä»ã®ãªããžã§ã¯ããå«ãæœè±¡åã®æäžäœã¬ãã«ã ãããžã§ã¯ãã§äœæããããªããžã§ã¯ãã¯ãä»ã®ãããžã§ã¯ãã®ãªããžã§ã¯ããšäº€å·®ããŸããã ãããžã§ã¯ãã«ã¯ãã¯ã©ãŒã¿ãç¹æš©ãã¯ã©ã¹ã¿ãŒããŒãã®ã©ãã«ãªã©ãèšå®ã§ããŸãã ãããžã§ã¯ãéã«ãã¹ããããéå±€ãç¶æ¿ã¯ãªããããã©ãããªããããžã§ã¯ãæ§é ãå©çšå¯èœã§ãã ã¯ã©ã¹ã¿ãŒã®æ£åžžãªæ©èœã®ããã«èšèšãããããã€ãã®ã·ã¹ãã ãããžã§ã¯ãïŒkube-systemãopenshiftãopenshift-infraïŒããããŸãã
æ°ãããããžã§ã¯ãã®äœæïŒ
oc adm new-project project1 --node-selector='node_type=minion'
ãããžã§ã¯ãèšå®ã®ç·šéïŒ
oc edit namespace project1
# Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 kind: Namespace metadata: annotations: openshift.io/description: "" openshift.io/display-name: "" openshift.io/node-selector: node_type=minion ...
Podã¯æ±ºå®çãªèŠå ã®1ã€ã«ãªã£ããªããžã§ã¯ãã§ããããã«ãããã³ã³ããå ã§ä»»æã®ã³ãã³ããïŒç¹å¥ãªããã¯ã ãã§ãªãïŒäœ¿çšããŠå®è¡ã§ããããã«ãªããŸãã ãããã¯ãã¯ã©ã¹ã¿ãŒå ã®äž»èŠãªäœæ¥åäœã§ãã ã¯ã©ã¹ã¿ã§å®è¡ãããŠããã³ã³ããã¯ãã¹ãŠãããã§ãã åºæ¬çã«ããããã®ã³ã³ããã®åãããŒã ã¹ããŒã¹ïŒãããã¯ãŒã¯ãipcãutsãcgroupïŒã§åäœãã1ã€ä»¥äžã®ã³ã³ããã®ã°ã«ãŒãã¯ãå ±éã®ããŒã¿ã¹ãã¬ãŒãžã§ããã·ãŒã¯ã¬ããã䜿çšããŸãã Podãæ§æããã³ã³ãããŒã¯åžžã«åãã¯ã©ã¹ã¿ãŒããŒãã§å®è¡ããããã¹ãŠã®ããŒãã«åçã«é åãããŸããïŒPodã10åã®ã³ã³ãããŒã§æ§æãããŠããå Žåã10åãã¹ãŠãåãããŒãã§åäœããŸãïŒã
ãããïŒ
apiVersion: "v1" kind: "Pod" metadata: name: "nginx-redis" spec: containers: - name: "nginx" image: "nginx:latest" - name: "redis" image: "redis:latest"
ãããã¹ããŒã¿ã¹ïŒ
NAME READY STATUS RESTARTS AGE nginx-redis 2/2 Running 0 7s
ã·ãŒã¯ã¬ãã -Podã®æ©å¯æ å ±ïŒetcdã«ã¯ãªã¢ããã¹ãã§ä¿åïŒ Kubernetes 1.7ã®æå·åãµããŒã ïŒïŒã転éããããã«èšèšãããè¡ãŸãã¯ãã¡ã€ã«ã§ãã 1ã€ã®ã·ãŒã¯ã¬ããã«ã¯å€ãã®å€ãå«ããããšãã§ããŸãã
ç§å¯ã®äœæïŒ
oc secrets new gitconfig .gitconfig=/home/user/.gitconfig
BuildConfigã§ã·ãŒã¯ã¬ããã䜿çšïŒ
apiVersion: "v1" kind: "BuildConfig" metadata: name: "nginx-bc" spec: source: type: "Git" git: uri: "https://github.com/username/nginx.git" sourceSecret: name: "gitconfig" strategy: type: "Docker" dockerStrategy: dockerfilePath: docker/nginx-custom noCache: true output: to: kind: "ImageStreamTag" name: "nginx-custom:latest"
ServiceAccountã¯ãã¯ã©ã¹ã¿ãŒãªãœãŒã¹ãšå¯Ÿè©±ããããã«èšèšãããç¹å¥ãªã¿ã€ãã®ãªããžã§ã¯ãã§ãã ãã®äžå¿ã¯ãã·ã¹ãã ãŠãŒã¶ãŒã§ãã
ããã©ã«ãã§ã¯ãæ°ãããããžã§ã¯ãã«ã¯3ã€ã®ServiceAccountãå«ãŸããŠããŸãã
- builder-Dockerã€ã¡ãŒãžããã«ãããã¬ãžã¹ã¿ãŒã«ã¢ããããŒãããŸãïŒBuildConfigãåç §ïŒã
- deployer-å±éã¿ã¹ã¯ã¯ãã®ã¢ã«ãŠã³ãããèµ·åãããŸãïŒDeploymentConfigãåç §ïŒã
- ããã©ã«ã-ä»ã®ãã¹ãŠã®ãããïŒå±éã¿ã¹ã¯ã«é¢é£ããªãïŒã¯ããã®ã¢ã«ãŠã³ãããèµ·åãããŸãã
ãªã¹ãããããµãŒãã¹ã¢ã«ãŠã³ãïŒ
- ã¯ã©ã¹ã¿ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ã«äœ¿çšãããèªåçæãããã·ãŒã¯ã¬ãããå«ãŸããŸãã
- ã¯ã©ã¹ã¿ãŒå ã§ç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããããã«ãã圹å²ããããŸãã
ServiceAccountïŒ
apiVersion: "v1" kind: "ServiceAccount" metadata: name: "jenkins"
ServiceAccountããããã£ïŒ
Name: jenkins Namespace: project1 Labels: <none> Image pull secrets: jenkins-dockercfg-pvgsr Mountable secrets: jenkins-dockercfg-pvgsr jenkins-token-p8bwz Tokens: jenkins-token-p8bwz jenkins-token-zsn9p
ServiceAccountãããžã§ã¯ã管çè æš©éã®è¿œå ïŒ
oc policy add-role-to-user admin system:serviceaccount:project1:jenkins
DeploymentConfigã¯åãPodã§åäœãããªããžã§ã¯ãã§ãããåæã«å®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ããµã€ã¯ã«ã管çããããã®å€ãã®è¿œå ã¡ã«ããºã ãå°å ¥ããŸãã
- å±éæŠç¥ãã€ãŸã æ°ããããŒãžã§ã³ããªãªãŒã¹ããããšãã«ã¢ããªã±ãŒã·ã§ã³ãæŽæ°ãããé害ãçºçããå Žåã«äœæ¥ããŒãžã§ã³ãžã®ããŒã«ããã¯ãè¡ãããŸãã
- æ§æã®åå±éãããªã¬ãŒããããªã¬ãŒãèšå®ã§ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ã¿ã³ã¹/ã¬ããªã«ã®æ°ãæå®ã§ããŸãã
DeploymentConfigïŒ
apiVersion: "v1" kind: "DeploymentConfig" metadata: name: "nginx-dc" spec: template: metadata: labels: name: "nginx-dc" spec: containers: - name: "nginx" image: "nginx:latest" replicas: 3 selector: name: "nginx-dc"
DeploymentConfigã¹ããŒã¿ã¹ïŒ
NAME READY STATUS RESTARTS AGE nginx-dc-1-1wl8m 1/1 Running 0 7s nginx-dc-1-k3mss 1/1 Running 0 7s nginx-dc-1-t8qf3 1/1 Running 0 7s
ImageStream-æ¬è³ªçã«ãImage DockerãŸãã¯ä»ã®ImageStreamãæãããªã³ã¯ãïŒImageStreamTagïŒã®ãã³ã³ãããã§ãã
ImageStreamïŒ
apiVersion: "v1" kind: "ImageStream" metadata: name: "third-party"
ãããžã§ã¯ãéã®Dockerã€ã¡ãŒãžãžã®ã¿ã°/ãªã³ã¯ã®äœæïŒ
oc tag project2/app:v1 project1/third-party:app
Dockerããã«ããDockerã€ã¡ãŒãžãžã®ã¿ã°/ãªã³ã¯ãäœæããŸãã
oc tag --source=docker nginx:latest project1/third-party:nginx
BuildConfig-ãªããžã§ã¯ãã¯ãDockerã€ã¡ãŒãžãã©ã®ããã«çµã¿ç«ãŠãããã©ãã«é 眮ããããã®ã·ããªãªã§ãã æ°ããç»åã®çµã¿ç«ãŠã¯ä»ã®ç»åã«åºã¥ããŠè¡ãããšãã§ãããfromïŒãã»ã¯ã·ã§ã³ããããæ åœããŸã
ã¢ã»ã³ããªã®ãœãŒã¹ïŒã¢ã»ã³ããªã®ãœãŒã¹ããŒã¿ãããå ŽæïŒïŒ
- ãã€ããª
- Dockerfile
- Git
- ç»å
- å ¥åã·ãŒã¯ã¬ãã
- å€éšã¢ãŒãã£ãã¡ã¯ã
æŠç¥ã®æ§ç¯ïŒããŒã¿ãœãŒã¹ã®è§£éæ¹æ³ïŒïŒ
- ã«ã¹ã¿ã
- Docker
- ãã€ãã©ã€ã³
- S2I
ã¢ã»ã³ããªã®ç®çïŒã¢ã»ã³ããªãããã€ã¡ãŒãžãã¢ããããŒããããå ŽæïŒïŒ
- DockerImage
- ImageStreamTag
BuildConfigïŒ
apiVersion: "v1" kind: "BuildConfig" metadata: name: "nginx-bc" spec: source: type: "Git" git: uri: "https://github.com/username/nginx.git" strategy: type: "Docker" dockerStrategy: from: kind: "ImageStreamTag" name: "nginx:latest" dockerfilePath: docker/nginx-custom noCache: true output: to: kind: "ImageStreamTag" name: "nginx-custom:latest"
ãã®BuildConfigãå®è¡ããæäœïŒ
- ImageStream "nginxïŒlatest"ãåºç€ãšããŠ
- Gitãªããžããªã®ã¯ããŒã³ãäœæãããã®ãªããžããªã§docker / nginx-customãã¡ã€ã«ãèŠã€ããDockerfileãã¡ã€ã«ããåœä»€ãããŒããããããã®åœä»€ãåºæ¬ã€ã¡ãŒãžã§å®è¡ããŸãã
- çµæã®ã€ã¡ãŒãžã¯ãImageStreamã«ãnginx-customïŒlatestããé 眮ããŸã
ãµãŒãã¹ -ç°å¢ãèµ·åããã·ã¹ãã ãéžæããéã«æ±ºå®çãªèŠå ã®1ã€ã«ãªã£ããªããžã§ã¯ããç°å¢éã®éä¿¡ãæè»ã«æ§æã§ããããïŒãã¹ãã§ã¯éåžžã«éèŠã§ãïŒã ä»ã®ã·ã¹ãã ã䜿çšããå ŽåãIPã¢ãã¬ã¹ã®ç¯å²ã®å²ãåœãŠãDNSåã®ç»é²ã転éããŒããªã©ã®æºåæäœãå¿ èŠã§ããã ãªã© ãµãŒãã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ãå®éã«ãããã€ããåã«å®£èšã§ããŸãã
ãµãŒãã¹ããããžã§ã¯ãã§å ¬éããããšã©ããªããŸããïŒ
- ãµãŒãã¹ã®å ŽåãIPã¢ãã¬ã¹ã¯ç¹å¥ãªãµãŒãã¹ãµããããããå²ãåœãŠãããŸãã
- ãã®ãµãŒãã¹ã®DNSåãç»é²ãããŠããŸãã ãµãŒãã¹ã®å ¬éã®ååŸã«èµ·åããããããžã§ã¯ãå ã®ãã¹ãŠã®Podã¯ããã®DNSåã解決ã§ããŸãã
- ãµãŒãã¹ãå ¬éãããåŸã«èµ·åããããããžã§ã¯ãå ã®ãã¹ãŠã®ãããã¯ãå ¬éããããµãŒãã¹ã®IPã¢ãã¬ã¹ãšããŒããå«ãç°å¢å€æ°ã®ãªã¹ããåãåããŸãã
ãµãŒãã¹ïŒ
apiVersion: v1 kind: Service metadata: name: "nginx-svc" spec: selector: name: "nginx-pod" ports: - port: 80 targetPort: 80 name: "http" - port: 443 targetPort: 443 name: "https"
DNSåå解決ïŒ
root@nginx-pod:/# ping nginx-svc PING nginx-svc.myproject.svc.cluster.local (172.30.217.250) 56(84) bytes of data.
ç°å¢å€æ°ïŒ
root@nginx-pod:/# env | grep -i nginx NGINX_SVC_PORT_443_TCP_ADDR=172.30.217.250 HOSTNAME=nginx-pod NGINX_VERSION=1.13.1-1~stretch NGINX_SVC_PORT_80_TCP_PORT=80 NGINX_SVC_PORT_80_TCP_ADDR=172.30.217.250 NGINX_SVC_SERVICE_PORT=80 NGINX_SVC_PORT_80_TCP_PROTO=tcp NGINX_SVC_PORT_443_TCP=tcp://172.30.217.250:443 NGINX_SVC_SERVICE_HOST=172.30.217.250 NGINX_SVC_PORT_443_TCP_PROTO=tcp NGINX_SVC_SERVICE_PORT_HTTPS=443 NGINX_SVC_PORT_443_TCP_PORT=443 NGINX_SVC_PORT=tcp://172.30.217.250:80 NGINX_SVC_SERVICE_PORT_HTTP=80 NGINX_SVC_PORT_80_TCP=tcp://172.30.217.250:80
çµè«ïŒ
ãã¹ãŠã®ã¯ã©ã¹ã¿ãŒãªããžã§ã¯ãã¯YAMLã䜿çšããŠèšè¿°ã§ããŸããããã«ãããOpenshift Originã§çºçããããã»ã¹ãå®å šã«èªååã§ããŸãã ã¯ã©ã¹ã¿ã§ã®äœæ¥ã®å šäœçãªé£ããã¯ãäœæ¥ã®ååãšãªããžã§ã¯ãã®çžäºäœçšã®ã¡ã«ããºã ã®ç¥èã«ãããŸãã æ°ããäœæ¥ããŒãã®åæåãªã©ã®æ¥åžžçãªæäœã¯ãAnsibleã¹ã¯ãªããã䜿çšããŸãã Accessibility APIã¯ã仲ä»è ãªãã§ã¯ã©ã¹ã¿ãŒãçŽæ¥æäœããæ©äŒãéããŸãã